ตัวเลขที่ไม่มีการย่อส่วน


72

งาน

กำหนดสตริงชื่อภาษาอังกฤษของตัวเลข“ ยุบ” พร้อมกันดังนี้:

zeronineoneoneeighttwoseventhreesixfourtwofive

แยกสตริงกลับเป็นตัวเลข:

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

กฎระเบียบ

  • อินพุตเป็นสตริงเสมอ มันประกอบด้วยชื่อหลักภาษาอังกฤษตัวพิมพ์เล็กหนึ่งชื่อหรือมากกว่ายุบรวมกันและไม่มีอะไรอื่น

    • zero one two three four five six seven eight nineชื่อภาษาอังกฤษเป็นหลัก
  • ผลลัพธ์อาจเป็นรายการของสตริงหรือสตริงใหม่ที่มีการคั่นด้วยตัวเลขโดยสตริงที่ไม่ใช่ตัวอักษรและไม่ว่างเปล่า (เอาท์พุทของคุณอาจเลือกที่มีสตริงดังกล่าวที่จุดเริ่มต้นหรือจุดสิ้นสุดและคั่นไม่จำเป็นต้องสอดคล้องกัน. ดังนั้นแม้สิ่งที่ต้องการ{{ zero0one$$two );เป็นที่ถูกต้อง (ถ้าไร้สาระ) คำตอบzeroonetwo.)

  • คำตอบที่สั้นที่สุดเป็นไบต์ชนะ

กรณีทดสอบ

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
นี่คือความท้าทายที่ยอดเยี่ยม! งานเข้าใจและตรวจสอบได้ง่ายมาก แต่วิธีการใช้งานที่ถูกต้องนั้นไม่ชัดเจนมากนัก และการเลือกวิธีการที่เหมาะสมสามารถสร้างความแตกต่างอย่างมากในคะแนน +1 :)
DJMcMayhem

1
หลังจากคิดนี้ขึ้นมาผมจำได้ว่าเป็นความท้าทายที่คล้ายกัน แต่ง่ายเพิ่มเติมเกี่ยวกับกอล์ฟอนาธิปไตย: yesno ! มันจุดประกายบางคำตอบที่น่าอัศจรรย์ C ฉันหวังว่าจะเห็นหนึ่งในไม่ช้า :)
ลินน์

ฉันไม่คิดว่าคำตอบของฉันจะมีคุณสมบัติเช่นนี้ แต่หวังว่ามันจะเป็นจุดเริ่มต้นสำหรับคนอื่น ๆ ที่มีอารมณ์ขันมากกว่าตัวฉัน
Michael Dorgan

ฉันค่อนข้างมั่นใจว่าฉันได้เห็นความท้าทายเดียวกันนี้ แต่ที่ที่คุณควรพิมพ์หมายเลขจริง ฉันเกือบจะแน่ใจว่ามันยังโพสต์โดยคุณลินน์; แต่ฉันเสียลิงค์ไป
Magic Octopus Urn

3
@MichaelDorgan (หรือตัวแปลงสัญญาณ C อื่น ๆ ) คุณอาจต้องการดูอัลกอริทึมที่ฉันใช้ในคำตอบ Befunge ของฉัน การแปลงตรงไปยัง C ทำให้ฉันได้โซลูชัน 104 ไบต์ซึ่งฉันคิดว่าคำตอบ C ที่มีอยู่ทั้งหมด ฉันยินดีที่จะเดิมพันที่สามารถปรับปรุงได้โดยคนที่มีทักษะการเล่นกอล์ฟ C มากขึ้น
James Holderness

คำตอบ:



17

C (gcc) , 89 80 76 75 72 71 70 69 ไบต์

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

ลองออนไลน์!

(89) มอบเครดิตให้กับนักทานสำหรับแฮชแฮร์
(76) ให้เครดิตแก่Toby Speightสำหรับแนวคิดในการใช้อันดับที่ 1 และ 3
(75) เครดิตไมเคิล Dorganสำหรับ→'0' (72) ให้เครดิตกับMichael DorganและLynnสำหรับตัวอักษรที่มีอักขระควบคุม (69) ให้เครดิตกับLynnสำหรับ→48

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 ไบต์

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

