Скасувати цифри скасування


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 ! Це викликало кілька дивовижних відповідей на С. Я сподіваюся, що незабаром побачу когось із таких :)
Лінн

Я не думаю, що моя відповідь С не кваліфікується як така, але, сподіваюсь, це відправна точка для інших з більш закрученим почуттям гумору, ніж я.
Майкл Дорган

Я впевнений, що бачив цей самий виклик, але там, де ви повинні надрукувати фактичну кількість. Я майже впевнений, що це також опублікував, ти, Лінн; але я втратив посилання, підчепи мене?
Magic Octopus Urn

3
@MichaelDorgan (або будь-які інші C-кодери), ви можете ознайомитись з алгоритмом, який я використовував у своїй відповіді Befunge. Пряме перетворення цього на C отримало рішення, що має 104 байти, що, на мою думку, перемагає всі існуючі відповіді на C. Я готовий зробити ставку на те, що міг би покращитись хтось із більш навичками гольфу на С.
Джеймс Холдернес

Відповіді:



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) Зарахування Toby Speight за ідею використання 1-го та 3-го.
(75) Кредит Майклу Доргану за '0'48.
(72) Заслуга Майкла Доргана та Лінн для літераторів з контрольними символами.
(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

Python 2 , 50 байт

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

Спробуйте в Інтернеті!

-3 завдяки Лінні .
-4 завдяки Уріель «s відповідь регулярний вираз» s.


3
Приємно! import re;re.compile('…').findallмає зберегти пару байт. Я очікував, що це перетвориться на гольф regex :)
Лінн

@Lynn Тримайся, чекай, коли я закінчу! :-P EDIT: Насправді це 3 байти.
Ерік Аутгольфер

@Lynn Крім того, ви повинні перетворити це на регулярний вираз code-golf . ;)
Ерік Покірний

Я тримаюсь за відповідь С, що буде дуже цікаво!
Лінн

9

Befunge, 87 85 81 76 байт

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

Спробуйте в Інтернеті!

Befunge не має жодних інструкцій щодо маніпуляцій з рядками, тому ми робимо своєрідний хеш із трьох останніх символів, які ми зустрічаємо під час їх обробки.

По суті, цей хеш - це тризначне, базове число 104. Кожен раз, коли читається новий символ, ми модифікуємо хеш із 104 2, щоб позбутися найдавнішого символу, помножимо його на 104, щоб звільнити місце для нового символу, а потім додамо значення ASCII нового символу mod 27 (щоб переконатися він не переповнює).

Для порівняння ми беремо це значення мод 3817, записуємо його в пам'ять (таким чином обрізаючи його до 8 біт), що призводить до меншої кількості, що простішим для Befunge обробляти. Хеші, з якими ми тоді маємо порівнювати, - це 0, 38, 59, 64, 88, 92, 114, 117 і 123. Якщо він відповідає будь-якому з них, ми знаємо, що ми зустріли послідовність символів, що позначає кінець число, тому ми виводимо додатковий простір і скидаємо хеш до нуля.

Якщо вам цікаво, чому база 104 або чому мод 3817, ці значення були ретельно підібрані так, щоб хеш-список, з яким потрібно порівняти, міг бути представлений якомога менше байтів.


Досить чесно, це мені схоже на бакемоджі (ば け も じ). Ого. Опис алгоритму приємний, але я його споглядаю.
Майкл Дорган

^, Я пам’ятаю, що термін бачив як mojibake (も じ ば け). Як ви знайшли ці числа (база 104, мод 3187), @JamesHolderness?
Zacharý

@ Zacharý Я написав невеликий сценарій Python, який перевіряв різні комбінації баз і мод, щоб знайти ті, які дадуть правильні результати при роботі з усіма очікуваними введеннями. Як тільки я зрозумів, які комбінації спрацьовували, я провів отримані хеш-виходи через генератор номерів Befunge, щоб з'ясувати, який виробляв найкоротший код.
Джеймс Холдернесс

6

Java (OpenJDK 8) , 55 46 43 байт

