Daftar De-Nesting


12

Diberikan daftar dengan daftar yang bersarang di dalamnya, kembalikan daftar dengan item daftar yang bersarang di-bersarang.

Memasukkan

Daftar ini akan memiliki, paling banyak, daftar bersarang 4-kedalaman. Hitung semua 0 dalam input sebagai spasi nol.

Keluaran

Cetak masing-masing item secara individual. Jangan cetak output sebagai daftar. Anda dapat memisahkan setiap item dengan spasi apa pun.

Contoh Kasus

[[1, 0], [2, 0], [2, 3]] -> 1 2 2 3
[[[4, 5, 8]], [[5, 6, 20]], [[1, 20, 500]]] -> 4 5 8 5 6 20 1 20 500
[[[1, 0], [0, 0], [0, 0]], [[1, 0], [1, 2], [2, 0]], [[2, 0], [0, 0], [0, 0]]] -> 1 1 1 2 2 2

Kode terpendek menang.


Anda harus memasukkan setidaknya satu contoh daftar 4-kedalaman. Jika saya mengerti dengan benar, kedalaman 4 adalah sesuatu seperti itu [[[[5]]]], bukan?
sergiol

[[[[5]]]]bekerja pada tio.run/… tetapi tidak pada tio.run/…
sergiol

Sulit untuk mengenali Count all 0's within the input as a null space.artinyaignore zeros
l4m2

Jawaban:


7

APL (10)

0~⍨⍎⍞~'[]'

