スタックの実装


44

まだこれがないとは信じられません。これはプログラミングで最も重要なデータ構造の1つですが、で実装するのに十分なほどシンプルです。

チャレンジ

あなたの仕事は、数字をプッシュしたりポップしたりできるスタックを実装することです。実装をテストし、I / Oをシンプルに保つために、次のセットアップを使用します。

  • 入力は、負でない整数のリストになります

正の整数はすべてを示し、はすべて示し -最上部の要素を破棄します。push( n 0 pop()npush(n)0pop()

  • 出力は結果のスタックになります

たとえば、が与えられた場合:[12,3,0,101,11,1,0,0,14,0,28]

12[12]3[3,12]0[12]101[101,12]11[11,101,12]1[1,11,101,12]0[11,101,12]0[101,12]14[14,101,12]0[101,12]28[28,101,12]

出力は次のようになります。[28,101,12]

ルール

  • 入力は、デフォルトのI / O形式の非負整数のリストになります
    • 整数のストリームの終わりを示すために負の整数を使用できます
  • 出力は、結果のスタックのリスト/マトリックス/ ..になります
    • 最上部の要素がどこにあるか(開始または終了)を選択すると、出力は一貫している必要があります。
    • 出力は柔軟です(たとえば、改行で区切られた整数は問題ありません)、重要なことは順序だけです
    • 負の整数を使用してスタックの最下部を示すことができます
  • スタックが空のとき、決してにならないことが保証されています0

[] -> []
[1] -> [1]
[1,0,2] -> [2]
[4,0,1,12] -> [12,1]
[8,3,1,2,3] -> [3,2,1,3,8]
[1,3,7,0,0,0] -> []
[13,0,13,10,1,0,1005,5,0,0,0] -> [13]
[12,3,0,101,11,1,0,0,14,0,28] -> [28,101,12]

12
条件を考えると、実際にスタックを実装する必要はないことに注意してください。
ジェフ

誰かに実際にスタックを実装してもらいたい場合は、サンドボックスに何かを置く必要があるかもしれません。
mbomb007

@ mbomb007:いずれかが許可されている:「トップ要素は(先頭または末尾)になりますあなたの選択」
ბიმო

@ mbomb007:入力を逆にする必要があったとしても、これ以上難しいことではないでしょうか?また、セットアップを最上位と最下位を定義するスタックと見なす場合、1つの定義がbe意的ではないのはなぜですか?
ბიმო

@OMᗺ入力はスタック/リスト/配列のように見えるためです。今、全体の課題は基本的にゼロに続く数字を削除することです。
mbomb007

回答:


19

MATL、6バイト

"@?@}x

入力は数値の行ベクトルです。

最終スタックは上下逆さまに表示され、最新の要素が下に表示されます。

オンラインでお試しください!または、すべてのテストケースを確認します

説明

"         % For each element in the input (implicit)
  @       %   Push current element
  ?       %   If non-zero (this consumes the current element)
    @     %     Push current element again
  }       %   Else
    x     %     Delete most recent element
          %   End (implicit)
          % End (implicit)
          % Display (implicit)

13

Java(JDK 10)、42バイト

「[the]出力は柔軟です[...]、重要なのは順序だけです」ため、これは入力配列を- 0終端配列に変更します。例:= として解釈されるもの[1,0,2]を返します。[2,0,2][2,0,2][2]

a->{int s=0;for(int v:a)a[v>0?s++:--s]=v;}

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

以前のバージョン:

Java(JDK 10)、60バイト

l->{for(int i;(i=l.indexOf(0))>0;l.remove(i))l.remove(--i);}

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

クレジット:

エラーでプログラムを終了できる場合:55バイト

(ただし、すべてが適切に変更されています)

l->{for(int i;;l.remove(--i))l.remove(i=l.indexOf(0));}

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


4
これはかなり印象的です。>0リストの先頭にゼロがないため、使用すると1バイトを失う可能性があります(スタックの最上部がにあったことを意味します-1)。
OOBalance

@OOBalance確かに、私はそれについて考えていませんでした。ありがとう!
オリヴィエグレゴワール

12

Sed、17バイト

:;s/[0-9]\+,0//;t

@OMᗺのおかげで-3バイト、@ eggyalのおかげで-1バイト

空のリストを決してポップしないことが保証されているので、反復有限状態マシン以上のものは必要ありません。正規表現は、有限状態マシンを構築するためのツールであり、sed反復することができます。天国で行われた試合です。