Збереження 9 байт завдяки Forty3 / FrownyFrog

Збереження 3 байт завдяки Титу

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

Спробуйте в Інтернеті!

редагувати: Дякую за привітання та пояснення лямбдів!


3
Привіт, Ласкаво просимо до PPCG! Чудова перша відповідь, і вона справді працює. Ось посилання TIO для цього. Лямбди можна створити декількома способами. Ось ще один ТІО з деякими лямбдами з доданими коментарями, щоб ви могли бачити, як їх створити самостійно. (Я пропоную скопіювати його на Eclipse, щоб ви могли виділити підсвічування коду.) Також, поради щодо гольфу на Яві та Поради щодо гольфу на всіх мовах можуть бути цікавими для читання. Насолодитися перебуванням! :)
Кевін Кройсейсен

@KevinCruijssen дякую! Я чесно здивований, що Java коротша, ніж JavaScript. Зазвичай, коли я читаю виклики, JS набагато коротше.
Лука H

JavaScript повинен бути на 2 байти коротшим ( gсуфікс регулярного вираження замість All).
Ніл

@Neil тут довше, тому що він використовує f=(s)=>замість s->, що на 4 байти коротше.
Лука H

1
@LucaH - за пропозицією FrownyFrog, ви можете зменшити декілька своїх двобуквенних рядків до окремих символів: z | f | s замість ze | fo | fi | si | se /
Сорок3

6

C (gcc) , 179 159 146 139 137 116 107 103 102 байт

Редагувати 1: (Додано пропозиції містера Xcoder - спасибі! - Моя версія макросу була такої ж величини, як і ваша, але мені подобається ваша краще.)

Редагувати 2: Змінено індивідуальну таблицю порівняння з дзвінкамиstrchr()

Редагувати 3: K & R - вар-декларації (Eww!)

Редагувати 4: Коли одного макроса недостатньо ...

Редагування 5: Повторіть новий алгоритм, запропонований вище. Дякуємо Джеймсу Холдерсу за цю чудову ідею!

Редагувати 6: Видалено 0 наборів, як здається, там автоматично йде - Використовуються методи гольф-коду на рівні рівня (коми, трюк printf тощо) - дякую gastropner !

Edit 7: Використовуйте memchr та виправляйте помилку, на яку вказав Джеймс Холдернес .

Редагування 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(' ');
    }
}

Спробуйте в Інтернеті!


Ми можемо макросувати путхар та таке на кілька байтів, але загалом, все-таки думаючи про кращий алгоритм, якщо це можливо.
Майкл Дорган

159 байт шляхом #defineінгаляції putcharта видалення пари непотрібних дужок.
Містер 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)));}
гастропнер

Ах, фокус printf, який я бачив нижче, плюс вилучення круглих дужок та дужок. Основний код гольфу включений :)
Michael Dorgan

5

JavaScript, 66 57 52 44 41 байт

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

Досить наївно, але це працює.

Хороший улов FrownyFrog, щоб використати 2 символи .. крім «однієї», чиста перевірка на два знака може зіпсувати зеронін. Редагувати: сингл fі sхороший улов FrownyFrog, що я не помітив своїх перших двох гольфів.

Дякую, Ніл, за пропозицію неназваної лямбда та за те, що ти можеш використати єдину таблицю для отримання, zзнижується до 52.

Тит придумав менший RegEx. Я відчуваю, що ми врешті рухаємось до регексу Уріеля.


Чи зламається, якщо ви використовуєте два символи і натискаєте "на" до кінця?
FrownyFrog

Я думаюz|tw|th|f|s|ei|ni|on
FrownyFrog

1
@FrownyFrog o виходить першим, тому його визнають першим.
Уріель

1
on|t[wh]|.i|[fsz](-4 байти)
Тіт

2
@Titus - На жаль, рендерінг on|збігатиметьсяzeroninezer 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.
Гален Іванов

це дійсно розумно, молодець
Йона

@ GalenIvanov TIO має останню версію, це може бути регресія в Дж.
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);}

Спробуйте в Інтернеті!

