2016-04-24 5 views
2

bei Stretch the word Um zu spielen, habe ich die folgenden Worte definiert, um zu versuchen, das Problem durch das gleiche Verfahren wie this answer zu arbeiten:Wörter und Zitat Scoping Stretching

USING: kernel math sequences sequences.repeating ; 
IN: stretch-words 

! "bonobo" -> { "b" "bo" "bon" "bono" "bonob" "bonobo" } 
: ascend-string (string -- ascending-seqs) 
    dup length 1 + iota [ 0 swap pick subseq ] map 
    [ "" = not ] filter nip ; 

! expected: "bonobo" -> "bonoobbooo" 
! actual: "bonobo" -> "bbbooonnnooobbbooo" 
: stretch-word (string -- stretched) 
    dup ascend-string swap zip 
    [ 
     dup first swap last 
     [ = ] curry [ dup ] dip count 
     repeat 
    ] map last ; 

stretch-word soll ein Zeichen in wiederholen eine Zeichenkette nach der Häufigkeit, mit der sie bis zu dieser Position in der Zeichenkette angezeigt wird. Jedoch wiederholt sich meine Implementierung alle Instanzen des 1string es wird.

Ich habe das Gefühl, dass dies in Factor leicht implementierbar ist, aber ich kann es nicht ganz herausfinden. Wie mache ich das, was ich will?

Antwort

2

Hm ... kein großes Golf, aber es funktioniert ...

Zuerst machte ich eine kleine Änderung ascend-string so die Zeichenfolge auf dem Stapel Blätter:

: ascend-string (string -- string ascending-seqs) 
    dup length 1 + iota [ 0 swap pick subseq ] map 
    [ "" = not ] filter ; 

So stretch-word kann wie folgt funktionieren:

: stretch-word (string -- stretched) 
    ascend-string zip   ! just zip them in the same order 
    [ 
     first2 over    ! first2 is the only golf I could make :/ 
     [ = ] curry count  ! same thing 
     swap <array> >string ! make an array of char size count and make it a string 
    ] map concat ;   ! so you have to join the pieces 

Edit: ich denke t Das Problem bestand darin, Wiederholungen zu verwenden, um den Job zu erledigen.

+0

süß sein könnte, danke! Ein frisches Augenpaar hilft immer. : D – cat

+1

kein Problem! Ich fühle immer noch, dass es nicht die beste Methode ist ... –

+1

@cat vielleicht, wenn Sie 'map-index' und' head * 'verwenden, um Untersequenzen auf jedem Kartenschritt zu machen, wären Sie besser? –

1
: ascend-string (string -- seqs) 
    "" [ suffix ] { } accumulate*-as ; 
: counts (string -- counts) 
    dup ascend-string [ indices length ] { } 2map-as ; 
: stretch-word (string -- stretched) 
    [ counts ] keep [ <string> ] { } 2map-as concat ; 
"bonobo" stretch-word print 
bonoobbooo 

indices length auch [ = ] with count

+0

Whoa, das ist wirklich cool! – cat