Rakamları kaldır


72

Görev

Birlikte "daraltılmış" basamak adlarından oluşan bir dizi dize verilirse, şöyle:

zeronineoneoneeighttwoseventhreesixfourtwofive

Dize tekrar sayılara bölün:

zero nine one one eight two seven three six four two five

kurallar

  • Giriş her zaman bir dizedir. Her zaman, birlikte daraltılmış ve başka hiçbir şey olmayan bir veya daha fazla küçük İngilizce basamak adından oluşur.

    • İngilizce basamak isimleri zero one two three four five six seven eight nine.
  • Çıktı, dizelerin bir listesi veya rakamların alfabetik olmayan, boş olmayan dizeler tarafından sınırlandırıldığı yeni bir dize olabilir. (Çıktınız isteğe bağlı olarak başlangıçta veya sonunda bu tür dizelere de sahip olabilir ve sınırlayıcıların tutarlı olması gerekmez. Öyleyse {{ zero0one$$two );, bunun gibi bir şey bile geçerli (saçma) cevaptır zeroonetwo.)

  • Bayt cinsinden en kısa cevap kazanır.

Test durumları

three -> three
eightsix -> eight six
fivefourseven -> five four seven
ninethreesixthree -> nine three six three
foursixeighttwofive -> four six eight two five
fivethreefivesixthreenineonesevenoneeight -> five three five six three nine one seven one eight
threesevensevensixninenineninefiveeighttwofiveeightsixthreeeight -> three seven seven six nine nine nine five eight two five eight six three eight
zeroonetwothreefourfivesixseveneightnine -> zero one two three four five six seven eight nine

28
Bu mükemmel bir meydan okuma! Görevin anlaşılması ve doğrulanması son derece kolaydır, ancak kullanılacak doğru yaklaşım çok açık değildir. Doğru yaklaşımı seçmek, puan konusunda çok büyük bir fark yaratabilir. +1 :)
DJMcMayhem

1
Bunu düşündükten sonra, anarşi golfünde benzer fakat daha basit bir mücadeleyi hatırladım: yesno ! Bazı şaşırtıcı C cevaplar yol açtı. Yakında bunlardan birini görmeyi umuyorum :)
Lynn

C cevabımın böyle nitelendirildiğini sanmıyorum, ama umarım benden daha çarpık bir mizah anlayışı olan başkaları için bir başlangıç ​​noktasıdır.
Michael Dorgan

Ben de aynı sorunu gördüm eminim ama gerçek sayıyı basmanız gereken yerde. Neredeyse eminim ki, sen de öyle, Lynn; ama bağlantıyı kaybettim, beni bağla?
Magic Octopus Urn

3
@MichaelDorgan (veya başka herhangi bir C kodlayıcı), Befunge cevabımda kullandığım algoritmaya bakmak isteyebilirsiniz. Bunun C'ye doğru çevrilmesi bana mevcut bir C cevabını dağıttığını düşündüğüm 104 baytlık bir çözüm getirdi. Daha fazla C golf becerisine sahip olan biri tarafından geliştirilebilecek bir bahis oynamayı istiyorum.
James Holderness

Yanıtlar:



17

C (gcc) , 89 80 76 75 72 71 70 69 bayt

f(char*s){*s&&f(s+printf(" %.*s",""[(*s^s[2])%12],s)-1);}

Çevrimiçi deneyin!

(89) XOR hash için gastropner'a kredi .
(76) 1 ve 3'ü kullanma fikri için Toby Speight'a teşekkür ederiz.
İçin (75) Kredi Michael Dorgan için '0'48.
(72) Michael Dorgan ve Lynn'e kontrol karakterleri olan hazırlayıcılar için kredi .
İçin (69) Kredi Lynn için x?y:0x&&y

f (char *s) {        /* K&R style implicit return type. s is the input. */
    *s&&f(           /* Recurse while there is input. */
        s+printf(    /* printf returns the number of characters emitted. */
            " %.*s", /* Prefix each digit string with a space. Limit
                      * how many bytes from the string to print out. */
            ""
                     /* Magic hash table, where the value represents
                      * the length of the digit string. The string
                      * is logically equivalent to
                      * "\04\01\05\03\04\05\05\04\04\01\03\03" */
            [(*s^s[2])%12],
                     /* The XOR hash (mod 12) */
            s)       /* The current digit. */
            -1);}    /* Subtract 1 for the space. */