XOR - це справді наш найбільший союзник.


Як і трюк s ++. Гарний хеш.
Майкл Дорган

1
s[1]буде коротше.
jxh

@jxh Приємний! Оновлено.
гастропнер



3

Піп , 27 байт

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

Вводиться як аргумент командного рядка. Спробуйте в Інтернеті!

Проста заміна регулярних виразів, вставляє пробіл перед кожним матчем [zfs]|one|[ent][iwh].


Стрибки на смужку крадіжки запозичень Уриельський вираз дає 23 байти-sпрапором):

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


3

Желе ,  23  21 байт

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

Виведення повної програми для друку ліній-стрічок розділене. Примітка. Після того, як це зроблено, він неодноразово друкує порожні рядки "назавжди" (до величезного обмеження рекурсії або "seg-fault")

Спробуйте в Інтернеті! (Вихід TIO накопичується; локальна реалізація буде друкуватись за рядком)

Як?

Починаючи зі списку символів, програма кілька разів:

  1. знаходить довжину першого слова списку символів, використовуючи деяку порядкову математику;
  2. друкує слово плюс подачу рядка; і
  3. вилучає слово з голови списку символів

Довжину першого слова визначають шляхом огляду перших трьох символів поточного списку символів (обов’язково частини першого слова). Програма перетворює їх на порядок, множує їх разом, модулює результат на 953, модулів - на сім, модулює - на три і додає три:

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

ОП чітко зазначає, що "Ваш вихід може також необов'язково мати такі рядки на початку чи в кінці", і ця програма насправді друкує в міру її надходження, тому результат виводиться до будь-якого примусового припинення в будь-якому випадку.
Джонатан Аллан

Звичайно, але я не думаю, що ОП вважається нескінченним кінцевим рядком. І мета-питання явно стосується випадку, коли вихід друкується першим.
Ørjan Johansen

Я думаю, що це відповідає духу вимоги (якщо, наприклад, вона надрукувала нескінченно порожні рядки, а потім слова, які я можу стверджувати, це не зробили)
Джонатан Аллан

Отже, я думаю, що це вводить мене в табір Мартіна "якщо це програма і може виправдати ..." :)
Джонатан Аллан

3

С 168 ,145,144, 141 байт

EDIT: Спробував init 'я' до 1 подібного

a, b; main (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;}

Спробуйте в Інтернеті!

Безумовно

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 замість цифр?
Майкл Дорган

Приємного застосування intToUtf8! 90 байт було б можливим, використовуючи інший підхід, використовуючи regexp:function(x,p=paste,z=p("(",p(c("zero",broman::numbers),collapse="|"),")"))gsub(z,"\\1 ",x)
Michael 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 (без регулярного вираження) , 85 байт

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

Спробуйте в Інтернеті!


2
Ласкаво просимо до PPCG!
Лайконі

Це добре, але повна програма повинна містити код, щоб взяти вклад.
Джонатан Аллан

Отже, як повноцінна програма 104 байти . Однак ви можете зберегти 4, скориставшись, while s[i:]і тоді ви можете зменшити їх до 93 байтів , подавши рекурсивну lambdaфункцію (функції потрібно лише повернути вихід, а не надрукувати його самі).
Джонатан Аллан

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

(Було весело адаптувати крутий регекс Uriel до непривітного для регулярних виразів).


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 , без регулярного вираження,  83 68 65  63 байт

-15 завдяки Lynn (рефактор в єдину функцію)
-3 більше завдяки Lynn (уникайте індексації у списку з більшою арифметикою)
... що веде до іншого збереження 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:])
Лінн

Ох вау, h(s)а h(s)як я не помітив ?! Дякую Лінн!
Джонатан Аллан

Я не впевнений, як я все ще повертаюся до цього питання і помічаю нові речі, але h=(ord(s[0])*ord(s[1])%83%7+1)%3+3це 65 байт! :)
Лінн

Хе, спасибі Лінн, що дозволила відібрати ще два байти!
Джонатан Аллан


0

Математика, 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



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:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.