Menerapkan tumpukan


44

Saya tidak percaya kita belum memiliki ini .. Ini salah satu struktur data yang paling penting dalam pemrograman, namun masih cukup sederhana untuk mengimplementasikannya dalam :

Tantangan

Tugas Anda adalah mengimplementasikan tumpukan yang memungkinkan mendorong dan membuka nomor, untuk menguji implementasi Anda dan membuat I / O tetap sederhana, kami akan menggunakan pengaturan berikut:

  • Input akan menjadi daftar bilangan bulat non-negatif

Setiap bilangan bulat positif menunjukkan dorongan ( n ) dan setiap 0 menunjukkan pop () - membuang elemen atas.nDorong(n)0pop ()

  • Output akan menjadi tumpukan yang dihasilkan

Contoh

Misalnya jika kita diberikan :[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]

Outputnya adalah: [28,101,12]

Aturan

  • Input akan menjadi daftar bilangan bulat non-negatif dalam format I / O standar apa pun
    • Anda dapat menggunakan bilangan bulat negatif untuk menandai akhir dari aliran bilangan bulat
  • Output akan berupa daftar / matriks / .. dari stack yang dihasilkan
    • pilihan Anda di mana elemen atas akan (di awal atau akhir), output hanya harus konsisten
    • output fleksibel (mis. integer dipisahkan oleh baris baru akan baik-baik saja), satu-satunya hal yang penting adalah urutannya
    • Anda dapat menggunakan bilangan bulat negatif untuk menandakan bagian bawah tumpukan
  • Anda dijamin tidak akan pernah ada ketika tumpukan kosong0

Contohnya

[] -> []
[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
Perlu dicatat bahwa, mengingat kondisinya, seseorang sebenarnya tidak perlu mengimplementasikan stack.
Jeff Zeitlin

Jika Anda ingin seseorang benar-benar mengimplementasikan stack, Anda mungkin perlu mencoba memasukkan sesuatu ke dalam Sandbox.
mbomb007

@ mbomb007: Diijinkan: "pilihan Anda di mana elemen teratas akan berada (di awal atau akhir)"
ბიმო

@ mbomb007: Tidak akan lebih sulit jika Anda harus membalikkan input, bukan? Selain itu, jika Anda menganggap pengaturan sebagai tumpukan yang menentukan apa yang atas dan apa yang di bawah dan mengapa satu definisi tidak semena-mena?
ბიმო

@ OMᗺ Karena inputnya terlihat agak seperti tumpukan / daftar / array. Sekarang, seluruh tantangan pada dasarnya menghapus angka yang diikuti oleh nol.
mbomb007

Jawaban:


19

MATL , 6 byte

"@?@}x

Input adalah vektor deretan angka.

Tumpukan terakhir ditampilkan terbalik, dengan elemen terbaru di bawah ini.

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

"         % 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 byte

Karena "[keluaran] fleksibel [...], satu-satunya hal yang penting adalah urutan", ini mengubah array input menjadi 0array -minminasi. Contoh: [1,0,2]akan mengembalikan [2,0,2]yang akan ditafsirkan sebagai = .[2,0,2][2]

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

Cobalah online!

Versi sebelumnya:

Java (JDK 10) , 60 byte

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

Cobalah online!

Kredit:

Jika saya dapat mengakhiri program dengan kesalahan: 55 byte

(meskipun semuanya dimodifikasi dengan benar)

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

Cobalah online!


4
Ini agak mengesankan. Anda dapat kehilangan 1 byte dengan menggunakan >0karena tidak akan pernah ada nol di awal daftar (yang akan menyiratkan bagian atas tumpukan berada di -1).
OOBalance

@OOBalance Memang, saya belum memikirkan hal itu., Terima kasih!
Olivier Grégoire

12

Sed, 17 Bytes

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

-3 byte terima kasih kepada @ OMᗺ, -1 terima kasih kepada @eggyal

Karena Anda dijamin tidak akan pernah mengeluarkan daftar kosong, Anda tidak perlu apa-apa selain mesin keadaan terbatas yang diulang. Ekspresi reguler adalah alat untuk membangun mesin negara yang terbatas, dan seddapat digunakan kembali. Ini pasangan yang dibuat di surga.

Mengambil input dari stdin, seperti:

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

Menghasilkan tumpukan secara terbalik:

[12,101,28]

Bisa lebih kecil dua byte jika sedkelas karakter lokal saya mengerti seperti suka \d, tetapi tidak karena alasan tertentu.


1
Selamat datang di PPCG! Bagus, milik saya lebih panjang (menggunakan format input berbeda) .. Btw. Anda dapat menggunakan label kosong karena Anda hanya menggunakan 1 dan karena Anda mengulangi prosesnya, Anda gakan dihemat - 4 byte: Cobalah secara online!
ბიმო

G tidak mubazir! Itu membuat kompleksitas kasus runtime terburuk tergantung pada kedalaman pops berurutan, bukan jumlah pops! Bukan berarti efisiensi penting dalam kode golf :)
Tacroy