11

Python 2,50 bayt

import re
re.compile('..[eox]|[tse]?....').findall

Çevrimiçi deneyin!

-3 Lynn'e teşekkürler .
İçin -4 sayesinde Uriel 'ın cevabı ' ın regex.


3
Güzel! import re;re.compile('…').findallbirkaç bayt kurtarmalı. Bunun regex golf haline gelmesini bekliyordum :)
Lynn

@Lynn Bekle, işim bitene kadar bekle! :-P EDIT: Aslında 3 bayttır.
Outgolfer Erik,

@Lynn Ayrıca, bunun yerine code-golf normal ifadesine dönmüş olmalısınız . ;)
Outgolfer Erik,

Çok ilginç olacak bir C cevabı için bekliyorum !
Lynn

9

Befunge, 87 85 81 76 bayt

<*"h"%*:"h"$_02g-v1$,*<v%*93,:_@#`0:~
"@{&ruX;\"00^ !: _>_48^>+:"yp!"*+%02p0

Çevrimiçi deneyin!

Befunge'nin herhangi bir dize işleme talimatı yoktur, bu yüzden yaptığımız şey onları işlerken, karşılaşılan son üç karakterden bir tür karma oluşturmaktır.

Bu karma, esas olarak üç basamaklı, temel-104 sayıdır. Her yeni karakter okunduğunda, en eski karakterden kurtulmak için hash'i 104 2 ile modlar , yeni karakter için yer açmak için onu 104 ile çarptıktan sonra yeni karakter mod 27'nin ASCII değerini ekleyin (emin olmak için) taşmaz).

Karşılaştırma amacıyla, bu değeri mod 3817 olarak alırız, belleğe yazarız (böylece 8 biti böler), bu da Befunge'nin kullanımı daha kolay olan daha küçük sayılarla sonuçlanır. O zaman karşılaştırmamız gereken kareler 0, 38, 59, 64, 88, 92, 114, 117 ve 123'tür. Bunlardan herhangi biriyle eşleşirse, kartın sonunu işaretleyen bir karakter dizisiyle karşılaştığımızı biliyoruz. sayı, bu nedenle ek bir boşluk çıkarır ve karma değeri sıfırlar.

Neden baz 104'ün veya neden 3817 modunun merak edildiğini merak ediyorsanız, bu değerler dikkatlice seçildi, böylece karşılaştırmamız gereken karma liste mümkün olduğu kadar az byte olarak gösterilebildi.


Dürüst olmak gerekirse, bu bana bakemoji (ば け も じ) gibi görünüyor. Vay. Algoritma açıklaması olsa güzel ve ben bunu düşüneceğim.
Michael Dorgan

^, Terimini mojibake olarak gördüğümü hatırlıyorum (も じ ば け). Bu sayıları (temel 104, mod 3187), @JamesHolderness'ı nasıl buldunuz?
Zacharý

@ Zacharý Beklenen tüm girdilere karşı çalışırken doğru sonuçları üretecek olanı bulmak için farklı taban ve mod kombinasyonlarını test eden küçük bir Python senaryosu yazdım. Hangi kombinasyonların işe yaradığını öğrendiğimde, sonuçta elde edilen hash çıkışlarını, en kısa kodun hangisini ürettiğini bulmak için bir Befunge sayı üreteci ile çalıştırdım.
James Holderness

6

Java (OpenJDK 8) , 55 46 43 bayt

Forty3 / FrownyFrog sayesinde 9 bayt tasarruf

Titus sayesinde 3 bayt tasarruf

s->s.replaceAll("one|tw|th|f|z|s|.i"," $0")

Çevrimiçi deneyin!

edit: lambdaların karşılanması ve açıklanması için teşekkür ederiz!


