PDA

View Full Version : Endre liste i Lisp


Post-IT
7. oktober 2007, 12:56
Hei!

Jeg lurte på om noen har en god metode for å endre en liste med tall til å bli ett tall sammensatt av alle elementene i lista?

Eksempel: (listefikser '(1 2 3 4)) --> 1234

Takker for svar!

brgr
7. oktober 2007, 13:48
I VB kan dette gjøres slik:
Men såg i ettertid at det var i Lisp du ville det..

Test.txt:
1 2 3 4 5 6 7
1 23 34 5 6 7
2 4 5 6 8
6 7 9 90 2

Fikser.vbs

Function FiksLinje(input)
input = Trim(input)
input = Replace(input, " ", "")
FiksLinje = input
End Function


Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFile("test.txt")
fs.CreateTextFile("resultat.txt")
Set nf = fs.GetFile("resultat.txt")
Set fStream = f.OpenAsTextStream(1)
Set nfStream = nf.OpenAsTextStream(2)
Do Until fStream.AtEndOfStream
Dim linje
linje = fStream.ReadLine()
nfStream.WriteLine(FiksLinje(linje))
Loop
nfStream.Close()
fStream.Close()
Set nfStream = nothing
Set fStream = Nothing
Set f = Nothing
Set nf = Nothing
Set fs = Nothing


Gir resultatet:
resultat.txt

1234567
12334567
24568
679902

Vanter
8. oktober 2007, 13:19
Ville tatt ett element i listen av gangen, hvis det ikke var det siste tallet i listen, gang med 10, og kall funksjonen rekursivt med resten av listen.

Vet ikke hva slags lisp du benytter, men ville blitt noe ala dette:

function parseInt (i, h :: nil ) = ((i * 10) + h)
| parseInt (i, h :: t ) = parseInt((i * 10) + h, t);


En ting du må huske på er at du sikkert må konvertere tegn i listen til tall på egen hånd.


Dette minner mistenkelig mye om en programmeringsoppgave, og vil sterkt anbefale deg å jobbe mye med dette så du skjønner det, hvis ikke kan det være du sitter og denger hodet i pulten under eksamen ;)

Jaffe
21. oktober 2007, 22:13
Muligens litt sent, men her er en fungerende versjon i Scheme:


(define (list->number l)
(if (null? l) 0
(+ (* (expt 10 (- (length l) 1)) (car l))
(list->number (cdr l)))))


Bør ikke være noe problem å porte denne til f.eks. Common Lisp, eller skrive den om til å utvikle en iterativ prosess.