ลองออนไลน์!

ขอบคุณ -3 ถึงลินน์
-4 ต้องขอบคุณregex ของคำตอบของUriel


3
ดี! import re;re.compile('…').findallควรบันทึกสองสามไบต์ ผมไม่ได้คาดหวังนี้จะกลายเป็นกอล์ฟ regex :)
ลินน์

@ ลินน์รอเดี๋ยวฉันทำเสร็จแล้ว! :-P แก้ไข: 3 ไบต์จริง
Erik the Outgolfer

@Lynn นอกจากนี้คุณควรเปลี่ยนสิ่งนี้เป็นนิพจน์ทั่วไปของcode-golf แทน ;)
Erik the Outgolfer

ฉันถือคำตอบ C ซึ่งจะน่าสนใจมาก !
ลินน์

9

Befunge, 87 85 81 76 ไบต์

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

ลองออนไลน์!

Befunge ไม่มีคำแนะนำการจัดการสตริงดังนั้นสิ่งที่เราทำคือการสร้างแฮชของอักขระสามตัวสุดท้ายที่พบในขณะที่เรากำลังประมวลผล

แฮชนี้เป็นตัวเลขสามหลักซึ่งเป็นเลขฐาน 104 ทุกครั้งที่มีการอ่านตัวละครใหม่เราดัดแปลงแฮชด้วย 104 2เพื่อกำจัดตัวละครที่เก่าที่สุดคูณด้วย 104 เพื่อสร้างพื้นที่สำหรับตัวละครใหม่จากนั้นเพิ่มค่า ASCII ของตัวละครใหม่ 27 (เพื่อให้แน่ใจว่า มันไม่ล้น)

เพื่อวัตถุประสงค์ในการเปรียบเทียบเราใช้ค่านี้ mod 3817 เขียนลงในหน่วยความจำ (ดังนั้นจึงตัดให้เหลือ 8 บิต) ซึ่งส่งผลให้ตัวเลขมีขนาดเล็กลงซึ่งง่ายกว่าสำหรับ Befunge ในการจัดการ แฮชที่เราต้องเปรียบเทียบคือ 0, 38, 59, 64, 88, 92, 114, 117, และ 123 ถ้ามันตรงกับสิ่งใด ๆ เรารู้ว่าเราเจอลำดับตัวละครที่เป็นจุดสิ้นสุดของ หมายเลขดังนั้นเราจึงส่งออกพื้นที่เพิ่มเติมและรีเซ็ตแฮชเป็นศูนย์

หากคุณสงสัยว่าเพราะเหตุใดฐาน 104 หรือเหตุใด mod 3817 ค่าเหล่านั้นจึงถูกเลือกอย่างระมัดระวังเพื่อให้รายการแฮชที่เราต้องการเปรียบเทียบอาจแสดงเป็นไบต์น้อยที่สุด


ค่อนข้างตรงไปตรงมาเหมือน bakemoji (ばけもじ) สำหรับฉัน ว้าว. คำอธิบายอัลกอริทึมเป็นสิ่งที่ดีแม้ว่าและฉันจะพิจารณา
Michael Dorgan

ฉันจำได้ว่าเห็นคำว่า mojibake (もじばけ) คุณพบตัวเลขเหล่านั้นได้อย่างไร (ฐาน 104, mod 3187), @JamesHolderness
Zacharý

@ Zacharýฉันเขียนสคริปต์ Python เล็กน้อยที่ทดสอบการรวมเบสและ mod ที่แตกต่างกันเพื่อค้นหาสิ่งที่จะให้ผลลัพธ์ที่ถูกต้องเมื่อทำงานกับอินพุตที่คาดหวังทั้งหมด เมื่อฉันรู้ว่าชุดค่าผสมใดที่ใช้งานได้ฉันจะเรียกใช้แฮชผลลัพธ์ที่ได้จากเครื่องสร้างหมายเลข Befunge เพื่อหารหัสที่สั้นที่สุด
James Holderness

6

Java (OpenJDK 8) , 55 46 43 ไบต์

บันทึก 9 ไบต์ด้วย Forty3 / FrownyFrog

ประหยัดได้ 3 ไบต์ขอบคุณ Titus

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

ลองออนไลน์!