3
Merhaba, PPCG'ye hoş geldiniz! Büyük ilk cevap ve gerçekten işe yarıyor. İşte bunun için TIO linki. Lambdalar birçok yolla yaratılabilir. İşte bazı yorumlarda eklenmiş bazı lambdalar içeren TIO, böylece onları nasıl yaratabileceğinizi görebilirsiniz. (O kadar kod vurgu görebilirsiniz Eclipse kopyalama öneririz.) Ayrıca, Java golf için ipuçları ve tüm dillerde golf için ipuçları okumak ilginç olabilir. Kaldınız! :)
Kevin Cruijssen

@KevinCruijssen teşekkür ederim! Java’nın JavaScript’ten daha kısa olduğuna dürüstçe şaşırdım. Genellikle zorlukları okurken, JS çok daha kısa.
Luca H

JavaScript 2 bayt daha kısa olmalıdır ( gyerine regex soneki All).
Neil

@Neil burada daha uzun çünkü 4 byte daha kısa olan f=(s)=>yerine kullanıyor s->.
Luca H

1
@LucaH - FrownyFrog'un önerisine göre, iki harfli dizelerinizden birkaçını tek karaktere indirgeyebilirsiniz: ze | fo | fi | si | se /
Forty3

6

C (gcc) , 179 159 146 139 137 116 107 103 102 bayt

Düzenleme 1: ( Sayın Xcoder'dan öneriler eklendi - teşekkürler! - Makro sürümüm sizinkilerle aynı boyuttaydı, ancak sizinkileri daha çok seviyorum.)

Düzenleme 2: Değişen karakter bireysel aramalarla karşılaştırılırstrchr()

Düzenleme 3: K & R var bildirimleri (Eww!)

Düzenleme 4: 1 makro yeterli değilse ...

Düzenleme 5: Yukarıda önerilen yeni algoritma ile yeniden yapıldı. Bu harika fikir için James Holderness'e teşekkürler !

Düzenleme 6: otomatik olarak oraya gibi görünüyor 0 Kaldırıldı - Kullanılan Master seviye kodu golf teknikleri (virgül, printf hile, vb.) - teşekkürler gastropner !

Düzenleme 7: memchr kullanın ve James Holderness tarafından işaret edilen bir hatayı düzeltin .

7 düzenleyin: kullan &&yerine nihai çeke ?- teşekkürler jxh .

c,h;f(char*s){while(c=*s++)putchar(c),h=h%10816*104+c%27,memchr("&;@X\\ru{",h%3817,9)&&putchar(h=32);}

Çevrimiçi deneyin!

Golf Yapılmadı (Dürüst olmak gerekirse hala çok golf oynuyor ...)


int c;
int h;
void f(char*s)
{
    while(c=*s++)
        putchar(c),
        h=h%10816*104+c%27,
        memchr("&;@X\\ru{",h%3817,9)?putchar(h=32):1;
}

Eski, düz ileri grep-esqe çözümü:

#define p putchar
#define q c=*s++
c,x;f(char*s){while(q){p(c);x=strchr("tse",c);p(q);p(q);if(!strchr("eox",c)){p(q);if(x)p(q);}p(' ');}}

Eski, daha temiz sürüm.

// Above code makes a macro of putchar() call.

void f(char *s)
{
    char c;
    while(c = *s++)
    {
        putchar(c);
        int x = strchr("tse", c);

        putchar(*s++);
        putchar(c=*s++);

        if(!strchr("eox", c))
        {
            putchar(*s++);
            if(x)
            {
                putchar(*s++);
            }
        }       
        putchar(' ');
    }
}

Çevrimiçi deneyin!


Bir kaç bayt için putchar ve benzeri makro olabilir, ancak genel olarak, hala mümkünse daha iyi bir algoritma düşünüyor.
Michael Dorgan

159 bayt ile #defineing putcharve gereksiz parantezler çıkarılması.
Bay Xcoder

2
Biraz çirkin, ancak 136 bit kullanarak #define p putchar(bunun yerine (açık parantezi not edin).
Tom Carpenter

1
109 baytc,h=0;f(char*s){while(c=*s++)putchar(c),h=h%10816*104+c%27,c=h%3817,printf(" "+!(c&&strchr("&;@X\\ru{",c)));}
gastropner

Ah, aldığım printf hilesi artı bir çift parantezin ve kaşlı ayraçların kaldırılması. Master seviye kodu golf etkin :)
Michael Dorgan 21:17

