数字を折りたたみません


72

仕事

次のように、数字の英語名の文字列が一緒に「折りたたまれ」ている場合:

zeronineoneoneeighttwoseventhreesixfourtwofive

文字列を分割して数字に戻します。

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

ルール

  • 入力は常に文字列です。常に1つ以上の小文字の英語の数字名で構成され、一緒に折りたたまれ、それ以外は何もありません。

    • 英語の数字の名前は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
これを考えた後、私は同様の、しかしより単純なアナーキーゴルフの挑戦を思い出した:はい!それはいくつかの驚くべきC回答を引き起こしました。そのうちの1つをすぐに見たいと思います:)
リン

私のCの答えはそのようなものだとは思わないが、うまくいけば、それは自分よりもひねくれたユーモアのセンスを持つ他の人の出発点になるだろう。
マイケルドーガン

私はこれと同じチャレンジを見たことがあると確信していますが、実際の数字を印刷することになっています。あなたもリンが投稿したことはほぼ確実です。しかし、私はリンクを失いました、それで私をつなぎますか?
魔法のタコUr

3
@MichaelDorgan(または他のCコーダー)、Befungeの回答で使用したアルゴリズムをご覧ください。それをCに直接変換すると、104バイトのソリューションが得られました。これは、既存のCのすべての答えに勝ると思います。より多くの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ハッシュのgastropnerの功績。
(76)1番目と3番目を使用するというアイデアは、Toby Speightの功績によるものです。
(75)クレジットマイケル・ドーガンため'0'48
(72)制御文字を含むリテラルについてはMichael DorganLynnの功績。
(69)クレジット・リンについて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 Lynnに感謝します。
-4 Urielanswerの正規表現に感謝します。


3
いいね!import re;re.compile('…').findall数バイトを節約する必要があります。私はこれが正規表現ゴルフに変わることを期待していました:)
リン

@Lynnちょっと待って、完了するまで待ってください!:-P編集:実際には3バイトです。
エリックアウトゴルファー

@Lynnまた、これを代わりにcode-golf regular-expressionに変更する必要があります。;)
アウトゴルファーのエリック

私は非常に興味深いCの回答を待っています!
リン

9

Befunge、87 85 81 76バイト

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

オンラインでお試しください!

Befungeには文字列操作命令がないため、処理するときに、最後の3文字のハッシュの一種を作成します。

このハッシュは、基本的に3桁のbase-104番号です。新しい文字が読み取られるたびに、最も古い文字を取り除くためにハッシュを104 2で修正し、104を掛けて新しい文字用のスペースを作り、新しい文字mod 27のASCII値を追加します(確認するためにオーバーフローしません)。

比較のために、この値mod 3817を取得してメモリに書き込みます(したがって、8ビットに切り捨てます)。これにより、Befungeで処理しやすい数値が小さくなります。次に比較しなければならないハッシュは、0、38、59、64、88、92、114、117、および123です。これらのいずれかに一致する場合、aの終わりを示す文字シーケンスに遭遇したことがわかります。数値なので、追加のスペースを出力し、ハッシュをゼロにリセットします。

なぜベース104なのか、なぜmod 3817なのか疑問に思っているなら、比較する必要のあるハッシュリストを可能な限り少ないバイト数で表現できるように、これらの値は慎重に選択されました。


正直なところ、これは私にはバケモジ(ばけもじ)のように見えます。ワオ。アルゴリズムの説明は素晴らしいですが、私はそれを熟考します。
マイケルドーガン

^、もじばけという言葉を見たことを覚えています。これらの数字(ベース104、mod 3187)、@ JamesHoldernessはどうやって見つけましたか?
ザカリー

@Zacharý私は、さまざまなベースとmodの組み合わせをテストして、予想されるすべての入力に対して実行したときに正しい結果が得られるものを見つける小さなPythonスクリプトを作成しました。どの組み合わせが機能するかがわかったら、結果のハッシュ出力をBefunge数ジェネレーターで実行して、どのコードが最短コードを生成したかを見つけました。
ジェームズホルダーネス

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でゴルフのヒント、すべての言語でのゴルフのためのヒントを読んでも面白いかもしれません。滞在を楽しんで!:)
ケビンクルーイッセン

@KevinCruijssenありがとうございます!正直なところ、JavaはJavaScriptよりも短いことに驚いています。通常、課題を読んでいるとき、JSはずっと短いです。
ルカH

JavaScriptは2バイト短くする必要があります(gではなく正規表現の接尾辞All)。
ニール

@Neil は、4バイト短いのf=(s)=>代わりに使用しているため、ここでは長くなりますs->
ルカH