Penjelasan:

  • ⍞~'[]': Input pengguna ( ) tanpa ( ~) karakter '[]'
    Ini memberikan sesuatu seperti'1,2,0,2,3'
  • : Evaluasi string ini. Kebetulan itu ,adalah operator gabungan, jadi sekarang kami memiliki daftar: 1 2 0 2 3(Daftar APL dipisahkan dengan spasi secara default)
  • 0~⍨: Hapus semua angka 0 dari daftar ini. (Ini adalah daftar angka, bukan string, sekarang, jadi nol dalam angka tidak dihapus.
  • Nilai ini adalah output (secara default, karena ini nilai keseluruhan program, seperti Golfscript). Daftar APL dipisahkan secara default sehingga terlihat persis seperti pada pertanyaan.

Jawaban terpendek, jadi ini yang mengambil kue. Untuk semua non-jawaban, saya telah memberi tanda + jika kode Anda benar-benar pendek atau kreatif.
beary605

7

Sed, 20 karakter

Solusi didasarkan pada Ekspresi Reguler Diperpanjang POSIX.

s;[^0-9]+0|[],[]+;;g

Keluaran :

bash-3.2$ sed -rf sedFile <<< "[[[4, 5, 8]], [[5, 6, 20]], [[1, 20, 500]]]" 
4 5 8 5 6 20 1 20 500

Sunting : POSIX Basic Regular Expression ( solusi @clueless ), 19 karakter :

s/[^0-9][^1-9]*/ /g

1
s/[^0-9][^1-9]*/ /gjuga berfungsi, dan tidak memerlukan ekspresi reguler yang diperluas.
Clueless

7

Python, 45

w00, penanganan pengecualian dalam golf!

def d(x):
 try:map(d,x)
 except:print`x`*(x!=0)

Cara yang sangat pintar untuk memeriksa jenis.
beary605

Saya suka solusinya, meskipun saya pikir itu curang untuk tidak memasukkan d(input())garis dalam jumlah karakter.
Clueless

Tantangannya tidak jelas ... tidak, bertentangan, ketika menyangkut I / O.
Stanby

5

Perl, 20 16 13 karakter

perl -ple 's/\D+0?/ /g'

The -lswitch yang diperlukan untuk melestarikan baris terakhir dalam output.

Inilah versi alternatif yang benar-benar berfungsi dengan daftar secara semantik (51 karakter).

perl -E '$,=$";sub p{map{ref$_?p(@$_):$_||""}@_}say p eval<>'

Kedua program ini mengambil keuntungan dari ketentuan masalah bahwa "dapat memisahkan setiap item dengan segala jenis ruang kosong", dan mengganti nol dengan kosong, alih-alih menghapusnya langsung.


4

K, 12

{x@?&x:,//x}

.

k){x@?&x:,//x}((1;0);(2;0);(2;3))
1 2 2 3
k){x@?&x:,//x}(((4;5;8));((5;6;20));((1;20;500)))
4 5 8 5 6 20 1 20 500
k){x@?&x:,//x}(((1;0);(0;0);(0;0));((1;0);(1;2);(2;0));((2;0);(0;0);(0;0)))
1 1 1 2 2 2

Bergantung pada versi k, Anda mungkin dapat menggunakan "kecuali" ( x^y) seperti: {(,//x)^0}atau bahkan {,/x^0}/. Bekerja di johnearnest.github.io/ok/index.html
ngn

3

Perl 13 , 14 char dit: phitung untuk satu char

s/\D+|\b0/ /g

pemakaian:

cat '[[1, 0], [2, 0], [2, 3]]' | perl -pe 's/\D+|\b0/ /g'

Sudah selesai dilakukan dengan baik. Meskipun hitungan Anda sebenarnya 14 karakter (Anda harus memasukkan psakelar dalam hitungan).
kotak roti

@breadbox: Ya, Anda benar. Saya melewatkan itu.
Toto

Dengan gema bukannya dipotong, itu bahkan akan bekerja - operasi netral dalam hitungan char.
pengguna tidak dikenal

2

Ruby, 38 karakter

puts eval(gets).flatten.reject &:zero?

Angka-angka dicetak dipisahkan oleh satu baris.


2

Golfscript 15

~{[]*}4*{},' '*

Memasukkan

Jalankan dari baris perintah, seperti:

echo [[[1 0] [0 0] [0 0]] [[1 0] [1 2] [2 0]] [[2 0] [0 0] [0 0]]] | ruby golfscript.rb x.gs

(anggap x.gsfile tersebut berisi kode yang disajikan di atas).

Perhatikan bahwa tidak ada koma ( ,) saat mendefinisikan array; itu sintaks Golfscript

Keluaran

Ketika perintah yang dijelaskan di bagian Input dikeluarkan, outputnya adalah:

1 1 1 2 2 2

2

Python 3, 49 karakter

import re
print(*re.findall('[1-9]\d*',input()))

Python 2, 58 karakter

import re
print re.sub('\D[^1-9]*',' ',raw_input())[1:-1]

2

Japt , 5 byte

c f ¸

Menguji


Penjelasan

Input array secara implisit U. Ratakan array dengan c. Saring dengan funtuk menghapus 0s. Gabung ke string menggunakan spasi dengan ¸. Output tersirat dari string yang dihasilkan.


2

Java 10, 106 byte

void c(Object i){for(var o:(Object[])i)try{System.out.print((int)o>0?o+" ":"");}catch(Exception e){c(o);}}

Input sebagai bersarang Object[], output dicetak ke STDOUT.

Cobalah online.


46 byte

s->s.replaceAll("[^0-9 ]","").replace(" 0","")

Input dan output keduanya sebagai String.

Cobalah online.


@Giuseppe Ups .. Itu kesalahan yang sangat bodoh. Harus diperbaiki sekarang.
Kevin Cruijssen

1

C, 45 karakter

for(;s=strtok(s,"[], ");s=0)atoi(s)&&puts(s);

Diasumsikan bahwa input diberikan dalam area memori yang dapat dimodifikasi yang ditunjukkan oleh s.


Bukankah seharusnya jawabannya berupa program, atau setidaknya fungsi? Jika gagal untuk nomor tersebut 01(tampaknya legal bagi saya). Dan *s-49&&puts(s)lebih pendek.
ugoren

@ugoren Saya tidak menemukan persyaratan apa pun yang membatasi jawaban untuk menyelesaikan program / fungsi saja. Apakah ada?
Alexander Bakulin

@ugoren Ditulis ulang untuk mengatasi angka dengan angka nol di depan. Dan terima kasih telah mempersingkat saran!
Alexander Bakulin

1

Python, 99 111 karakter

def d(l):
    if list==type(l):return[y for x in l for y in d(x)]
    return[str(l)]*(l!=0)
print" ".join(d(input()))

Versi 99 char sebelumnya - gagal ketika daftar dengan nol saja disertakan:

d=lambda l:list==type(l)and[y for x in l for y in d(x)]or[str(l)]*(l!=0)
print" ".join(d(input()))

d(l)secara rekursif meratakan daftar l, sambil menyaring angka nol dan mengubah angka menjadi string.


Ia mengembalikan 1 [0, 0] [0, 0] 1 1 2 2 2 [0, 0] [0, 0] untuk kasus uji ketiga.
beary605

@ beary605, saya hanya melewatkan tes yang satu ini ... Saya menggunakan a and b or calih-alih C a?b:c, tetapi gagal ketika bdievaluasi menjadi false (daftar kosong dalam kasus ini).
ugoren

1

Scala, 42 karakter

Dipatenkan string oleh non-digit dan non-digit diikuti oleh nol.

print(readLine split"\\D|\\b0"mkString" ")

1

Prolog (79)

Ini memasukkan daftar sebagai istilah, jadi Anda harus memberi tanda '.' setelah daftar di input.

Sebenarnya daftar perataan.

x([H|T]):-x(H),x(T).
x(0). x([]).
x(M):-write(M),put(32).
:-read(X),x(X),halt.



0

Scala 147:

Bekerja pada daftar nyata, bukan pada string:

def f[A](l:List[_]):List[_]=l match{
case Nil=>l
case(l:List[_])::s=>(f(l):::f(s))
case e::s=>e::f(s)}
def p(l:List[_])=f(l)filter(!=0)mkString " "

Sekarang datanya:

val l1 = List (List (1, 0), List (2, 0), List (2, 3))
val l2 = List (List (List (4, 5, 8)), List (List (5, 6, 20)), List (List (1, 20, 500)))
val l3 = List (List (List (1, 0), List (0, 0), List (0, 0)), List (List (1, 0), List (1, 2), List (2, 0)), List (List (2, 0), List (0, 0), List (0, 0)))
val l4 = List (l1, l2, l3)

scala> l4.map(p)
res94: List[String] = List(1 2 2 3, 4 5 8 5 6 20 1 20 500, 1 1 1 2 2 2)

scala> p(l4)
res95: String = 1 2 2 3 4 5 8 5 6 20 1 20 500 1 1 1 2 2 2

0

bash: 29 karakter

l=$(echo "[[[1, 0], [0, 0], [0, 0]], [[1, 0], [1, 2], [2, 0]], [[2, 0], [0, 0], [0, 0]]]")
echo $l|tr -d '][,'|sed 's/\b0\b/ /g'
1           1   1 2 2   2          

menghitung baris 2 hanya tanpa 'gema $ l |'. Tes untuk 3 sampel:

  1    2    2 3
   4 5 8   5 6 20   1 20 500
   1               1    1 2  2     2            

0

Tcl , 47 byte

proc D L {concat {*}[concat {*}[concat {*}$L]]}

Cobalah online!

Dengan asumsi kedalaman 4 adalah sesuatu seperti {{{{5}}}}. Karena tidak ada contoh dari hal-hal seperti itu pada kasus-kasus uji, mungkin itu seperti {{{5}}}; jika itu saya bisa membuat kode saya lebih pendek!

Tcl , 66 byte

proc D L {lsearch -al -inl -not "[string map {\{ "" \} ""} $L]" 0}

Cobalah online!



0

R , 29 byte

function(l)(x=unlist(l))[!!x]

Cobalah online!

unlistmengubah daftar menjadi atomic vectorrekursif, jadi kita hanya perlu menyaring elemen nol.



0

Brachylog , 8 byte

ċ∋↰|ℕ₁ẉ⊥

Cobalah online!

Membawa input melalui variabel input dan mencetak output yang dipisahkan oleh baris baru. Biasanya saya akan mengeluh tentang format output, tetapi itu benar-benar menyelamatkan saya byte dengan cara yang saya mungkin tidak berpikir sebaliknya - meletakkan ẉ⊥pada akhirnya lebih pendek daripada membungkusnya {}ᶠ.

ċ           If the input is a list,
 ∋          pick some element of it
  ↰         and recur with it as the input.
   |        Otherwise, if the input
    ℕ₁      is a natural number,
      ẉ     print it with a trailing newline
       ⊥    then trigger backtracking.

Jika item daftar tidak dibatasi sebagai bilangan bulat non-negatif:

Brachylog , 11 byte

ċ!∋↰|0!⊥|ẉ⊥

Cobalah online!


0

PHP , 70 byte

function($a){array_walk_recursive($a,function($a){echo$a?"$a ":'';});}

Cobalah online!

Ini tidak akan menjadi yang terpendek (atau yang terpanjang), tetapi mengira itu akan menjadi kesempatan untuk digunakan array_walk_recursive(), yang sampai hari ini saya tidak bisa memikirkan pernah menggunakannya untuk itu! Setidaknya itu harus dapat menangani daftar bersarang tingkat dalam sewenang-wenang.


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.