5

JavaScript, 66 57 52 44 41 bayt

s=>s.replace(/one|t[wh]|.i|[fsz]/g," $&")

Oldukça saf, ama işe yarıyor.

FrownyFrog tarafından 2 karakter kullanmak için güzel bir yakalama ... saf bir 2 karakter kontrolünün zeronine bulaşabileceği "bir" hariç. Düzenleme: bekar fve sFrownyFrog tarafından iyi yakalayıcılar benim ilk iki golf gözardı.

Teşekkürler, Neil, isimsiz bir lambda önerisi için ve tek bir kömür kullanabilmek ziçin 52'ye iniyor.

Titus daha küçük bir RegEx ile geliyor. Sonunda Uriel'in regex'ine doğru gittiğimizi hissediyorum.


İki karakter kullanıyorsanız ve 'sonuna kadar' basarsanız kırılır mı?
FrownyFrog

Düşünüyorumz|tw|th|f|s|ei|ni|on
FrownyFrog

1
@ FrownyFrog o önce gelir, böylece önce tanınır.
Uriel

1
on|t[wh]|.i|[fsz](-4 bayt)
Titus

2
@Titus - Maalesef, on|eşleşme zeroninesunumuzer onine
Forty3


5

C, 103 99 bayt

char*r="f.tzuonresn.xgv";f(char*s){*s&&f(s+printf("%.*s ",(strrchr(r,s[2])-strchr(r,*s))%10,s)-1);}

Bu, herhangi bir karakter kodlaması için çalışır (EBCDIC gibi garip olanlar dahil), çünkü giriş karakterlerinin sayısal değerini kullanmaz. Bunun yerine, ilk ve üçüncü harfleri sihirli bir dizgede bulur. Bunların arasındaki mesafe, her bir baskıda kaç harfin ilerleyeceğini gösterir.

Test programı

#include <stdio.h>
int main(int argc, char **argv)
{
    for (int i = 1;  i < argc;  ++i) {
        f(argv[i]);
        puts("");
    }
}

1
Bazı baytlar özyineleme kullanılarak kaydedilebilir: tio.run/##XY/…
jxh






3

Jöle ,  23  21 bayt

ḣ3OP%953%7%3+3ɓḣṄȧṫḊÇ

Tam program yazdırma satır besleme ayrılmış çıktı. Not: Bir kez yapıldıktan sonra tekrar tekrar "sonsuza kadar" boş satırlar yazdırır (büyük bir özyineleme sınırına veya bir seg-fayına kadar)

Çevrimiçi deneyin! (TIO çıktısı toplanır, yerel bir uygulama satır satır basılır)

Nasıl?

Bir karakter listesiyle başlayarak, program tekrar tekrar:

  1. Bazı sıralı matematiği kullanarak karakter listesindeki ilk kelimenin uzunluğunu bulur;
  2. kelimeyi ve bir satır beslemeyi yazdırır; ve
  3. kelimeyi karakter listesinin başından siler

İlk kelimenin uzunluğuna, geçerli karakter listesinin ilk üç karakterini inceleyerek karar verilir (mutlaka ilk kelimenin bir parçası). Program bunları sıralılara dönüştürür, birlikte çoğaltır, sonucu 953 modüle eder, yedi modüle dönüştürür, üçe üç modüle ekler ve üç ekler:

word   head3  ordinals       product  %953  %7  %3  +3 (=len(word))
zero   zer    [122,101,114]  1404708   939   1   1   4
two    two    [111,110,101]  1233210    28   0   0   3
one    one    [116,119,111]  1532244   773   3   0   3
three  thr    [116,104,114]  1375296   117   5   2   5
four   fou    [102,111,117]  1324674     4   4   1   4
five   fiv    [102,105,118]  1263780   102   4   1   4
six    six    [115,105,120]  1449000   440   6   0   3
seven  sev    [115,101,118]  1370570   156   2   2   5
eight  eig    [101,105,103]  1092315   177   2   2   5
nine   nin    [110,105,110]  1270500   151   4   1   4