1
@LucaHは- FrownyFrogの提案ごとに、あなたは、単一の文字にあなたの二文字列の数を減らすことができます:Z | F | Fiの| | SI | foは|代わりにZEのS- 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セットを削除しました-マスターレベルコードのゴルフテクニック(コンマ、printfトリックなど)を使用- ガストロプナーに感謝

編集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などを数バイトでマクロ化できますが、一般的には、可能であれば、より良いアルゴリズムを検討します。
マイケルドーガン

159のバイトによって#defineINGの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)));}
-gastropner

ああ、私が下で見たprintfのトリックに加えて、カッコと括弧の削除。マスターレベルコードゴルフが有効になった:)
マイケルドーガン

5

JavaScript、66 57 52 44 41バイト

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

かなり素朴ですが、動作します。

FrownyFrogが2つの文字を使用するのは素晴らしいキャッチです。「1」を除き、純粋な2文字のチェックがzeronineを台無しにする可能性があります。編集:シングルfs、最初の2つのゴルフを見逃したFrownyFrogの良いキャッチでした。

ニール、名前のないラムダの提案と、z52 文字まで取得できる単一の文字を使用できることに感謝します。

タイタスは、より小さな正規表現を考え出します。最終的にはウリエルの正規表現に向かっていると思います。


2つの文字を使用して最後に「オン」を押すと壊れますか?
FrownyFrog

私は考えていますz|tw|th|f|s|ei|ni|on
-FrownyFrog

1
@FrownyFrog oが最初に来るため、最初に認識されます。
ウリエル

1
on|t[wh]|.i|[fsz](-4バイト)
タイタス

2
@タイタス-残念ながら、レンダリング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などの扱いにくい文字を含む)で機能します。代わりに、マジックストリングの最初と3番目の文字を見つけます。これらの間の距離は、各印刷で進む文字数を示します。

テストプログラム

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

1
一部のバイトは、再帰を使用して保存できます:tio.run
##XY

4

J37 35バイト

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

オンラインでお試しください!


2
クールな代替ソリューション!試したところf=:[:>'..[eox]|[tse]?....'&rxall、interpeterで動作しましたが、TIOでは動作しません。
ガレンイワノフ

これは本当に賢く、よくやった
ジョナ

@GalenIvanov TIOには最新のリリースがあり、Jのリグレッションの可能性があります。
FrownyFrog




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. 文字のリストの先頭から単語を削除します

最初の単語の長さは、現在の文字リストの最初の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
これが許可されているかどうかはわかりません。(真剣に、2つの大きく賛成したメタ回答が互いに反対だとしたらどうしますか?)
ØrjanJohansen

OPは「出力の先頭または末尾にオプションでそのような文字列を含めることもできます」と明示的に述べており、このプログラムは実際に印刷されるため、出力は強制終了の前に生成されます。
ジョナサンアラン

確かに、しかし、OPは無限の終わりの文字列とは考えていません。そして、メタ質問は、出力が最初に印刷される場合について明示的にあります。
Ørjanヨハンセン

それは要件の精神を満たしていると思います(たとえば、無限の空の文字列を印刷し、それから私が主張しなかった言葉がそうならなかった場合)
ジョナサンアラン

だから、私はそれが「プログラムであり、正当化できるなら...」というマーティンのキャンプに私を入れると思います:)
ジョナサンアラン

3

C 168145144、141バイト

編集:init 'i'を1にしようとしました

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

オンラインでお試しください!


数字の代わりにユニコード文字を使用する方法はありますか?
マイケルドーガン

の素敵なアプリケーションintToUtf8!90のバイトは、正規表現を使用して、異なるアプローチを使用することにより可能である: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(正規表現なし)、85バイト

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

オンラインでお試しください!


2
PPCGへようこそ!
ライコニ

それは素晴らしいことですが、完全なプログラムには、入力を受け取るためのコードを含める必要があります。
ジョナサンアラン

したがって、完全なプログラムとして104バイト。ただし、を使用while s[i:]して4を保存し、再帰を送信することで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")

目の前にスペースを配置します:zontwthfseini


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

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:])
Lynn

すごいああ、h(s)そしてh(s)どのように私は気付きませんでした!ありがとうリン!
ジョナサンアラン

この質問に戻って新しいことに気付く方法がわかりませんh=(ord(s[0])*ord(s[1])%83%7+1)%3+3が、65バイトです!:)
リン

リン、ありがとう、もう2バイトもゴルフをすることができました!
ジョナサンアラン


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で問題なく動作します



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.