Avatar billede wampiro-uha Nybegynder
26. september 2003 - 19:35 Der er 31 kommentarer og
1 løsning

SML - fjern ord!

Jeg har en string med f.eks.:
"Otto er otte år gammel, og Otto har fem børn".

Her vil jeg gerne have lavet en function eller lign. som helst skal kører lineært, altså ikke rekursivt som erstatter Otto med stort bogstav med Hans.

Desuden vil jeg gerne have en function eller lign., som igen helst er lineær, som i en lign. tekst:

"Charlie sagde engang følgende >> Jeg er den bedste <<, men det var han ikke!"

Der skal alt udenom >> og << beholdes og det indeni skal msides væk.

Kan det lade sig gøre?

P.S. Hvis det ikke kan gøres lineært så bare rekursivt!
Avatar billede wampiro-uha Nybegynder
26. september 2003 - 19:47 #1
Sætter lidt flere point på højkant :-D
Avatar billede wampiro-uha Nybegynder
26. september 2003 - 19:48 #2
Hvis det er at der er en som laver begge functioner godt, så kan det godt være der kommer yderligere 50 point oveni ;-D
Avatar billede stigc Nybegynder
26. september 2003 - 19:57 #3
Ikke at jeg kan hjælpe, men er det ikke kun muligt at lave det rekursivt i ML?
Avatar billede wampiro-uha Nybegynder
26. september 2003 - 19:58 #4
Det er det jeg er lidt i tvivl om!
Men hvis det er det, så er det det. Og så er jeg fuldt tilfreds med en rekursiv løsning :-)
Avatar billede wampiro-uha Nybegynder
26. september 2003 - 20:33 #5
Kom så alle sammen, det er 200 point!

Og jeg er selv gået i stå, så jeg håber der er nogen som kan hjælpe!
Avatar billede stigc Nybegynder
26. september 2003 - 20:39 #6
:) Nok ikke det mest udbredte sprog....
Avatar billede stigc Nybegynder
26. september 2003 - 20:40 #7
Jeg fandt det her som er lige ved og næsten...
http://www-2.cs.cmu.edu/~fp/courses/98-212/recitations/F09-02.sml
Avatar billede wampiro-uha Nybegynder
26. september 2003 - 20:45 #8
Hmmm, nej desværre er det ikke så udbredt.
Jeg kan godt se at dit link er noget ala det jeg skal bruge, mit problem er bare jeg at skal lede efter én del i teksten og slette alt som kommer før det, og derefter når jeg så finder et andet tag så skal den slette alt som kommer efter det!

Og sådan noget lignende!
Avatar billede wampiro-uha Nybegynder
26. september 2003 - 20:52 #9
Nå jeg prøver dette:

fun replace _ _ "" = ""
  | replace x y str =
  let val head = String.sub (str, 0)
        val tail = String.substring (str, 1, String.size(str) - 1)
        tail' = replace x y tail
  in
        if head = x then String.str(y) ^ tail'
        else String.str(head) ^ tail'
  end;

replace "Otto" "Hans" "Otto er otte år gammel";

Så får jeg fejlen:

Type clash: expression of type
string
cannot have type
'a -> 'b
Avatar billede x-masman Nybegynder
26. september 2003 - 21:17 #10
2:

fun remove[] = []
  | remove [x] = []
  | remove x::x1::xs = if x = #"<" andalso x1 = #"<" then xs else remove(x1::xs);

fun behold[] = []
  | behold[x] = [x]
  | behold x::x1::xs = if x = #">" andalso x1 = #">" then fjern(remove(xs))
                      else x::fjern(x1::xs);

fun flyt(s) = String.implode(behold(String.explode(s)))
Avatar billede x-masman Nybegynder
26. september 2003 - 21:18 #11
Jeg kan ikke helt huske det men jeg mener det kan gøres sådan.
Avatar billede x-masman Nybegynder
26. september 2003 - 21:24 #12
Grunden til du får fejl i den første er at du bruge x som string mens du i funktionen bruger den som char
Avatar billede x-masman Nybegynder
26. september 2003 - 21:36 #13
fun førsteOrd(s) = let val c = String.sub(s, 0)
in
if c = #" " then "" else String.str(c) ^ førsteOrd(substring.string(string.substring(s,1,String.size(s) - 1))