次のように、stdinから入力を取得します。

echo '[12,3,0,101,11,1,0,0,14,0,28]' | sed ':;s/[0-9]\+,0,//;t'

スタックを逆に出力します。

[12,101,28]

私のローカルがsed本質的にのような文字クラスを理解している場合、2バイト小さくすることができます\dが、何らかの理由でそうではありません。


1
PPCGへようこそ!いいですね、私の方が長かったです(異なる入力形式を使用)。1のみを使用し、プロセスを反復するため、空のラベルを使用できます。これgは冗長です。4バイトを節約します。オンラインで試してください!
ბიმო

gは冗長ではありません!最悪の場合、実行時の複雑さは、ポップの数ではなく、連続したポップの深さに依存します!コードゴルフではその効率は重要ではありません:)
タクロイ

1
最後の文は、冗長性に関する質問に答えます。どのようにバイトを数えましたか?おそらく18が返されますが、おそらく最後に改行が含まれているか、何かです。
ბიმო

うん、それは改行だった。
タクロイ

1
入力の最後の要素が0の場合、正規表現と一致しません。
-eggyal

12

PowerShell46 41 40バイト

$args|%{$x,$a=&({1,$_+$a},{$a})[!$_]};$a

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

スプラッティングを介して入力を受け取り$z=@(12,3,0,101,11,1,0,0,14,0,28); .\implement-stack.ps1 @zます。たとえば、TIOでは個別の引数として現れます。

$args|%{$x,$a=&({1,$_+$a},{$a})[!$_]};$a    # Full program
$args                                       # Take input via splatting
     |%{                            };      # Loop through each item
              &(              )[!$_]        # Pseudo-ternary, if input is 0 this is 1
        $x,$a=            {$a}              # ... which will pop the first item into $x
           $a=  { ,$_+$a}                   # Else, we append the first item
        $x   =   1                          # ... and drop a dummy value into $x
                                      $a    # Leave $a on pipeline; implicit output

-5バイトはmazzyのおかげです。
-1バイトスワップ$_1


スプラッティングは3バイトを節約し$agrsますか?:)
奇抜な

-2バイト$args|%{$x,$a=&({$_,$_+$a},{$a})[!$_]};$a
mazzy

1
@mazzyはい、スプラッティングについて話しました!もう忘れた!笑ありがとう!
AdmBorkBork

スプラッティングはないだろう.\implement-stack.ps1 @z(ない$zそうでないあなただけの最初の/唯一の引数として配列を渡している、)
pinkfloydx33

@ pinkfloydx33うん。私のタイプミス。
AdmBorkBork

11

C(gcc)62 60 56 55バイト

-2 -6バイト、l4m2のおかげ

ceilingcatのおかげで-1バイト。

-1で終了する配列の許可された概念を使用します。f()完全に傷つくまで再帰的に自分自身を呼び出し、リストをバックトラックします。r何かを印刷する前に破棄する数字の数を追跡します。現在のアイテムが0の場合は増加し、そうでない場合は減少します。0の場合、破棄する必要はなく、番号を印刷できます。

r;f(int*l){~*l?f(l+1),*l?r?r--:printf("%d ",*l):r++:0;}

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


f(l)int*l;=> f(int*l)
l4m2

@ l4m2ああ、乾杯!おそらく、以前よりも変動の激しい時代の名残。
ガストロプナー

r=0役に立たないようだ
l4m2

@ l4m2そう、いいキャッチ。
ガストプナー


10

R、45バイト

o={};for(e in scan())o="if"(e,c(e,o),o[-1]);o

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

  • @Giuseppeのおかげで-4バイト

1
48バイト -乱用Fすると48バイトになりますが、これはよりクリーンな私見です
ジュゼッペ

if-else反転をどのように見逃したかわかりません:facepalm:...ありがとう!
digEmAll


1
A R+pryr及びReduce溶液は44バイト
JayCe

@JayCe:正直に言うと、私はそれを「base-R」ソリューションのままにしておくことを好みます...しかし、あなた自身の答えとして気軽に投稿してください!;)
digEmAll


9

ゼリー、6バイト

ṣ0Ṗ;¥/

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

使い方

ṣ0Ṗ;¥/  Main link. Argument: A (array)

