Angka tidak terkumpul

72

Tugas

Diberikan serangkaian nama angka dalam Bahasa Inggris yang "diciutkan" bersama, seperti ini:

zeronineoneoneeighttwoseventhreesixfourtwofive

Pisahkan string kembali menjadi digit:

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

Aturan

  • Masukan selalu berupa string. Itu selalu terdiri dari satu atau lebih nama digit bahasa Inggris huruf kecil, diciutkan bersama, dan tidak ada yang lain.

    • Nama digit bahasa Inggris adalah zero one two three four five six seven eight nine.
  • Outputnya mungkin berupa daftar string, atau string baru di mana digit dibatasi oleh string non-alfabet, non-kosong. (Output Anda mungkin juga opsional memiliki string seperti di awal atau akhir, dan pembatas tidak perlu konsisten. Jadi, bahkan sesuatu seperti {{ zero0one$$two );ini (jika masuk akal) jawaban yang valid untuk zeroonetwo.)

  • Jawaban terpendek dalam byte menang.

Uji kasus

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
Lynn
sumber
28
Ini adalah tantangan yang luar biasa! Tugas ini sangat mudah dipahami dan diverifikasi, tetapi pendekatan yang tepat untuk digunakan tidak terlalu jelas. Dan memilih pendekatan yang tepat bisa membuat perbedaan besar dalam skor. +1 :)
DJMcMayhem
1
Setelah memikirkan hal ini, saya teringat tantangan serupa, tetapi lebih sederhana pada golf anarki: yesno ! Ini memicu beberapa jawaban C yang menakjubkan. Saya berharap untuk melihat salah satu dari mereka segera :)
Lynn
Saya tidak berpikir jawaban C saya memenuhi syarat seperti itu, tetapi mudah-mudahan ini merupakan titik awal bagi orang lain dengan selera humor yang lebih bengkok daripada saya.
Michael Dorgan
Saya cukup yakin saya pernah melihat tantangan yang sama ini, tetapi di mana Anda seharusnya mencetak nomor yang sebenarnya. Saya hampir yakin itu juga diposting oleh, Anda, Lynn; tapi saya kehilangan tautan, hubungkan saya dengan itu?
Magic Gurita Guci
3
@MichaelDorgan (atau coders C lainnya), Anda mungkin ingin melihat algoritma yang saya gunakan dalam jawaban Befunge saya. Konversi langsung dari itu ke C membuat saya solusi 104 byte, yang saya pikir mengalahkan semua jawaban C yang ada. Saya berani bertaruh itu bisa diperbaiki oleh seseorang dengan keterampilan bermain golf C yang lebih banyak.
James Holderness

Jawaban:

17

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

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

Cobalah online!

(89) Kredit untuk gastropner untuk hash XOR.
(76) Kredit untuk Toby Speight untuk gagasan menggunakan 1 dan 3.
(75) Kredit untuk Michael Dorgan untuk '0'48.
(72) Penghargaan untuk Michael Dorgan dan Lynn untuk literal dengan karakter kontrol.
(69) Penghargaan untuk Lynn untuk 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. */
jxh
sumber
11

Python 2 , 50 byte

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

Cobalah online!

Terima kasih untuk Lynn .
Berkat -4 untuk Uriel 's jawaban regex' s.

Erik the Outgolfer
sumber
3
Bagus! import re;re.compile('…').findallharus menyimpan beberapa byte. Saya memang berharap ini berubah menjadi golf regex :)
Lynn
@ Lynn Tunggu, tunggu sampai saya selesai! :-P EDIT: Sebenarnya 3 byte.
Erik the Outgolfer
@ Lynn Juga, Anda seharusnya mengubah ini ke ekspresi reguler kode-golf sebagai gantinya. ;)
Erik the Outgolfer
Saya mengulurkan tangan untuk jawaban C, yang akan sangat menarik!
Lynn
9

Befunge, 87 85 81 76 byte

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

Cobalah online!

Befunge tidak memiliki instruksi manipulasi string, jadi yang kami lakukan adalah membuat semacam hash dari tiga karakter terakhir yang ditemui, saat kami memprosesnya.

