Search for a Welsh word
Cegin, n. a kitchen
Cariad, n. love; a lover
Diolch, n. thanks; praise: v. to give thanks
Draig, n. dragon; lightning
Yma, adv. here, in this place
Search for an English word
Cegin, n. a kitchen
Baban, n. a babe, baby
Coflaid, n. what is embraced; a bosom friend; a darling
Arlas, a. tipped with blue
Anesgud, a. not quick, slow
I found an online download of a Welsh-->English dictionary on Gutenberg. There are plenty of online services such as Google Translate, but I wanted the fun of programming it myself.
The one I found is old and idiosyncratic. It has 50000+ words. ( and preamble and statement of conditions-of-use which can be stripped off if not putting that version on the 'net.)
It's structure is.. Welsh word with initial capital letter, comma, English equivalent, followed by TWO CRLF pairs. e.g.
"Gwaladru, to arrange, to order<CRLF><CRLF>"
This is pretty easy to read in LB. The problem is how to use it!
My initial thoughts involved sparse arrays and binary chops to locate words, hashing, and other ways to get the data quickly. Would involve quite a lot of coding and not necessarily fast or efficient.
Even finding the FIRST word took a minute and a half!
See this code and graph of how "word$(" gets catastrophically slow on big strings and how to get round it.
global N: N =1000 ' Use >=1000 but beware!!
[again]
open "numbers1to"; str$( N); ".crlf" for output as #fOut
for i =1 to N
#fOut "John_"; str$( i)
next i
close #fOut
open "numbers1to"; str$( N); ".crlf" for input as #fIn
longString$ =input$( #fIn, lof( #fIn))
close #fIn
print "": print ""
print "Showing the time to find n'th term in a LONG string of "; N' " terms."
print "John_1//John_2//.... . . . John_N, but with separators CRLF."
print ""
time =time$( "ms")
print data$( longString$, 1),: print time$( "ms") -time; " ms."
print data$( longString$, 9),: print time$( "ms") -time; " ms."
print data$( longString$, 99),: print time$( "ms") -time; " ms."
print data$( longString$, 999),: print time$( "ms") -time; " ms."
print data$( longString$, N),: print time$( "ms") -time; " ms."
print"": print "Now using LB's flawed word$() function."
print ""
CRLF$ =chr$( 13) +chr$( 10)
time =time$( "ms")
print word$( longString$, 1, CRLF$),: print time$( "ms") -time; " ms."
print word$( longString$, 9, CRLF$),: print time$( "ms") -time; " ms."
print word$( longString$, 99, CRLF$),: print time$( "ms") -time; " ms."
print word$( longString$, 999, CRLF$),: print time$( "ms") -time; " ms."
print word$( longString$, N, CRLF$),: print time$( "ms") -time; " ms."
N =N *2
if N >40000 then print "Done.": end
goto [again]
end
function data$( i$, n)
open "numbers1to"; str$( N); ".crlf" for input as #fIn
longString$ =input$( #fIn, L)
for i =1 to n
input #fIn, data$
next i
close #fIn
end function
What is really needed is a content-addressable structure- otherwise you have to read the original file sequentially ( or its entries stored in an array) until you find a matching term. SLOW!
Luckily "instr(" does not suffer the same coding problem. It took only a short time to throw together the following code. Welsh to English is easy. Use "instr(" to find the word. Print the rest of that entry as the English equivalent. English to Welsh is harder. Look for the English with "instr(". Work back to a capital letter which will be the start of the Welsh equivalent. Print from there to the comma.
This is NOT a perfect forward/reverse dictionary. For instance looking for English 'blue' gets me 'Arlas' rather than 'las'. And Welsh has a lot of 'mutations'- vowel changes and masculine.feminine distinctions.
Fun anyway!
LB code ( needs the dictionary file)
open "cymraeg.txt" for input as #fIn
dict$ =input$( #fIn, lof( #fIn))
close #fIn
print " Search for a Welsh word"' forward look-up of Welsh word
data "Cegin", "Cariad", "Diolch", "Draig", "Yma"
for c =1 to 5
read w$
i =instr( dict$, w$ +",")
if i <>0 then print, upto$( mid$( dict$, i, 50), chr$( 13) +chr$( 10))
next c
print "": print " Search for an English word"' backward look up of English
data "kitchen", "baby", "darling", "blue", "house"
for c =1 to 5
read E$
i =instr( dict$, " " +E$)
if i <>0 then
j =i
do
j =j -1
m$ =mid$( dict$, j, 1)
loop until instr( "ABCDEFGHIJKLMNOPQRSTUVWXYZ", m$)
entry$ =mid$( dict$, j, i -j +len( E$) +1)
print, entry$
end if
next c
end