แก้ไข: ขอบคุณสำหรับการต้อนรับและคำอธิบายของ lambdas!


3
สวัสดียินดีต้อนรับสู่ PPCG! คำตอบแรกที่ดีมากและใช้งานได้จริง นี่คือลิงค์ TIO สำหรับมัน สามารถสร้างแลมบ์ดาได้หลายวิธี นี่คือ TIO อื่นที่มี lambdas พร้อมข้อคิดเห็นเพิ่มเติมเพื่อให้คุณสามารถดูวิธีการสร้างด้วยตนเอง (ฉันขอแนะนำให้คัดลอกไปยัง Eclipse เพื่อให้คุณเห็นการไฮไลต์ของรหัส) นอกจากนี้เคล็ดลับสำหรับการเล่นกอล์ฟใน Javaและเคล็ดลับสำหรับการเล่นกอล์ฟในทุกภาษาอาจน่าสนใจในการอ่าน เพลิดเพลินไปกับการพักผ่อนของคุณ! :)
Kevin Cruijssen

@KevinCruijssen ขอบคุณ! ฉันประหลาดใจอย่างยิ่งที่ Java สั้นกว่า JavaScript โดยปกติเมื่อฉันอ่านความท้าทาย JS จะสั้นกว่ามาก
Luca H

JavaScript ควรสั้นลง 2 ไบต์ ( gส่วนต่อท้าย regex แทนAll)
Neil

@Nil มันยาวกว่าที่นี่เพราะใช้f=(s)=>แทนs->ซึ่งสั้นกว่า 4 ไบต์
Luca H

1
@LucaH - ตามคำแนะนำของ FrownyFrog คุณสามารถลดจำนวนตัวอักษรสองตัวของคุณให้เหลือเพียงตัวอักษรเดียว: z | f | s แทนที่จะเป็น ze | fo | fi | si | se /
Forty3

6

C (gcc) , 179 159 146 139 137 116 107 103 102 ไบต์

แก้ไข 1: (เพิ่มคำแนะนำจากMr. Xcoder - ขอบคุณ! - เวอร์ชันมาโครของฉันมีขนาดเท่ากับของคุณ แต่ฉันชอบที่ดีกว่า)

แก้ไข 2: เปลี่ยนผู้ใช้ถ่านเปรียบเทียบกับการโทรstrchr()

แก้ไข 3: K&R คือการประกาศ var (Eww!)

แก้ไข 4: เมื่อ 1 แมโครไม่เพียงพอ ...

แก้ไข 5: ทำ ใหม่ด้วยอัลกอริทึมใหม่ที่แนะนำข้างต้น ขอบคุณJames Holdernessสำหรับแนวคิดที่ยอดเยี่ยมนี้!

แก้ไข 6: ลบ 0 set ตามที่ดูเหมือนว่าจะไปที่นั่นโดยอัตโนมัติ - ใช้เทคนิคการตีกอล์ฟระดับมาสเตอร์ ( คอมม่า , เคล็ดลับ printf เป็นต้น) - ขอบคุณGastropner !

แก้ไข 7: ใช้ memchr และแก้ไขข้อผิดพลาดที่James Holdernessระบุ

แก้ไข 7: ใช้&&ในการตรวจสอบครั้งสุดท้ายที่จะเข้ามาแทนที่?- ขอบคุณ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);}

ลองออนไลน์!

Non-golfed (ซึ่งยังคงเป็นกอล์ฟอย่างสุจริต ... )


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

วิธีการแก้ปัญหา grep-esqe แบบเก่าไปข้างหน้า:

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

รุ่นเก่าและสะอาดกว่า

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

ลองออนไลน์!


เราสามารถแมโคร putchar และเช่นนี้สำหรับไม่กี่ไบต์ แต่โดยทั่วไปยังคงคิดเกี่ยวกับอัลกอริทึมที่ดีกว่าถ้าเป็นไปได้
Michael Dorgan

159 ไบต์โดย#defineไอเอ็นจีputcharและลบคู่ของวงเล็บที่ไม่จำเป็น
Mr. Xcoder

2
บิตน่าเกลียด แต่136 ไบต์โดยใช้#define p putchar(แทน (หมายเหตุวงเล็บเปิด)
Tom Carpenter