ṣ0      Split A at zeroes.
    ¥/  Left-reduce the resulting 2D array by this dyadic chain:
  Ṗ       Pop; discard the last element of the left argument.
   ;      Concatenate the result with the right argument.

3つの連続したゼロがある場合、これは3つのポップをエミュレートしますか?
WGroleau

はい。[1,3,7,0,0,0]、たとえば、に分割され[[1,3,7],[],[],[]]、left-reduceの各ステップが左の配列の要素にポップします。
デニス

9

Brain-Flak40 36バイト

([]){{}{({}<>)<>}([]){{}<>}{}([])}<>

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

-4バイトの@Nitrodonに感謝します。

Brain-Flakはすでにスタックを使用しているため、これはBrain-Flakにとって良いパズルです。

([]){   while items on stack
    {}      pop stack count
    {       if top element is non-zero
        ({}<>)<> push it on the other stack
    }
    if we're here the stack is either empty or there's a 0 on the stack

    ([])    so, count the stack again
    {{}<>{}<>} if there are items left on the stack, pop the stack count and the last item of the other stack
    {} pop the zero or the stack count
    ([]) count the stack again for next round
}
<>  go to the output stack

2
この特定のケースで{{}<>{}<>}は、に短縮できます{{}<>}
ニトロドン

@Nitrodonありがとうございます。なぜこれがまだ機能するのか説明できますか?ループ内の入力スタックに戻りません。
ドリアン

1
出力スタックの最上部はゼロ以外であることが保証されているため、短縮ループは0回または2回実行されます。
ニトロドン

8

(これは、「デフォルトでは、以前のパターンが最短シーケンスに一致するようになっている」ためにのみ機能するため、bゼロ以外であることを確認する必要はありません。)
user202729

@ user202729はい。Mathematicaのパターンマッチングは貪欲ではないため、可能な限り短いものをa___最初にマッチングしようとします。試してみるとわかりReplaceList[#, {a___, b_, 0, c___} :> {a, c}] &ます。関連ノートでは、StringReplaceこの提出はでは動作しないだろうので、実際に貪欲であるStringReplace(のようなパターンでa___~~b_~~"0"~~c___
JungHwan分

8

Python 2、48バイト

s=[]
for x in input():s=([x]+s)[2*0**x:]
print s

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


これがどのように機能するか説明できますか?私は最後の30分間それを解決しようとしています!きっと2*0**xいつもそう0です。私は明らかに何かが欠けています。
エルペドロ

1
@ElPedroの場合x=0、ゼロではありません。その場合、2です。
xnor18年

ああ、私はあなたが何を意味するかわかります。私は一生懸命探していて、明らかなものを見逃していたと思います!ありがとう、素晴らしい答え。
エルペドロ

7

空白、89バイト

[N
S S N
_Create_Label_LOOP_1][S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_integer][T   T   T   _Retrieve][S N
S _Duplicate_input][N
T   T   S 
_If_neg_Jump_to_Label_EXIT][S N
S _Duplicate_input][N
T   S T N
_If_0_Jump_to_Label_DROP][N
S N
N
_Jump_to_Label_LOOP_1][N
S S S N
_Create_Label_EXIT][S N
N
_Discard_top][N
S S S S N
_Create_Label_LOOP_2][T N
S T _Print_as_integer][S S S T  S T S N
_Push_10_newline][T N
S S _Print_as_character][N
S T S S N
_Jump_to_Label_LOOP_2][N
S S T   N
_Create_Label_DROP][S N
N
_Discard_top][S N
N
_Discard_top][N
S N
N
_Jump_to_Label_LOOP_1]

強調表示としてのみ追加される文字S(スペース)、T(タブ)、およびN(改行)。
[..._some_action]説明としてのみ追加。

入力リストを改行で区切り-1、入力が完了したことを示します。

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

擬似コードの説明:

Start LOOP_1:
  Integer i = STDIN as integer
  If(i is negative):
    Call function EXIT
  If(i is 0):
    Call function DROP
  Go to next iteration of LOOP_1

function EXIT:
  Start LOOP_2:
    Pop and print top as integer
    Print newline
    Go to next iteration of LOOP_2

function DROP:
  Drop the top of the stack
  Go to next iteration of LOOP_1


6

JavaScript、40バイト

逆順で出力します。

a=>a.map(x=>x?o.push(x):o.pop(),o=[])&&o

オンラインで試す

Herman Lのおかげで1バイト節約されました。


a=>a.map(x=>x?o.push(x):o.pop(),o=[])&&o1バイト短い
ハーマンL

@HermanL:D'oh!もちろん!ありがとう。(un)shift出力を元に戻す前に使用していた。
シャギー

これoは、2番目の引数で定義された後、コールバックで参照されるため機能します。
-MattH

6

05AB1E、9 バイト

vy>i¨ëy)˜

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