ḣ3OP%953%7%3+3ɓḣṄȧṫḊÇ - Main link, list of characters           e.g. "fiveeight..."
ḣ3              - head to index three                                "fiv"
  O             - ordinals                                           [102,105,118]
   P            - product                                            1263780
    %953        - modulo by 953                                      102
        %7      - modulo by seven                                    4
          %3    - modulo by three                                    1
            +3  - add three                                          4

              ɓ - dyadic chain separation swapping arguments...
... ḣṄȧṫḊÇ ...
    ḣ         - head to index                                        "five"
     Ṅ        - print the result plus a line-feed and yield the result
       ṫ      - tail from index                                      "eeight..."
      ȧ       - and (non-vectorising)                                "eeight..."
        Ḋ     - dequeue                                               "eight..."
         Ç    - call the last link (Main*) as a monad with this as input
              -       * since it's the only link and link indexing is modular.

1
Buna izin verilip verilmediğinden emin değilim . (Cidden, iki büyük ölçüde üstlenilen iki meta-cevap birbirinin karşıtını söylediğinde ne yaparsınız?)
Ørjan Johansen

OP açıkça “Çıktınız isteğe bağlı olarak başında veya sonunda bu tür dizelere sahip olabilir” ifadesini belirtir ve bu program gerçekte olduğu gibi yazdırır, böylece çıktı yine de herhangi bir zorunlu sonlandırmadan önce üretilir.
Jonathan Allan

Tabii, ama OP'nin sonsuz bir son dizge olduğunu düşünmüyorum. Ve meta-soru açıkça çıktının ilk basıldığı durum hakkındadır.
Ørjan Johansen

Sanırım ihtiyacın ruhunu yerine getiriyor (örneğin, sonsuz boş dizeler basıyorsa ve sonra iddia edebileceğim sözler yoksa)
Jonathan Allan

Öyleyse, sanırım beni Martin’in kampına koyarsa "eğer bir program ve haklı çıkarsa ..." :)
Jonathan Allan

3

C 168 ,145,144, 141 bayt

EDIT: denedim init 'i' 1 gibi

a, b, ana: (i)

Önde gelen boşluklardan kurtulmak için,
ancak üç, yedi veya sekiz ile başlayan girdiler bozuluyor

141

#define s|a%1000==
a,i;main(b){for(;~scanf("%c",&b);printf(" %c"+!!i,b),a|=b%32<<5*i++)if(i>4|a%100==83 s 138 s 116 s 814 s 662 s 478)a=i=0;}

Çevrimiçi deneyin

144

a,i;main(b){for(;~(b=getchar());printf(" %c"+!!i,b),a=a*21+b-100,++i)if(i>4|a==204488|a==5062|a==7466|a==23744|a==21106|a==6740|a==95026)a=i=0;}

Çevrimiçi deneyin

168

i,a;main(b){for(;~scanf("%c",&b);printf(" %c"+!!i,b),a|=b<<8*i++)if(i>4|a==1869768058|a==6647407|a==7305076|a==1920298854|a==1702259046|a==7891315|a==1701734766)a=i=0;}

Çevrimiçi deneyin!

Ungolfed

i,a;main(b){
for(;~scanf("%c",&b); // for every char of input
printf(" %c"+!!i,b), // print whitespace if i==0 , + char
a|=b<<8*i++ // add char to a for test
)
if(
i>4| // three seven eight
a==1869768058|      // zero
a==6647407|        // one
a==7305076|       // two
a==1920298854|   //four
a==1702259046|  //five
a==7891315|    //six
a==1701734766 //nine
) a=i=0; //reset i and a
}

int sabitleri bir << 8 kaydırılarak gereksiz yere büyür,
ancak bir şekilde dizelerle kıyaslanabiliyorsa en doğal olanı

146 Dize karşılaştırmasını kullanma

#define s|a==*(int*)
a,b;main(i){for(;~(b=getchar());printf(" %c"+!!i,b),a|=b<<8*i++)if(i>4 s"zero"s"one"s"two"s"four"s"five"s"six"s"nine")a=i=0;}

Dize karşılaştırmasını kullanma

Gizlenmiş