fun replace _ _ "" = ""
  | replace x y s =
  let val head = førsteOrd(s)
        val tail = Substring.string(String.substring (s, String.size(førsteOrd(s), String.size(s) - 1))
      in
        if head = x then y ^ " " ^ replace(x,y,tail)
        else head ^ " " ^ replace(x,y,tail);
  end;
Avatar billede wampiro-uha Nybegynder
26. september 2003 - 21:40 #14
x-masman -->
Det ser rigtig godt ud, men når jeg prøver at kører din fun flyt(s) osv., så får jeg fejlen:

Ill placed infix in fun  clause

og den peger på :: i sætningen remove x :: x1 ::xs, hvor det er de første :: den peger på.

Hvis du forstår mig :-D
Avatar billede wampiro-uha Nybegynder
26. september 2003 - 21:41 #15
Er det noget med at jeg skal lave hele min string om til en masse lister? En liste for hvert tegn?
Avatar billede x-masman Nybegynder
26. september 2003 - 21:46 #16
på compile tidspunkt eller kører tidspunkt?
Avatar billede wampiro-uha Nybegynder
26. september 2003 - 21:46 #17
compile-tidspunkt!
Avatar billede wampiro-uha Nybegynder
26. september 2003 - 21:47 #18
Mit input er en string, det ved jeg ikke om er et problem?
Avatar billede x-masman Nybegynder
26. september 2003 - 21:49 #19
Altså det bedste ville være hvis vi kunne få en liste med ord adskilt af #" ". Men jeg kan ikke huske hvordan det gøres. Jeg mener det er noget med map eller noget.
Avatar billede wampiro-uha Nybegynder
26. september 2003 - 21:49 #20
Kommer der ikke også et problem senere hvor der bruges fjern (...
da fjern ikke er defineret?
Avatar billede x-masman Nybegynder
26. september 2003 - 21:50 #21
nej. det skulle gerne være en string, da den bliver exploded i flyt
Avatar billede x-masman Nybegynder
26. september 2003 - 21:51 #22
erstat fjern med behold :)
Avatar billede wampiro-uha Nybegynder
26. september 2003 - 21:54 #23
det er rigtig med fjern -> behold.

Men jeg kan stadig ikke få den til at køre.
Kommer hele tiden med fejlen Ill-placed infix in fun clause?
Avatar billede x-masman Nybegynder
26. september 2003 - 21:54 #24
hvilken :: peger den på? den første eller den anden`?
Avatar billede wampiro-uha Nybegynder
26. september 2003 - 21:56 #25
Den første, og det er i compile mode!

Jeg har prøvet for sjov at fjerne :: x1, men så peger den bare på :: som står før xs
Avatar billede wampiro-uha Nybegynder
26. september 2003 - 21:59 #26
Kan du få det til at virke hos dig?
Avatar billede x-masman Nybegynder
26. september 2003 - 22:01 #27
jeg sad ikke lige et sted hvir jeg kunne áfpræve det, så det var uden compile, men nu prøver jeg.
Avatar billede wampiro-uha Nybegynder
26. september 2003 - 22:02 #28
Ok... Det er utrolig lækkert du gider hænge ud :-)
Avatar billede x-masman Nybegynder
26. september 2003 - 22:04 #29
du skal bare sætte () omkring således (x::x1::xs), men der er nok en del andre småfejl
Avatar billede x-masman Nybegynder
26. september 2003 - 22:11 #30
ja, så virker det. Altså hvis du sætter () omkring x1::x2::xs
Avatar billede wampiro-uha Nybegynder
26. september 2003 - 22:25 #31
lækkert.
laver du ikk lige et svar!
Avatar billede x-masman Nybegynder
26. september 2003 - 22:26 #32
hvad med den anden? virker den?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester