Uncollapse 자리


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 답변이 촉발되었습니다. 나는 곧 그 중 하나를 볼 수 있기를 바랍니다 :)
Lynn

내 C 답변이 그렇게 자격이 있다고 생각하지는 않지만 자신보다 유머 감각이 더 다른 사람들에게 시작점이기를 바랍니다.
Michael Dorgan

나는이 같은 도전을 보았지만 실제 숫자를 인쇄 해야하는 곳이라고 확신합니다. 나는 그것이 또한 당신에 의해 게시되었다는 것을 거의 확신합니다. Lynn; 하지만 링크를 잃어 버렸습니다.
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) XOR 해시에 대한 가스 트로프 너의 기여 .
(76) 1과 3을 사용하는 아이디어에 대한 Toby Speight의 공로 .
로 (75) 신용 마이클 Dorgan 에 대한 '0'48.
(72) 제어 문자가있는 리터럴에 대해서는 Michael DorganLynn 에게 감사 합니다.
(69) Lynn에 대한 크레딧 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

파이썬 2 , 50 바이트

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

온라인으로 사용해보십시오!

Lynn 덕분에 -3 . Uriel답변 정규식
덕분에 -4 감사합니다 .


3
좋은! import re;re.compile('…').findall몇 바이트를 저장해야합니다. 나는 이것이 정규식 골프로 바뀔 것이라고 기대했다 :)
Lynn

@Lynn 잠깐만, 내가 끝날 때까지 기다려! :-P EDIT : 실제로 3 바이트입니다.
Outgolfer Erik

@Lynn 또한 이것을 코드 골프 정규 표현식으로 바꿔야 합니다. ;)
Outgolfer Erik

C 답변을 기다리고 있습니다. 매우 흥미로울 것입니다!
Lynn

9

베 펀지, 87 85 81 76 바이트

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

온라인으로 사용해보십시오!

Befunge에는 문자열 조작 명령어가 없으므로 처리하는 동안 마지막 3 개의 문자를 일종의 해시로 만듭니다.

이 해시는 기본적으로 3 자리, 기본 -104 숫자입니다. 새 문자를 읽을 때마다 가장 오래된 문자를 제거하기 위해 104 2 로 해시를 수정하고 새 문자를위한 공간을 만들기 위해 104를 곱한 다음 새 문자 mod 27의 ASCII 값을 추가합니다 (확인하기 위해) 넘치지 않습니다).

비교 목적으로, 우리는이 모드 mod 3817을 메모리에 쓰고 (따라서 8 비트로 자름), Befunge가 다루기가 더 쉬운 작은 숫자를 만듭니다. 그런 다음 비교해야 할 해시는 0, 38, 59, 64, 88, 92, 114, 117 및 123입니다.이 중 하나와 일치하면 문자 시퀀스가 ​​발생했음을 알 수 있습니다. 추가 공간을 출력하고 해시를 0으로 재설정합니다.

왜 base 104 또는 mod 3817인지 궁금하다면, 그 값을 신중하게 선택하여 비교해야 할 해시 목록을 가능한 한 적은 바이트로 표시 할 수 있습니다.


솔직히 이것은 bakemoji (ば け も じ)처럼 보입니다. 와. 알고리즘 설명은 훌륭하지만 숙고 할 것입니다.
Michael Dorgan

^, 나는 mojibake (も じ ば け)라는 용어를 본 것을 기억합니다. 그 숫자 (base 104, mod 3187), @JamesHolderness를 어떻게 찾았습니까?
Zacharý

@ Zacharý 필자는 예상되는 모든 입력에 대해 실행될 때 올바른 결과를 얻을 수있는 다른 기본 및 모드 조합을 테스트하는 작은 Python 스크립트를 작성했습니다. 어떤 조합이 효과가 있는지 알고 나면 Befunge 숫자 생성기를 통해 결과 해시 출력을 실행하여 가장 짧은 코드를 생성 한 것을 알아 냈습니다.
James Holderness

6

Java (OpenJDK 8) , 55 46 43 바이트

Forty3 / FrownyFrog 덕분에 9 바이트 절약

Titus 덕분에 3 바이트 절약

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

온라인으로 사용해보십시오!

편집 : 람다의 환영과 설명에 감사드립니다!


3
안녕하세요, PPCG에 오신 것을 환영합니다! 훌륭한 첫 번째 대답이며 실제로 작동합니다. 여기에 TIO 링크가 있습니다. 람다는 여러 가지 방법으로 만들 수 있습니다. 여기에 주석이 추가 된 람다가 포함 된 또 다른 TIO가 있으므로 직접 작성하는 방법을 볼 수 있습니다. (코드를 강조 표시하려면 Eclipse로 복사하는 것이 좋습니다.) 또한 Java 에서의 골프 팁모든 언어에서의 골프 팁은 흥미로울 수 있습니다. 체류를 즐길 수! :)
Kevin Cruijssen

@KevinCruijssen 감사합니다! Java가 JavaScript보다 짧다는 것은 솔직히 놀랍습니다. 일반적으로 과제를 읽을 때 JS는 훨씬 짧습니다.
Luca H

JavaScript는 2 바이트 더 짧아야합니다 ( g대신에 정규식 접미사 All).

@Neil f=(s)=>대신 s->4 바이트 더 짧은을 사용하고 있기 때문에 여기 더 깁니다 .
Luca H

1
@LucaH-FrownyFrog의 제안에 따라 두 글자 문자열 중 일부를 단일 문자로 줄일 수 있습니다. ze | fo | fi | si | se / 대신 z | f | s
Forty3

6

C (GCC) , 179 (159) 146 139 137 116 107 103 102 바이트

편집 1 : ( Xcoder 씨의 제안 추가 -감사합니다!-내 매크로 버전은 귀하의 크기와 동일하지만 더 좋습니다.)

편집 2 : 변경된 char 개별과 통화 비교strchr()

편집 3 : K & R의 var 선언 (Eww!)

편집 4 : 매크로가 충분하지 않은 경우 ...

편집 5 : 위에서 제안한 새로운 알고리즘으로 다시 실행하십시오. 이 훌륭한 아이디어에 대해 James Holderness 에게 감사드립니다 !

편집 6 : 자동으로 이동하는 것처럼 0 세트가 제거되었습니다-마스터 레벨 코드 골프 기술 (쉼표, 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);}

온라인으로 사용해보십시오!

골프가 아닌 사람 (정직하게 골프를 치는 사람은 ...)


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(합니다 (공백 괄호 참조).
톰 카펜터

1
109 바이트c,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 트릭과 괄호와 괄호 제거. 마스터 레벨 코드 골프 : 가능
마이클 Dorgan에게

5

자바 스크립트, 66 57 52 44 41 바이트

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

꽤 순진하지만 작동합니다.

FrownyFrog에 의해 2 문자를 사용하는 좋은 캐치 .. 순수한 2 문자 확인이 0을 엉망으로 만들 수있는 "하나"를 제외하고. 편집 : 싱글 fsFrownyFrog에 의해 좋은 캐치 내가 처음 두 골프를 간과했다.

명명되지 않은 람다를 제안하고 단일 문자를 사용할 수있는 z52 세로 감사 합니다.

Titus는 더 작은 RegEx를 제공합니다. 우리는 우리 엘레 (Uriel)의 정규 표현식으로 향하고 있다고 생각합니다.


두 문자를 사용하고 끝까지 'on'을 누르면 중단됩니까?
FrownyFrog

나는 생각하고 있어요z|tw|th|f|s|ei|ni|on
FrownyFrog

1
@FrownyFrog o가 먼저 오므로 먼저 인식됩니다.
우리엘

1
on|t[wh]|.i|[fsz](-4 바이트)
Titus

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하고 interpeter에서 일했지만 TIO에서는 작동하지 않습니다.
Galen Ivanov

이것은 정말 영리하고 훌륭합니다
Jonah

@GalenIvanov TIO는 최신 릴리스를 보유하고 있으며 J에서 회귀가 될 수 있습니다.
FrownyFrog





3

젤리 ,  23  21 바이트

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

전체 프로그램 인쇄 라인 피드 분리 출력. 참고 : 일단 완료되면 빈 줄을 "영원히"반복적으로 인쇄합니다 (큰 재귀 한계 또는 세그 결함이있을 때까지)

온라인으로 사용해보십시오! (TIO 출력이 누적되고 로컬 구현은 라인별로 인쇄됩니다)

어떻게?

문자 목록으로 시작하여 프로그램은 다음을 반복적으로 수행합니다.

  1. 일부 서수 수학을 사용하여 문자 목록에서 첫 번째 단어의 길이를 찾습니다.
  2. 단어와 줄 바꿈을 인쇄합니다. 과
  3. 문자 목록의 머리에서 단어를 제거합니다

첫 번째 단어의 길이는 현재 문자 목록의 첫 세 문자 (필수적으로 첫 번째 단어의 일부)를 검사하여 결정됩니다. 프로그램은 이들을 서수로 변환하고, 그것들을 곱하고, 결과를 953, 모듈로를 7로, 모듈로를 3으로, 3을 더합니다 :

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
이것이 허용되는지 확실하지 않습니다 . (확실히 말해서 두 개의 메타 답변이 서로 반대되는 말을 할 때 어떻게해야합니까?)
Ørjan Johansen

OP에는 명시 적으로 "출력에 선택적으로 이러한 문자열이 시작 또는 끝에있을 수 있습니다"라고 표시되어 있으며이 프로그램은 실제로 진행되는대로 인쇄되므로 강제 종료 전에 출력이 생성됩니다.
Jonathan Allan

물론 OP는 무한한 끝 문자열을 고려하지 않았다고 생각합니다. 그리고 메타 질문은 출력이 먼저 인쇄되는 경우에 관한 것입니다.
Ørjan Johansen

나는 (이, 예를 들어, 무한 빈 문자열을 인쇄하는 경우는 요구 사항의 정신을 충족 생각 다음 단어 나는 그것을하지 않았다 주장 할 수 있음)
조나단 앨런

그래서, 그게 "이 프로그램이고 정당화 할 수 ... 경우": 마틴 캠프에 나를두고 추측
조나단 앨런

3

168 ,145,144, 141 바이트

편집 : init 'i'를 1로 시도했습니다.

a, b; 메인 (i)

선행 공백을 제거하려면
3, 7, 8로 시작하는 입력에서 중단됩니다.

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

온라인으로 사용해보십시오!

언 골프

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 상수는 a << 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)}

온라인으로 사용해보십시오!


숫자 대신 유니 코드 문자를 사용하는 방법은 무엇입니까?
Michael Dorgan

의 좋은 응용 프로그램 intToUtf8! regexp를 사용하는 다른 접근 방식을 사용하면 90 바이트가 가능합니다.function(x,p=paste,z=p("(",p(c("zero",broman::numbers),collapse="|"),")"))gsub(z,"\\1 ",x)
Michael M

2

하스켈 , 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

파이썬 3 (정규식 없음) , 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

(우리엘의 멋진 정규식을 정규식이 아닌 환경에 적응시키는 것이 재미있었습니다).


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

파이썬 3 , 정규 표현식 없음,  83 68 65  63 바이트

Lynn 덕분에 -15 (단일 함수로 리팩터링)
-Lynn 덕분에 -3 더 산술 (더 많은 산술로 목록에 인덱싱하지 않음)
... 2 바이트의 또 다른 저장으로 이어짐 (음수 모듈로 괄호 피하기) :)

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

줄 바꿈으로 구분 된 단어를 인쇄 한 다음을 발생시키는 함수입니다 IndexError.

온라인으로 사용해보십시오! (테스트 스위트 내에서 다중 실행을 허용하도록 예외를 억제 함)


나는 이것을 나중에 다시 방문하고 68 바이트가 될 수 있음을 깨닫고있다 :def f(s):h=[4,5,3][ord(s[0])*ord(s[1])%83%7%3];print(s[:h]);f(s[h:])
Lynn

와우, h(s)그리고 h(s)어떻게 알지 못했습니까?! 고마워 린!
Jonathan Allan

나는이 질문에 어떻게 계속 되돌아 와서 새로운 것을 알아 차릴 지 잘 모르지만 h=(ord(s[0])*ord(s[1])%83%7+1)%3+365 바이트입니다! :)
Lynn

Heh, Lynn에게 감사합니다. 2 바이트를 더 골라 낼 수있었습니다!
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"(???)에 대한 오류 메시지를 출력합니다.
왜 이런 일이 발생하는지 모르겠지만 Mathematica에서 eveything이 제대로 작동합니다.



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.