#define F(x)if(scanf(#x+B,&A)>0){printf(#x,&A);continue;}
B;A;main(i){for(;i;){B=1;F(\40e%4s)F(\40th%3s)F(\40se%3s)F(\40o%2s)B=2;F(\40tw%1s)F(\40si%1s)B=1;F(\40%4s)i=0;}}


2

Oldukça uzun. Aşağı golf oynamak için bekliyoruz.

R , 109 bayt

function(x)for(i in utf8ToInt(x)){F=F+i;cat(intToUtf8(i),if(F%in%c(322,340,346,426,444,448,529,536,545))F=0)}

Çevrimiçi deneyin!


Rakam yerine unicode karakterleri kullanmanın bir yolu var mı?
Michael Dorgan

Güzel bir uygulama intToUtf8! Regexp kullanarak farklı bir yaklaşım kullanarak 90 bayt mümkün olacaktı:function(x,p=paste,z=p("(",p(c("zero",broman::numbers),collapse="|"),")"))gsub(z,"\\1 ",x)
Michael M

2

Haskell , 81 bayt

f[c]=[c]
f(h:t)=[' '|s<-words"z one tw th f s ei ni",and$zipWith(==)s$h:t]++h:f t

Çevrimiçi deneyin!

Açıklama:

f(h:t)=                      h:f t -- recurse over input string
   [' '|s<-               ]++      -- and add a space for each string s
      words"z one tw th f s ei ni" -- from the list ["z","one","tw","th","f","s","ei","ni"]
      ,and$zipWith(==)s$h:t        -- which is a prefix of the current string

2

Python 3 (düzenli ifade yok) , 85 bayt

i=3
while i<len(s):
	if s[i-3:i]in'ineiveroneghtwoureesixven':s=s[:i]+' '+s[i:]
	i+=1

Çevrimiçi deneyin!


2
PPCG'ye Hoşgeldiniz!
Laikoni

Güzel, ancak tam bir programın giriş yapması gereken kodu içermesi gerekir.
Jonathan Allan

Yani, tam bir program olarak 104 bayt . Bununla birlikte, 4 kullanarak tasarruf edersiniz while s[i:]ve bunu özyinelemeli göndererek 93 bayta kadar elde edebilirsiniz lambda(fonksiyonların çıktıyı kendileri yazdırmak yerine geri döndürmeleri yeterlidir).
Jonathan Allan,

2

Excel, 181 bayt

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"z"," z"),"on"," on"),"tw"," tw"),"th"," th"),"f"," f"),"s"," s"),"ei"," ei"),"ni"," ni")

Önünde bir boşluk yerleştirir: z, on, tw, th, f, s, ei,ni


2

Z80 Meclisi, 46 45 bayt

; HL is the address of a zero-terminated input string
; DE is the address of the output buffer

Match5: ldi                                 ; copy remaining characters
Match4: ldi
Match3: ld a,32 : ld (de),a : inc de        ; and add space after a matched word.

Uncollapse:

        ld a,(hl) : ldi : or a : ret z      ; copy first byte (finish if it was zero)
        ex af,af'                           ; and save its value for later.

        ldi : ld a,(hl) : ldi               ; copy second and third bytes

        cp 'e' : jr z,Match3                ; is the third letter 'e' or 'o' or 'x'?
        cp 'o' : jr z,Match3
        cp 'x' : jr z,Match3

        ex af,af'                           ; now look at the first letter

        cp 'e' : jr z,Match5                ; is it 't' or 's' or 'e'?
        sub 's' : jr z,Match5
        dec a : jr z,Match5
        jr Match4

(Uriel'in serin regex'ini regex dostu olmayan bir ortama adapte etmek eğlenceliydi).


1

Jöle , 40 39 bayt