v        # For-each of the items in the input-list:
 y>i     #  If the current item is 0:
  ¨      #   Pop the top item of the list
 ë       #  Else:
  y      #   Push the current item to the stack
   )     #   Wrap the entire stack into a list
         #    i.e. 12 → [12]
         #    i.e. [12] and 3 → [[12], 3]
    ˜    #   Flatten the stack
         #    i.e. [[12], 3] → [12, 3]
         # (and output the list implicitly after the loop)

9 バイトの代替:

vy_i\ëy])

オンライン試してすべてのテストケース確認します

説明:

v        # For-each of the items in the input-list:
 y_i     #  If the current item is 0:
  \      #   Discard top item of the stack
 ë       #  Else:
  y      #   Push the current item to the stack
]        # Close both the if-else and for-each (short for `}}`)
 )       # Wrap the entire stack into a list (and output implicitly)

PS:チャレンジの説明のテストケースに一致するように出力を逆にする必要がある場合はR、2番目のバージョン(つまり10 バイト)に末尾を追加して、リストを逆にすることができます。オンラインそれを試してみたり、すべてのテストケースを確認してください


5

Retina 0.8.2、18バイト

^
,
+1`,\d+,0

^,

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

^
,

余分なプレフィックスを付け,ます。

+1`,\d+,0

すべてのポップ操作を処理します。

^,

,まだある場合は削除します。

数値を逆にすると、8バイト余分にコストがかかります。

O^$`\d+

これは、すべての<number>, 0サブリストを単に何も置き換えません。
user202729




5

V、10バイト

ò/ 0⏎b2dw0

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

説明

ò           " run the following, until an error occurs
 / 0⏎       " | goto next zero with space in front (errors if none)
     b      " | jump one word back (to the beginning of element to pop)
      2     " | twice (element & zero itself)
       dw   " | | delete word
         0  " | goto beginning of line

Vimで16バイトに相当

qq/ 0⏎b2dw0@qq@q

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

説明

マクロを記録してq再帰的に呼び出すことを除いて、ほぼ同じです。

qq                " record macro q
  / 0⏎b2dw0       " same as in V
           @q     " recursively call q (aborts on error)
             q    " quit recording
              @q  " execute the macro q

5

Java 10、75 72バイト

n->{var s="";for(int i:n)s=(s+","+i).replaceAll(",\\d+,0","");return s;}

コンマで区切られた出力。スタックの一番上が最後です。こちらからオンラインでお試しください。

2バイトのゴルフをしてくれたOlivierGrégoireに感謝します。

Kevin CruijssenOlivierGrégoire Javaの回答もご覧ください。代わりに、リストベースのアプローチを採用し、後者はきちんとマージンを打ちます。

ゴルフをしていない:

n -> { // lambda taking an integer array as argument and returning a String
    var s = ""; // we'll be using a String to implement and output the stack
    for(int i : n) // loop through the array
        s = (s + "," + i) // append the next number
               .replaceAll(",\\d+,0", ""); // remove any number followed by a zero
    return s; // output the resulting stack
}

文字列を使用した素晴らしいアプローチ。実際のStackオブジェクトを使用した単純なアプローチよりも優れています。私から+1。
ケビンCruijssen

1
n->{var s="";for(int i:n)s=(s+","+i).replaceAll(",\\d+,0$","");return s;}(73バイト)、ただし,、後ではなく前の数字を置きます。
オリビエグレゴワール

1
n->{var s=""+n;for(int x:n)s=s.replaceFirst("\\d+, 0,? ?","");return s;}(72バイト)、配列ではなくリストを使用し、 "[、2]"のようなものを返す可能性があるため、出力を混乱させる
OlivierGrégoire18年

@OlivierGrégoireニース。$追加したバイト0はすぐに削除されるため、追加のバイトを保存するためにをドロップできます。
OOBalance

@OlivierGrégoire2番目のアプローチも興味深いものですが、一貫性のない出力形式はソリューションを無効にする可能性があると思います。
OOBalance


5

Perl 5、17 -pバイト

ありがとう@sundarと@DomHastings

s/\d+ 0 ?//&&redo

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


1
-2バイト(わずかに手間のかかる出力):オンラインで試してみてください!
スンダ

@sundarのコメントに加えて、別の簡単な簡略化:オンラインで試してみてください!
ドムヘイスティングス

0942入力のような数字があったとしても失敗しませんか?
Xcali

1
先行ゼロはないと想定しても安全です。
OOBalance

5

> <>、25バイト

i:?\~~
(0:/:^?
!?l:!<oan;

オンラインでお試しください!(入力はASCIIで記述する必要があります。それ以外の場合は、これを使用します)

使い方

i:?\~~0をチェックし、~~前のエントリを削除し続けます。それ以外の場合:

(0:/:^? これは-1(入力がもうない)をチェックしてから、-1を削除してループするためにラップします。

!?l:!<oan; 各番号を改行で出力し、スタックが空になると終了します



5

、6バイト

Huskの回答はまだなく、私のお気に入りのゴルフラングなので:

F`?:tø

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