1
Kalimat terakhir Anda menjawab pertanyaan tentang redundansi: P Btw. bagaimana Anda menghitung byte? Saya mendapatkan 18, mungkin Anda memasukkan baris baru di akhir atau sesuatu.
ბიმო

Yup, itu adalah baris baru.
Tacroy

1
Jika elemen terakhir dari input adalah 0 maka tidak akan cocok dengan regex Anda.
eggyal

12

PowerShell , 46 41 40 byte

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

Cobalah online!

Mengambil input melalui splatting, misalnya $z=@(12,3,0,101,11,1,0,0,14,0,28); .\implement-stack.ps1 @z, yang pada TIO bermanifestasi sebagai argumen terpisah.

$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 byte berkat mazzy.
-1 byte swapping $_ke1


Apakah splatting menyimpan 3 byte $agrs? :)
mazzy

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

1
@ Mazzy Ya, dan kami baru saja berbicara tentang splatting! Saya sudah lupa! lol Terima kasih!
AdmBorkBork

Tidak akan splatting menjadi .\implement-stack.ps1 @z(tidak $z), jika tidak , Anda hanya melewati array sebagai argumen pertama / satu-satunya
pinkfloydx33

@ pinkfloydx33 Yap. Mengetik di bagian saya.
AdmBorkBork

11

C (gcc) , 62 60 56 55 byte

-2 -6 byte berkat l4m2

-1 byte berkat ceilingcat .

Menggunakan gagasan yang diizinkan dari -1 array yang diakhiri. f()menyebut dirinya secara rekursif, sampai sepenuhnya terluka, dan kemudian mundur melalui daftar. rmelacak berapa banyak angka yang harus dibuang sebelum mencetak sesuatu. Meningkat jika item saat ini adalah 0, berkurang jika tidak. Jika 0, kita tidak perlu membuang, dan dapat mencetak nomornya.

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

Cobalah online!


f(l)int*l;=> f(int*l)?
14m2

@ l4m2 Ah, tepuk tangan! Mungkin sisa dari hari-hari sebelumnya, lebih banyak variabel-sarat.
gastropner

yang r=0tampaknya tidak berguna
l4m2

@ l4m2 Ya, tangkapan yang bagus.
gastropner


10

R , 45 byte

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

Cobalah online!

  • -4 byte terima kasih kepada @Giuseppe

1
48 byte - penyalahgunaan Fjuga akan membuat Anda menjadi 48 byte tetapi ini lebih bersih imho
Giuseppe

Saya tidak tahu bagaimana saya melewatkan inversi if-else: facepalm: ... terima kasih!
digEmAll


1
A R+pryrdan Reducesolusinya adalah 44 byte
JayCe

@JayCe: jujur ​​saja, saya lebih suka menyimpannya sebagai solusi "base-R" ... tapi jangan ragu untuk mempostingnya sebagai jawaban Anda sendiri! ;)
digEmAll


9

Jelly , 6 byte

ṣ0Ṗ;¥/

Cobalah online!

Bagaimana itu bekerja

ṣ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.

Apakah ini akan meniru tiga muncul jika ada tiga nol berturut-turut?
WGroleau

Iya. [1,3,7,0,0,0], misalnya, akan dipecah menjadi [[1,3,7],[],[],[]], dan setiap langkah dari pops pengurangan-kiri pada elemen array kiri.
Dennis

9

Brain-Flak , 40 36 byte

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

Cobalah online!

Berkat @Nitrodon untuk -4 byte.

Karena Brain-Flak sudah menggunakan tumpukan, ini adalah teka-teki yang bagus untuk 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
Dalam kasus khusus ini, {{}<>{}<>}dapat disingkat menjadi {{}<>}.
Nitrodon

@Nitrodon Terima kasih. Bisakah Anda jelaskan, mengapa ini masih berhasil? Itu tidak beralih kembali ke tumpukan input dalam loop.
Dorian

1
Bagian atas tumpukan output dijamin bukan nol, sehingga loop pendek dijalankan 0 atau 2 kali.
Nitrodon

8

Bahasa Wolfram (Mathematica) , 28 byte

#//.{a___,b_,0,c___}:>{a,c}&

Cobalah online!


(ini hanya berfungsi karena "Pola default adalah memiliki pola yang sebelumnya cocok dengan urutan terpendek" , jadi tidak perlu memastikan bahwa bitu bukan nol.)
user202729