Hash ini pada dasarnya adalah tiga digit, nomor basis-104. Setiap kali karakter baru dibaca, kita mod hash dengan 104 2 untuk menyingkirkan karakter tertua, kalikan dengan 104 untuk membuat ruang untuk karakter baru, kemudian tambahkan nilai ASCII dari karakter baru mod 27 (untuk memastikan tidak meluap).

Untuk tujuan perbandingan, kami mengambil nilai ini mod 3817, menuliskannya ke dalam memori (sehingga memotongnya menjadi 8 bit), yang menghasilkan angka yang lebih kecil yang lebih mudah ditangani Befunge. Hash yang kemudian harus dibandingkan adalah 0, 38, 59, 64, 88, 92, 114, 117, dan 123. Jika cocok dengan semua itu, kita tahu bahwa kita telah menemukan urutan karakter yang menandai akhir dari angka, jadi kami mengeluarkan ruang tambahan dan mengatur ulang hash ke nol.

Jika Anda bertanya-tanya mengapa basis 104, atau mengapa mod 3817, nilai-nilai itu dipilih dengan hati-hati sehingga daftar hash yang kami butuhkan untuk dibandingkan dapat diwakili dalam sesedikit mungkin byte.

James Holderness
sumber
Sejujurnya, ini terlihat seperti bakemoji (ば け も じ) bagiku. Wow. Penjelasan algoritma bagus dan saya akan merenungkannya.
Michael Dorgan
^, Saya ingat melihat istilah itu sebagai mojibake (も じ ば け). Bagaimana Anda menemukan angka-angka itu (base 104, mod 3187), @JamesHolderness?
Zacharý
@ Zacharý Saya menulis skrip Python kecil yang menguji basis dan kombinasi mod yang berbeda untuk menemukan yang akan menghasilkan hasil yang benar ketika dijalankan terhadap semua input yang diharapkan. Setelah saya tahu kombinasi mana yang bekerja, saya menjalankan output hash yang dihasilkan melalui generator nomor Befunge untuk mencari tahu yang menghasilkan kode terpendek.
James Holderness
6

Java (OpenJDK 8) , 55 46 43 byte

Menyimpan 9 byte berkat Forty3 / FrownyFrog

Menyimpan 3 byte berkat Titus

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

Cobalah online!

sunting: Terima kasih atas sambutan dan penjelasan lambda!

Luca H
sumber
3
Hai, selamat datang di PPCG! Jawaban pertama yang bagus, dan itu memang berhasil. Inilah tautan TIO untuk itu. Lambdas dapat dibuat dengan berbagai cara. Berikut ini adalah TIO lain dengan beberapa lambda dengan komentar tambahan sehingga Anda dapat melihat cara membuatnya sendiri. (Saya sarankan menyalinnya ke Eclipse sehingga Anda dapat melihat sorotan kode.) Juga, Tips untuk bermain golf di Jawa dan Tips untuk bermain golf dalam semua bahasa mungkin menarik untuk dibaca. Selamat menikmati! :)
Kevin Cruijssen
@KevinCruijssen terima kasih! Saya benar-benar terkejut bahwa Java lebih pendek dari JavaScript. Biasanya ketika saya membaca tantangan, JS jauh lebih pendek.
Luca H
JavaScript harus 2 byte lebih pendek ( gbukan regex suffix All).
Neil
@ Neil itu lebih lama di sini karena ia menggunakan f=(s)=>bukan s->, yang 4 byte lebih pendek.
Luca H
1
@LucaH - sesuai saran FrownyFrog, Anda dapat mengurangi beberapa string dua huruf menjadi karakter tunggal: z | f | s bukan ze | fo | fi | si | se /
Forty3
6

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

Sunting 1: (Menambahkan saran dari Tn. Xcoder - terima kasih! - Versi makro saya memiliki ukuran yang sama dengan Anda, tetapi saya lebih menyukai milik Anda.)

Sunting 2: Perubahan char individual dibandingkan dengan panggilan kestrchr()

Sunting 3: K&R adalah deklarasi var (Eww!)

Sunting 4: Ketika 1 makro tidak cukup ...

Sunting 5: Diulang dengan algoritma baru yang disarankan di atas. Terima kasih kepada James Holderness untuk ide bagus ini!