1
109 bytesc,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

อาเคล็ดลับ printf ที่ฉันเห็นด้านล่างบวกลบวงเล็บคู่และวงเล็บปีกกา เปิดการใช้งานรหัสระดับกอล์ฟ :)
Michael Dorgan

5

JavaScript, 66 57 52 44 41 ไบต์

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

ไร้เดียงสาสวย แต่มันได้ผล

จับได้ดีโดย FrownyFrog ที่จะใช้ 2 ตัวอักษร .. ยกเว้น "หนึ่ง" ซึ่งการตรวจสอบถ่าน 2 ตัวที่บริสุทธิ์อาจทำให้เกิดปัญหากับซีโรนีน แก้ไข: ซิงเกิ้ลfและsถูกจับได้ดีโดย FrownyFrog ที่ฉันมองข้ามสองกอล์ฟแรกของฉัน

ขอบคุณ Neil สำหรับคำแนะนำของแลมบ์ดาที่ไม่มีชื่อและความสามารถในการใช้ถ่านตัวเดียวzได้ลดลงเหลือ 52

Titus เกิดขึ้นกับ RegEx ที่เล็กกว่า ฉันรู้สึกว่าเรากำลังมุ่งหน้าไปยัง regex ของ Uriel ในที่สุด


มันพังไหมถ้าคุณใช้ตัวละครสองตัวและกด 'on' จนจบ?
FrownyFrog

ฉันกำลังคิดz|tw|th|f|s|ei|ni|on
FrownyFrog

1
@FrownyFrog o มาก่อนดังนั้นจึงได้รับการยอมรับก่อน
Uriel

1
on|t[wh]|.i|[fsz](-4 ไบต์)
ติตัส

2
@Titus - น่าเสียดายที่การon|จับคู่นั้นจะzeronineแสดงผลzer onine
Forty3


5

C, 103 99 ไบต์

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

ใช้งานได้กับการเข้ารหัสอักขระใด ๆ (รวมถึงตัวที่น่าอึดอัดใจเช่น EBCDIC) เพราะมันไม่ได้ใช้ค่าตัวเลขของอักขระอินพุต แต่จะหาตำแหน่งตัวอักษรตัวแรกและตัวที่สามในสตริงมายากล ระยะห่างระหว่างสิ่งเหล่านี้บ่งบอกถึงจำนวนจดหมายที่จะก้าวไปพร้อมกับการพิมพ์แต่ละครั้ง

โปรแกรมทดสอบ

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

1
สามารถบันทึกบางไบต์ได้โดยใช้การเรียกซ้ำ: tio.run/##XY/…
jxh

4

J , 37 35 ไบต์

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

ลองออนไลน์!


2
ทางเลือกที่ยอดเยี่ยม! ฉันลองf=:[:>'..[eox]|[tse]?....'&rxallแล้วมันทำงานได้ดี แต่ก็ไม่ได้ทำงานใน TIO
Galen Ivanov

นี่มันฉลาดจริงๆทำได้ดีมาก
โยนาห์

@GalenIvanov TIO มีการเปิดตัวล่าสุดมันอาจเป็นการถดถอยใน J.
FrownyFrog

4

C (gcc) , 106 ไบต์ 104 ไบต์

-2 ไบต์ต้องขอบคุณ @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);}

ลองออนไลน์!

แฮคเกอร์เป็นพันธมิตรที่ยิ่งใหญ่ที่สุดของเราอย่างแท้จริง


ชอบเคล็ดลับ s ++ แฮชที่ดี
Michael Dorgan

1
s[1]จะสั้นลง
jxh

@jxh หนึ่งที่ดี! Updated
Gastropner



3

Pip , 27 ไบต์

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

รับอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่ง ลองออนไลน์!

ทดแทน regex [zfs]|one|[ent][iwh]ง่ายแทรกช่องว่างก่อนการแข่งขันแต่ละครั้งของ


กระโดดขึ้นไปบน bandwagon ของการขโมย regex ของ Uriel ให้23 ไบต์ (มี-sธง):

a@`..[eox]|[tse]?....`


3

เยลลี่ ,  23  21 ไบต์

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