@ user202729 Yap. Pencocokan pola Mathematica tidak serakah, jadi ia mencoba untuk mencocokkan yang sesingkat mungkin a___terlebih dahulu. Orang dapat melihatnya dengan mencoba ReplaceList[#, {a___, b_, 0, c___} :> {a, c}] &. Pada catatan yang terkait, StringReplacesebenarnya serakah, jadi pengajuan ini tidak akan bekerja dengan StringReplace(dengan pola seperti a___~~b_~~"0"~~c___)
JungHwan Min

8

Python 2 , 48 byte

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

Cobalah online!


Apakah Anda bisa menjelaskan cara kerjanya? Saya telah mencoba untuk menyelesaikannya selama setengah jam terakhir! Tentunya 2*0**xakan selalu demikian 0. Saya jelas melewatkan sesuatu.
ElPedro

1
@ ElPedro Ini bukan nol ketika x=0, dalam hal ini 2.
xnor

Ah, aku mengerti maksudmu. Kira saya terlihat terlalu keras dan kehilangan yang jelas! Terima kasih dan jawaban yang bagus.
ElPedro

7

Spasi , 89 byte

[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]

Huruf S(spasi), T(tab), dan N(baris baru) ditambahkan hanya sebagai penyorotan.
[..._some_action]ditambahkan sebagai penjelasan saja.

Membawa input-list baris-baru dipisahkan dengan -1untuk menunjukkan bahwa kita sudah selesai dengan input.

Cobalah online .

Penjelasan dalam pseudo-code:

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

7

Python 2 , 60 59 57 56 byte

l=input()
while 0in l:i=l.index(0);l[i-1:i+1]=[]
print l

Cobalah online!


Disimpan:

  • -1 byte, terima kasih kepada pushkin

Anda dapat menghemat satu byte dengan menghapus spasi di antara 0danin
pushkin

2
Selamat atas 10K
ElPedro

6

JavaScript, 40 byte

Output dalam urutan terbalik.

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

Cobalah online

1 byte diselamatkan berkat Herman L .


a=>a.map(x=>x?o.push(x):o.pop(),o=[])&&olebih pendek satu byte
Herman L

@HermanL: D'oh! Tentu saja! Terima kasih. Sudah menggunakan (un)shiftsebelum saya melihat keluaran bisa dibalik.
Shaggy

Ini berfungsi karena odireferensikan dalam callback setelah didefinisikan dalam argumen kedua.
MattH

6

05AB1E , 9 byte

vy>i¨ëy)˜

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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)

Alternatif 9 byte :

vy_i\ëy])

Cobalah secara online untuk memverifikasi semua kasus uji .

Penjelasan:

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: Jika output seharusnya dibalik agar sesuai dengan kasus pengujian dalam deskripsi tantangan, kita dapat menambahkan trailing Rke versi kedua (jadi 10 byte ), yang membalikkan daftar. Cobalah secara online atau verifikasi semua kasus uji .


5

Retina 0.8.2 , 18 byte

^
,
+1`,\d+,0

^,

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

^
,

Awali ekstra ,.

+1`,\d+,0

Memproses semua operasi pop.

^,

Hapus ,jika masih ada.

Membalikkan angka akan dikenakan biaya 8 byte tambahan:

O^$`\d+

Yang hanya mengganti semua <number>, 0sublist dengan tidak ada.
user202729


5

Brain-Flak , 36 byte

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

Cobalah online!

#Let's call the two stacks in and out

([]){{}                      ([])}    # while not in.empty()
       {        (  )}{}               # if in.peek() != 0
        (({}<>)) <>                   # a = in.pop; out.push(a); out.push(a)
                       <>{}<>         # out.pop()
                                  <>  # switch to out to be printed


5

V , 10 byte

ò/ 0⏎b2dw0

Cobalah online!

Penjelasan

ò           " 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

Setara dalam Vim , 16 byte

qq/ 0⏎b2dw0@qq@q

Cobalah online!

Penjelasan

Hampir sama, kecuali merekam makro qdan menyebutnya secara rekursif:

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 byte

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

Output dipisahkan oleh koma. Bagian atas tumpukan adalah yang terakhir. Cobalah online di sini .

Terima kasih kepada Olivier Grégoire untuk bermain golf 2 byte.

Silakan periksa jawaban Java Kevin Cruijssen dan Olivier Grégoire juga. Mereka mengambil pendekatan berbasis daftar sebagai gantinya, dengan yang terakhir mengalahkan tambang dengan margin yang rapi.

Tidak Disatukan:

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
}

Pendekatan yang bagus dengan Strings. Lebih baik daripada pendekatan naif saya dengan objek yang sebenarnya Stack. +1 dari saya.
Kevin Cruijssen

1
n->{var s="";for(int i:n)s=(s+","+i).replaceAll(",\\d+,0$","");return s;}(73 byte), tetapi menempatkan ,angka sebelum, bukan setelah.
Olivier Grégoire

1
n->{var s=""+n;for(int x:n)s=s.replaceFirst("\\d+, 0,? ?","");return s;}(72 byte), menggunakan daftar alih-alih array dan mengacaukan output karena dapat mengembalikan hal-hal seperti "[, 2]"
Olivier Grégoire

@ OlivierGrégoire Nice. Kita dapat menghapus $untuk menyimpan byte tambahan, karena setiap yang 0kita tambahkan dihapus segera.
OOBalance

@ OlivierGrégoire Pendekatan kedua Anda juga menarik, tapi saya pikir format output yang tidak konsisten dapat membatalkan solusi.
OOBalance

5

GolfScript , 14 12 byte

~{.{;}if}/]`