説明

F`?:tø  --
F    ø  -- foldl (reduce) with [] as the initial accumulator
 `      -- | flip arguments of
  ?:    -- | | if truthy: apply cons (prepend) to it
    t   -- | | else: return tail
        -- | : returns a function, either prepending the element or dropping 1 element

代替ソリューション、6バイト

反転する代わりに、リストを逆にして右折りを使用することもできます。 Ḟ?:tø↔


5

brainfuck214 150バイト

>>,[>++++++[-<-------->]+<[>+++++[-<++++++++>]]>[-<<<[[-]<],[-]>>>>-<<]>>+[<<+<,----------[++++++++++>-]>[->>-<]>[->+<]>]<<<,]<<[[<]++++++++++<]>>[.>]

改行で区切られた数値として入力を読み取ります。これには、単一の末尾の改行を含める必要があります。また、各数値の先頭にゼロがないことを期待しています。同様の改行区切りリストとして出力

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

説明は実際には説明ではありませんが、実際に私がコメントと作業を行っていたバージョンであり、実際には誰にとっても有用である場合とそうでない場合があります

Stack format:
0 (0 \d*)*


>>,[
    Setup digit == '0' conditional
    >++++++
    [-<-------->]
    +
    <[
        Read digit != '0'
        Restore the char code
        cond1 is already 1 at this stage
        >+++++
        [-<++++++++>]
    ]>[
        Read digit == '0'
        -
        Pop previous value
        <<<[
            [-]<
        ]
        Skip next input (assumed to be newline)
        ,[-]
        Skip following loop by unsetting loop flag
        >>>>-
        <<
    ]

    Move to next stack frame
    >
    Set loop flag
    >+[
        Set bit used for conditional
        <<+
        Read next character
        <,
        Compare with '\n'
        ----------[
            Not '\n': restore the char code
            ++++++++++

            >-
        ]>[
            -
            == '\n': Leave as 0
            Unset loop flag
            >>-
            <
        ]

        Copy loop flag along
        >
        [- > + <]

        Move to loop flag of next stack frame
        >
    ]

    <<<
,]


Fill in with newlines
<<[
    Skip to the cell before this value
    [<]
    Put a newline in there
    ++++++++++
    Move to next value
    <
]

Now the tape has the exact values we need to output
>>[.>]

5

Brachylog、21バイト

~c₃Ckt[İ,0]≠∧C⟨hct⟩↰|

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

-1バイト、さらに重要なことは、これはこれを行うためのはるかに不格好な方法のように感じます。

~c₃                     % Partition the input into 3 subarrays
   C                    % Call that array-of-arrays C
    kt[İ,0]             % Its second element should be of the form [Integer, 0]
           ≠            % And its elements shouldn't be equal (i.e. 
                        %   the Integer shouldn't be 0)
            ∧C⟨hct⟩     % Then, remove that [İ, 0] element from C
                   ↰    % And call this predicate recursively
                    |   % When the above fails (when it can't find a partition with 
                        %  [İ, 0] in it), then just output the input

代替21バイト:∋0∧ℕ₁;0;P↺c;Qc?∧P,Q↰| オンラインでお試しください!


古いコード:

22バイト

∋0&b,1;?z{=|¬∋0&}ˢtᵐ↰|

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