เอาต์พุตการแยกบรรทัดการพิมพ์โปรแกรมแบบเต็ม หมายเหตุ: เมื่อเสร็จแล้วจะพิมพ์บรรทัดว่าง ๆ "ตลอดไป" ซ้ำ ๆ (จนกว่าจะถึงขีด จำกัด การเรียกซ้ำครั้งใหญ่หรือความผิดพลาดแบบแยกส่วน)

ลองออนไลน์! (เอาท์พุท TIO สะสมการใช้งานในท้องถิ่นจะพิมพ์ทีละบรรทัด)

อย่างไร?

เริ่มต้นด้วยรายการตัวอักษรโปรแกรมซ้ำ ๆ :

  1. ค้นหาความยาวของคำแรกของรายการอักขระโดยใช้คณิตศาสตร์อันดับ;
  2. พิมพ์คำบวกกับตัวป้อนบรรทัด และ
  3. ลบคำออกจากส่วนหัวของรายการอักขระ

ความยาวของคำแรกนั้นตัดสินใจโดยการตรวจสอบอักขระสามตัวแรกของรายการอักขระปัจจุบัน (จำเป็นต้องเป็นส่วนหนึ่งของคำแรก) โปรแกรมแปลงสิ่งเหล่านี้เป็นเลขตัวคูณเพิ่มเข้าด้วยกัน modulos ผลลัพธ์โดย 953, modulos ที่เจ็ด, modulos ที่สามและเพิ่มสาม:

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
ฉันไม่แน่ใจว่าได้รับอนุญาตหรือไม่ (อย่างจริงจังคุณจะทำอย่างไรเมื่อ meta-
answer upvote

OP ระบุอย่างชัดเจนว่า "เอาต์พุตของคุณอาจมีสตริงดังกล่าวที่จุดเริ่มต้นหรือสิ้นสุด" และโปรแกรมนี้จะพิมพ์ตามจริงดังนั้นจึงสร้างเอาต์พุตก่อนที่จะมีการยกเลิกการบังคับใด ๆ
Jonathan Allan

แน่นอน แต่ฉันไม่คิดว่า OP ถือว่าเป็นสตริงสิ้นสุดที่ไม่มีที่สิ้นสุด และเมตาคำถามคืออย่างชัดเจนเกี่ยวกับกรณีที่พิมพ์ออกมาก่อน
Ørjan Johansen

ฉันคิดว่ามันเติมเต็มวิญญาณของความต้องการ (ถ้าเป็นตัวอย่างพิมพ์สตริงว่างที่ไม่มีที่สิ้นสุดและจากนั้นคำที่ฉันอาจโต้แย้งมันไม่ได้)
Jonathan Allan

ดังนั้นฉันเดาว่าทำให้ฉันอยู่ในค่ายของมาร์ติน "ถ้าเป็นโปรแกรมและสามารถปรับ ... " :)
Jonathan Allan

3

C 168 ,145,144, 141 ไบต์

แก้ไข: พยายาม init 'i' เป็น 1 อย่างนั้น

A, B; หลัก (i)

เพื่อกำจัดช่องว่างนำหน้า
แต่มันหยุดที่อินพุตเริ่มต้นด้วยสามเจ็ดหรือแปด

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

ลองออนไลน์

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

ลองออนไลน์

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

ลองออนไลน์!

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 ไม่จำเป็นต้องมีขนาดใหญ่โดยการเปลี่ยน << 8
แต่ในกรณีที่คุณสามารถเปรียบเทียบกับสตริงอย่างใดมันควรจะเป็นธรรมชาติมากที่สุด

146การใช้การเปรียบเทียบสตริง

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

ใช้การเปรียบเทียบสตริง

ยุ่งเหยิง

#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

ค่อนข้างยาวเลยทีเดียว คุณสามารถลงเล่นกอล์ฟได้

R , 109 ไบต์

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

ลองออนไลน์!


มีวิธีใดบ้างในการใช้อักขระ Unicode แทนที่จะเป็นตัวเลข?
Michael Dorgan

แอพลิเคชันที่ดีของintToUtf8! 90 ไบต์จะเป็นไปได้โดยใช้วิธีการที่แตกต่างกันโดยใช้ regexp:function(x,p=paste,z=p("(",p(c("zero",broman::numbers),collapse="|"),")"))gsub(z,"\\1 ",x)
ไมเคิล M