“¢¤Ƙƒ⁺6j¹;Ċ-ḶṃżṃgɼṘƑUẏ{»Ḳe€€@ŒṖẠ€TḢịŒṖK

Çevrimiçi deneyin!

Nasıl çalışır

“¢¤Ƙƒ⁺6j¹;Ċ-ḶṃżṃgɼṘƑUẏ{»Ḳe€€@ŒṖẠ€TḢịŒṖK
“¢¤Ƙƒ⁺6j¹;Ċ-ḶṃżṃgɼṘƑUẏ{»                 = the compressed string of the digit names
                        Ḳ                = split at spaces
                         e€€@ŒṖ          = check whether each member of each partition of the argument is a digit.
                               Ạ€        = A function that checks whether all values of an array are true, applied to each element.
                                 T       = Finds the index of each truthy element 
                                  Ḣ      = Grab the first element, since we have a singleton array
                                    ịŒṖ  = The previous command gives us the index, partition that splits the input into digits. This undoes it and gives us the partition.
                                       K = Join the array of digits with spaces                



1

Python 3 , regex yok,  83 68 65  63 bayt

-15 Lynn sayesinde (tek bir fonksiyona yeniden düzenleyici)
-3 Lynn sayesinde (daha fazla aritmetik olan bir listeye endekslenmekten kaçının
)

def f(s):h=ord(s[0])*ord(s[1])%83%-7%-3+5;print(s[:h]);f(s[h:])

Yeni satırlarla ayrılmış sözcükleri basan ve ardından bir yükselten bir işlev IndexError.

Çevrimiçi deneyin! (Test paketi içinde birden fazla çalışmaya izin vermek için istisnaları yok eder)


Bunu daha sonra tekrar ziyaret ediyorum ve bunun 68 bayt olabileceğini fark ediyorum:def f(s):h=[4,5,3][ord(s[0])*ord(s[1])%83%7%3];print(s[:h]);f(s[h:])
Lynn

Oh wow, h(s)ve h(s)nasıl fark etmedi ?! Sağol Lynn!
Jonathan Allan,

Bu soruya nasıl geri dönüp devam edeceğime emin değilim ve yeni şeyler fark ediyorum, ama h=(ord(s[0])*ord(s[1])%83%7+1)%3+365 bayt! :)
Lynn

Heh, teşekkürler Lynn, bu iki baytın da golf atılmasını sağladı!
Jonathan Allan,

0

Jöle , 36 bayt

œṣj⁶;$}
W;“€ɗİẒmṫṃ¦¦ạỊɦ⁼Fḷeṭḷa»s2¤ç/

Çevrimiçi deneyin!

Algoritma:

for x in ['ze', 'ni', 'on', 'tw', 'th', ...]:
    replace x in input by space+x

Eminim daha iyisini yapabiliriz.


0

Mathematica, 125 bayt

(s=#;While[StringLength@s>2,t=1;a="";While[FreeQ[IntegerName/@0~Range~9,a],a=s~StringTake~t++];Print@a;s=StringDrop[s,t-1]])&


Çevrimiçi deneyin!

TIO "CountryData" (???) hakkında bir hata mesajı veriyor.
Bunun neden olduğunu bilmiyorum, ama her şey Mathematica'da iyi çalışıyor



0

q / kdb +, 59 51 bayt

Çözüm:

{asc[raze x ss/:string`z`one`tw`th`f`s`ei`ni]cut x}

Örnek:

q){asc[raze x ss/:string`z`one`tw`th`f`s`ei`ni]cut x}"threesevensevensixninenineninefiveeighttwofiveeightsixthreeeight"
"three"
"seven"
"seven"
"six"
"nine"
"nine"
"nine"
"five"
"eight"
"two"
"five"
"eight"
"six"
"three"
"eight"

Açıklama:

Hızlı çözüm, muhtemelen daha iyi ve daha fazla golf yaklaşımı.

{asc[raze x ss/:string`z`one`tw`th`f`s`ei`ni]cut x} / ungolfed solution
{                                                 } / lambda with implicit x as input
                                             cut x  / cut x at indices given by left
 asc[                                       ]       / sort ascending
                string`z`one`tw`th`f`s`ei`ni        / string list ("z","one",...)
          x ss/:                                    / string-search left with each right
     raze                                           / reduce down list

Notlar:

Bazı basit golf oyunları ile 46 bayt, q çağrılarını k ile değiştir, ancak yine de ağır bir çözüm.

asc[(,/)x ss/:($)`z`one`tw`th`f`s`ei`ni]cut x:

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.