Sunting 6: Dihapus 0 ditetapkan karena sepertinya pergi ke sana secara otomatis - Teknik golf kode master level digunakan (koma, trik printf, dll.) - terima kasih gastropner !

Sunting 7: Gunakan memchr dan perbaiki bug yang ditunjukkan oleh James Holderness .

Sunting 7: Gunakan &&pada pemeriksaan akhir untuk mengganti ?- terima kasih 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);}

Cobalah online!

Non-golf (Yang masih sangat golf jujur ​​...)


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;
}

Solusi grep-esqe lurus ke depan:

#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(' ');}}

Versi lama dan bersih.

// 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(' ');
    }
}

Cobalah online!

Michael Dorgan
sumber
Kita dapat membuat makro putchar dan semacamnya untuk beberapa byte, tetapi secara umum, masih memikirkan algoritma yang lebih baik jika memungkinkan.
Michael Dorgan
159 byte oleh #defineing putchardan menghapus sepasang kurung yang tidak perlu.
Tn. Xcoder
2
Agak jelek, tetapi 136 byte dengan menggunakan #define p putchar(sebagai gantinya (perhatikan tanda kurung terbuka).
Tom Carpenter
1
109 bytec,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, trik printf yang saya lihat di bawah ini ditambah penghapusan tanda kurung pasangan dan kawat gigi. Golf kode tingkat master diaktifkan :)
Michael Dorgan
5

JavaScript, 66 57 52 44 41 byte

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

Cukup naif, tetapi berhasil.

Tangkapan yang bagus oleh FrownyFrog untuk menggunakan 2 karakter .. kecuali untuk "satu" yang pemeriksaan murni 2 arang bisa mengacaukan zeronine. Sunting: single fdan stangkapan bagus oleh FrownyFrog yang saya abaikan dua golf pertama saya.

Terima kasih, Neil, atas saran lambda yang tidak disebutkan namanya dan dapat menggunakan satu char untuk zmencapai 52.

Titus datang dengan RegEx yang lebih kecil. Saya merasa kita menuju regex Uriel akhirnya.

Empat puluh3
sumber
Apakah rusak jika Anda menggunakan dua karakter dan mendorong 'on' ke akhir?
FrownyFrog
Saya sedang berpikirz|tw|th|f|s|ei|ni|on
FrownyFrog
1
@FrownyFrog o datang terlebih dahulu sehingga diakui pertama kali.
Uriel
1
on|t[wh]|.i|[fsz](-4 byte)
Titus
2
@Titus - Sayangnya, rendering on|akan cocokzeroninezer onine
Forty3
5

Retina , 24 23 byte