2

Haskell , 81 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

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 (ไม่มี regex) , 85 ไบต์

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

ลองออนไลน์!


2
ยินดีต้อนรับสู่ PPCG!
Laikoni

เป็นเรื่องดี แต่โปรแกรมเต็มรูปแบบจะต้องมีรหัสเพื่อรับข้อมูล
Jonathan Allan

ดังนั้นเป็นโปรแกรมเต็มรูปแบบ104 ไบต์ อย่างไรก็ตามคุณสามารถบันทึกได้ 4 โดยใช้while s[i:]จากนั้นคุณสามารถลดขนาดได้ถึง93 ไบต์โดยส่งการเรียกซ้ำlambda(ฟังก์ชั่นจะต้องส่งคืนผลลัพธ์แทนที่จะพิมพ์ด้วยตัวเอง)
Jonathan Allan

2

Excel, 181 ไบต์

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

สถานที่พื้นที่ในด้านหน้าของ: z, on, tw, th, f, s, ei,ni


2

ชุดประกอบ Z80 ขนาด46 45 ไบต์

; 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

(มันสนุกที่จะปรับเปลี่ยน regex สุดเจ๋งของ Uriel ให้เข้ากับสภาพแวดล้อมที่ไม่เป็นมิตรกับ regex)


1

เจลลี่ , 40 39 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

“¢¤Ƙƒ⁺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  83 68 65  63 ไบต์

-15 ขอบคุณ Lynn (refactor เป็นฟังก์ชั่นเดียว)
-3 ต้องขอบคุณ Lynn (หลีกเลี่ยงการทำดัชนีในรายการที่มีเลขคณิตมากขึ้น)
... นำไปสู่การบันทึกอีก 2 ไบต์ (หลีกเลี่ยงวงเล็บด้วยโมดูลเชิงลบ) :)

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

ฟังก์ชั่นที่พิมพ์คำที่คั่นด้วยการขึ้นบรรทัดใหม่แล้วเพิ่ม IndexErrorฟังก์ชั่นที่พิมพ์คำที่แยกจากกันโดยการขึ้นบรรทัดใหม่แล้วยก

ลองออนไลน์! (ไม่ใส่ข้อยกเว้นเพื่อให้มีการเรียกใช้หลายครั้งภายในชุดทดสอบ)


ฉัน revisiting นี้จำนวนมากต่อมาและตระหนักถึงนี้อาจจะ 68 ไบต์:def f(s):h=[4,5,3][ord(s[0])*ord(s[1])%83%7%3];print(s[:h]);f(s[h:])
ลินน์

โอ้ว้าวh(s)และh(s)ฉันไม่สังเกตเห็นได้อย่างไร! ขอบคุณลินน์!
Jonathan Allan

ฉันไม่แน่ใจว่าฉันจะกลับมาที่คำถามนี้ได้อย่างไรและสังเกตสิ่งใหม่ ๆ แต่h=(ord(s[0])*ord(s[1])%83%7+1)%3+3มีขนาด 65 ไบต์! :)
ลินน์

เฮ้ขอบคุณ Lynn ที่อนุญาตให้เล่นเพิ่มอีกสองไบต์เช่นกัน!
Jonathan Allan


0

Mathematica ขนาด 125 ไบต์

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


ลองออนไลน์!

TIO ส่งข้อความแสดงข้อผิดพลาดเกี่ยวกับ "CountryData" (???)
ฉันไม่รู้ว่าทำไมถึงเกิดเหตุการณ์นี้ขึ้น แต่ eveything ใช้งานได้ดีใน Mathematica



0

q / kdb +, 59 51 ไบต์

วิธีการแก้:

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

ตัวอย่าง:

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"

คำอธิบาย:

วิธีแก้ปัญหาอย่างรวดเร็วอาจเป็นวิธีที่ดีกว่าและเล่นกอล์ฟได้มากกว่า

{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

หมายเหตุ:

46 ไบต์ด้วยการเล่นกอล์ฟแบบง่าย ๆ แทนที่ q การโทรด้วย k แต่ยังคงเป็นโซลูชันที่หนักหน่วง

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.