Cobalah online!

~{.{;}if}/]` Full program, implicit input
~            Eval input
 {      }/   Foreach:
      if       If the value is truthy (!= 0):
  .              Push itself
   {;}         Else: pop the top value
          ]` Push as array representation
             Implicit output


5

> <> , 25 byte

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

Cobalah online! (input harus ditulis dalam ascii. jika tidak gunakan ini )

Bagaimana itu bekerja

i:?\~~memeriksa 0, terus ~~menghapus entri sebelumnya. jika tidak turun ke:

(0:/:^? yang memeriksa -1 (tidak ada input lagi), lalu membungkus untuk menghapus -1 dan loop:

!?l:!<oan; yang menampilkan setiap nomor dengan baris baru, lalu berakhir ketika tumpukan dikosongkan



5

Sekam , 6 byte

Karena belum ada jawaban Husk dan itu golf-lang favorit saya:

F`?:tø

Cobalah online!

Penjelasan

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

Solusi alternatif, 6 byte

Alih-alih membalik, kita juga bisa membalik daftar dan kemudian menggunakan lipatan-kanan: Ḟ?:tø↔


5

brainfuck , 214 150 byte

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

Membaca input sebagai angka yang dipisahkan oleh baris baru. Ini harus menyertakan satu baris tambahan. Juga tidak mengharapkan angka nol di setiap nomor. Output sebagai daftar terpisah baris baru yang serupa

Cobalah online!

Penjelasan yang sebenarnya bukan penjelasan tetapi sebenarnya hanya versi yang saya kerjakan dengan komentar dan hal-hal yang mungkin atau mungkin tidak benar-benar bermanfaat bagi siapa pun

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 byte

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

Cobalah online!

-1 byte, dan yang lebih penting ini terasa seperti cara yang kurang kikuk dalam melakukan ini.

~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

Pengganti 21 alternatif: ∋0∧ℕ₁;0;P↺c;Qc?∧P,Q↰| Cobalah online!


Kode lama:

22 byte

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

Cobalah online!

∋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

Peringatan: Banyak garis terjadi. Anda telah diperingatkan.


CJam , 17 byte

Kode paling berbahaya
(Asumsikan elemen tumpukan dapat dipisahkan oleh hanya spasi di output dan bahwa array input dapat berupa apa pun yang kita inginkan)

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

Cobalah online!

Penjelasan

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

Kode Alternatif # 1, 27 byte
(Mengasumsikan elemen stack harus berupa output dalam format yang ditunjukkan dalam pertanyaan dan bahwa array input dapat berupa bentuk apa pun yang kita inginkan)

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

Cobalah online!

Penjelasan

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

Kode Alternatif # 2, 24 byte
(Asumsikan elemen tumpukan dapat disusun dalam output dan bahwa array input harus dalam format yang tepat seperti yang ditunjukkan dalam pertanyaan)

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

Cobalah online!

Penjelasan

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

Kode paling aman untuk ini, 34 byte
(Mengasumsikan elemen stack harus berupa output dalam format yang ditunjukkan dalam pertanyaan dan bahwa array input harus dalam format yang tepat seperti yang ditunjukkan dalam pertanyaan)

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

Cobalah online!

Penjelasan

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

Terima kasih kepada @ Jo King untuk menunjukkan bahwa yang dengan keluaran yang disusun tidak valid karena hal-hal seperti [12]dan[1,2] tidak dapat dibedakan.

Terima kasih juga kepada @ Jo King yang menyediakan alternatif yang sangat cocok untuk output yang dikumpulkan dan memotong 9 byte!


1
Yang pertama tidak valid karena Anda tidak bisa membedakan antara [12]dan [1,2]. Namun, versi 27 byte tampaknya baik-baik saja, meskipun Anda dapat menyingkirkan spasi dan kurung selama 18 byte
Jo King

oh, tentu saja, saya sangat berterima kasih banyak
Helen

Namun mungkin akan lebih mudah untuk memisahkan angka dengan spasi daripada koma karena spasi menggunakan ]S*(3) sedangkan koma menggunakan ]',*(4)
Helen

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.