!`..[eox]|[fnz]...|.{5}

Cobalah online! Sunting: Disimpan 1 byte berkat @FrownyFrog.

Neil
sumber
1
akan .....-> .{5}bekerja?
FrownyFrog
5

C, 103 99 byte

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

Ini berfungsi untuk pengkodean karakter apa pun (termasuk yang canggung seperti EBCDIC), karena tidak menggunakan nilai numerik karakter input. Sebaliknya, ini menempatkan huruf pertama dan ketiga dalam string ajaib. Jarak antara ini menunjukkan berapa banyak huruf untuk maju dengan setiap cetak.

Program uji

#include <stdio.h>
int main(int argc, char **argv)
{
    for (int i = 1;  i < argc;  ++i) {
        f(argv[i]);
        puts("");
    }
}
Toby Speight
sumber
1
Beberapa byte dapat disimpan dengan menggunakan rekursi: tio.run/##XY/…
jxh
4

J , 37 35 byte

rplc'twthsiseeinionzef'(;LF&,)\~_2:

Cobalah online!

FrownyFrog
sumber
2
Solusi alternatif keren! Saya mencoba f=:[:>'..[eox]|[tse]?....'&rxalldan itu bekerja di interpeter, tetapi tidak berhasil di TIO.
Galen Ivanov
ini sangat pintar, bagus sekali
Jonah
@GalenIvanov TIO memiliki rilis terbaru, bisa jadi ini adalah regresi pada J.
FrownyFrog
4

C (gcc) , 106 byte 104 byte

-2 byte terima kasih kepada @jxh

c;f(char*s){char*t=" $&=B*,29/?";while(*s)for(c=4+(strchr(t,(*s^s[1])+35)-t)/4;c--;)putchar(c?*s++:32);}

Cobalah online!

XOR benar-benar sekutu terbesar kami.

gastropner
sumber
Seperti trik s ++. Hash yang bagus.
Michael Dorgan
1
s[1]akan lebih pendek.
jxh
@ jxh Bagus! Diperbarui.
gastropner
3

Pip , 27 byte

aR`[zfs]|one|[ent][iwh]`s._

Mengambil input sebagai argumen baris perintah. Cobalah online!

Penggantian regex sederhana, menyisipkan spasi sebelum setiap pertandingan [zfs]|one|[ent][iwh].


Melompati pencurian mencuri pinjaman Uriel memberikan 23 byte (dengan -sbendera):

a@`..[eox]|[tse]?....`
DLosc
sumber
Anda dapat menggunakan regex yang lebih pendek .
Erik the Outgolfer
3

Jelly ,  23  21 byte

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

Output penuh dipisahkan dengan pencetakan baris-umpan yang diprogram. Catatan: setelah selesai berulang kali mencetak baris kosong "selamanya" (hingga batas rekursi besar atau seg-kesalahan)

Cobalah online! (Output TIO diakumulasikan, implementasi lokal akan mencetak baris demi baris)

Bagaimana?

Dimulai dengan daftar karakter, program berulang kali:

  1. menemukan panjang kata pertama dari daftar karakter menggunakan beberapa matematika ordinal;
  2. mencetak kata plus linefeed; dan
  3. menghapus kata dari kepala daftar karakter

Panjang kata pertama ditentukan dengan memeriksa tiga karakter pertama dari daftar karakter saat ini (harus merupakan bagian dari kata pertama). Program mengonversikannya menjadi ordinals, mengalikannya bersama, modulos hasilnya dengan 953, modulos yang dengan tujuh, modulos yang oleh tiga dan menambahkan tiga:

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.
Jonathan Allan
sumber
1
Saya tidak yakin apakah ini diizinkan . (Serius, apa yang Anda lakukan ketika dua meta-jawaban yang sangat tervotifikasi mengatakan kebalikan satu sama lain?)
Ørjan Johansen
OP secara eksplisit menyatakan "Output Anda mungkin juga memiliki string seperti itu di awal atau akhir" dan program ini benar-benar mencetak saat berjalan, sehingga output diproduksi sebelum penghentian paksa apa pun.
Jonathan Allan
Tentu, tapi saya tidak berpikir OP dianggap sebagai string akhir yang tak terbatas. Dan meta-pertanyaan secara eksplisit tentang kasus di mana output dicetak terlebih dahulu.
Ørjan Johansen
Saya pikir itu memenuhi semangat persyaratan (jika itu, misalnya, dicetak string kosong tanpa batas dan kemudian kata-kata yang saya berpendapat itu tidak)
Jonathan Allan
Jadi, saya kira itu menempatkan saya di kubu Martin "jika itu sebuah program dan dapat membenarkan ..." :)
Jonathan Allan
3

C 168 ,145,144, 141 byte

EDIT: Mencoba init 'i' to 1 seperti itu

a, b; main (i)

Untuk menghilangkan spasi putih terkemuka,
tetapi terputus pada input mulai dengan tiga, tujuh atau delapan

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;}

Cobalah online

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;}

Cobalah online

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;}

Cobalah online!

Tidak disatukan

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
}

konstanta int menjadi tidak perlu besar dengan menggeser << 8
tetapi jika Anda dapat membandingkan dengan string entah bagaimana itu harus menjadi yang paling alami

146 Menggunakan perbandingan string

#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;}

Menggunakan perbandingan String

Kebingungan

#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;}}
PrincePolka
sumber
2

Jelly , 44 byte

Ṛ¹Ƥz⁶ZUwЀ“¢¤Ƙƒ⁺6j¹;Ċ-ḶṃżṃgɼṘƑUẏ{»Ḳ¤$€Ẏḟ1Ṭœṗ

Cobalah online!

Erik the Outgolfer
sumber
3
Maaf kawan, kamu sudah dikalahkan dua kali.
Zacharý
2

Cukup lama. Anda dipersilakan untuk bermain golf.

R , 109 byte

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)}

Cobalah online!

djhurio
sumber
Adakah cara untuk menggunakan karakter unicode alih-alih digit?
Michael Dorgan
Aplikasi bagus intToUtf8! 90 byte akan dimungkinkan dengan menggunakan pendekatan yang berbeda menggunakan regexp:function(x,p=paste,z=p("(",p(c("zero",broman::numbers),collapse="|"),")"))gsub(z,"\\1 ",x)
Michael M
2

Haskell , 81 byte

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

Cobalah online!

Penjelasan:

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
Laikoni
sumber
2

Python 3 (tanpa regex) , 85 byte

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

Cobalah online!

Alex
sumber
2
Selamat datang di PPCG!
Laikoni
Itu bagus, tetapi program lengkap harus menyertakan kode untuk mengambil input.
Jonathan Allan
Jadi, sebagai program penuh 104 byte . Namun Anda dapat menyimpan 4 dengan menggunakan while s[i:]dan kemudian Anda bisa turun ke 93 byte dengan mengirimkan rekursif lambda(fungsi hanya perlu mengembalikan output daripada mencetaknya sendiri).
Jonathan Allan
2

Excel, 181 byte

=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")

Menempatkan spasi di depan: z, on, tw, th, f, s, ei,ni

Wernisch
sumber
2

Z80 Assembly, 46 45 byte

; 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

(Sangat menyenangkan untuk mengadaptasi regex keren Uriel ke lingkungan regex yang tidak ramah).

introspeksi
sumber
1

Jelly , 40 39 byte

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

Cobalah online!

Bagaimana itu bekerja

“¢¤Ƙƒ⁺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                
Zacharý
sumber
1

Python 3 , tanpa regex,  83 68 65  63 byte

-15 terima kasih kepada Lynn (refactor menjadi fungsi tunggal)
-3 lebih banyak terima kasih kepada Lynn (hindari pengindeksan ke daftar dengan aritmatika lebih banyak)
... yang mengarah pada penghematan 2 byte (menghindari tanda kurung dengan modulos negatif) :)

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

Fungsi yang mencetak kata-kata yang dipisahkan oleh baris baru dan kemudian memunculkan IndexError .

Cobalah online! (Menekan pengecualian untuk memungkinkan beberapa putaran dalam test-suite)

Jonathan Allan
sumber
Saya meninjau kembali ini nanti dan menyadari ini bisa 68 byte: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)dan h(s)bagaimana saya tidak memperhatikan ?! Lynn terima kasih!
Jonathan Allan
Saya tidak yakin bagaimana saya terus kembali ke pertanyaan ini dan memperhatikan hal-hal baru, tetapi h=(ord(s[0])*ord(s[1])%83%7+1)%3+365 byte! :)
Lynn
Heh, terima kasih Lynn, yang memungkinkan dua byte lagi untuk bermain golf juga!
Jonathan Allan
0

Jelly , 36 byte

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

Cobalah online!

Algoritma:

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

Saya yakin kita bisa melakukan yang lebih baik lagi.

Lynn
sumber
0

Mathematica, 125 byte

(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]])&


Cobalah online!

TIO menampilkan pesan kesalahan tentang "CountryData" (???)
Saya tidak tahu mengapa ini terjadi, tetapi semuanya berjalan dengan baik di Mathematica

J42161217
sumber
0

Perl 6 ,  42  30 byte

*.comb(/<{(0..9).Str.uninames.lc.words}>/)

Menguji

{m:g/..<[eox]>||<[tse]>?..../}

Uji itu
(Diterjemahkan dari jawaban lain)

Brad Gilbert b2gills
sumber
0

q / kdb +, 59 51 byte

Larutan:

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

Contoh:

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"

Penjelasan:

Solusi cepat, mungkin pendekatan yang lebih baik dan lebih golf.

{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

Catatan:

46 byte dengan beberapa golf sederhana, menggantikan panggilan q dengan k, tetapi masih merupakan solusi yang lumayan.

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

streetster
sumber