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.

beary605
sumber
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.
marinus
sumber
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
Pangeran John Wesley
sumber
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)
stan
sumber
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.

kotak roti
sumber
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
tmartin
sumber
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'
Toto
sumber
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.

Ventero
sumber
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
Cristian Lupascu
sumber
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]
Tidak mengerti
sumber
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.

Shaggy
sumber
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.

Kevin Cruijssen
sumber
@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.

Alexander Bakulin
sumber
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.

ugoren
sumber
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" ")
Pangeran John Wesley
sumber
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.
marinus
sumber
1

APL (Dyalog) , 4 byte

0~⍨∊

Cobalah online!

0~⍨ nol dihapus dari

 data ϵ yang terdaftar (diratakan)

Adm
sumber
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
Pengguna tidak diketahui
sumber
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            
Pengguna tidak diketahui
sumber
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!

sergiol
sumber
0

R , 29 byte

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

Cobalah online!

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

Giuseppe
sumber
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!

String yang tidak terkait
sumber
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.

640KB
sumber