∋0           If input contains a 0, 
&b           Remove input's first element, getting list of "next" elements
,1           Append 1 to that to handle last element
;?z          Zip that with input
{      }ˢ    Select only zipped pairs where
 =|          both elements are equal (to keep 0s followed by 0s)
   ¬∋0&      or the pair doesn't contain a 0
             this removes both the (pairs containing the) value
              that is followed by a 0, and the 0 itself
tᵐ           Recover back the (filtered) input array elements from the zip
↰            Call this predicate recursively 
|            If input contains no 0s, input is the output 

5

警告:多くの行が続きます。あなたは警告されました。


CJam、17バイト

最も危険なコード
(スタック要素は出力内のスペースのみで区切ることができ、入力配列は任意の形式にすることができます)

q~{X0={;}X?}fX]S*

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

説明

q                                    Reads input string
 ~                                   Instantly convert to array since the string is in the CJam format
  {        }fX                       For loop
   X0=                               If X (the array element currently being checked) is equal to 0
      {;}                            Pop the top element from the stack
         X                           Else push X onto the top of the stack
          ?                          If-Else flag
              ]                      Collate all stack elements into an array
               S*                    Put a space between each array element

代替コード#
1、27 バイト(質問に示されている形式でスタック要素を出力する必要があり、入力配列はどのような形式でもかまいません)

q~{X0={;}X?}fX]',S+*'[\+']+

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

説明

q                                    Reads input string
 ~                                   Instantly convert to array since the string is in the CJam format
  {        }fX                       For loop
   X0=                               If X (the array element currently being checked) is equal to 0
      {;}                            Pop the top element from the stack
         X                           Else push X onto the top of the stack
          ?                          If-Else flag
              ]                      Collate stack items into an array
               ',S+                  Add together a comma and a space to create a delimiter
                   *                 Apply the delimiter to the stack
                    '[\+             Append left bracket to the left of the stack text
                        ']+          Append right bracket to the right of the stack text

代替コード#
2、24 バイト(スタック要素を出力で照合でき、入力配列は質問に示されている正確な形式である必要があると想定)

q',/~]S*~{X0={;}X?}fX]S*

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

説明

q                        Read input string
 ',/                     Separate by commas (since commas are an invalid array delimiter in CJam)
    ~                    Turn string into an array of substrings that make up the array
     ]S*                 Add spaces in between input numbers to prevent collation in the array
        ~                Turn the string into a valid array representative of the original
         {        }fX    For loop
          X0=            If X (the array element currently being checked) is equal to 0
             {;}         Pop the top element from the stack
                X        Else push X onto the top of the stack
                 ?       If-Else flag
                     ]   Collate all stack elements into an array
                      S* Add a space between each element

このための最も安全なコード、34バイト
(スタック要素は質問に示されている形式で出力する必要があり、入力配列は質問に示されている正確な形式であることが前提です)

q',/~]S*~{X0={;}X?}fX]',S+*'[\+']+

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

説明

q                                      Read input string
 ',/                                   Separate by commas (since commas are an invalid array delimiter in CJam)
    ~                                  Turn string into an array of substrings that make up the array
     ]S*                               Add spaces in between input numbers to prevent collation in the array
        ~                              Turn the string into a valid array representative of the original
         {        }fX                  For loop
          X0=                          If X (the array element currently being checked) is equal to 0
             {;}                       Pop the top element from the stack
                X                      Else push X onto the top of the stack
                 ?                     If-Else flag
                     ]                 Collate stack items into an array
                      ',S+             Add together a comma and a space to create a delimiter
                          *            Apply the delimiter to the stack
                           '[\+        Append left bracket to the left of the stack text
                               ']+     Append right bracket to the right of the stack text

おかげ@Jo王の照合出力を持つものは、のようなものから無効であることを指摘して[12][1,2]区別できないだろう。

また、@ Jo Kingが、丁合された出力に非常に適切な代替手段を提供し、9バイトを切り捨ててくれたことにも感謝します!


1
あなたは違いはわかりませんので、最初のものは有効ではありません[12]やが[1,2]。あなたが空白や括弧を取り除くことができますがしかし、27バイトのバージョンは、大丈夫と思われる18バイト
ジョー・キング

ああ、もちろん私はとても馬鹿です。
ヘレン

しかし、それはおそらく、複数のスペースではなくスペースを使用するので、コンマで別の番号にgolfyされる]S*コンマが使用に対し、(3)、]',*(4)
ヘレン

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.