Listy zagnieżdżone

12

Biorąc pod uwagę listę z zagnieżdżonymi listami, zwróć listę z zagnieżdżonymi elementami list.

Wejście

Lista będzie mieć najwyżej 4 zagnieżdżone listy. Policz wszystkie zera w danych wejściowych jako spację zerową.

Wynik

Indywidualnie wydrukuj każdy element. Nie drukuj danych wyjściowych jako listy. Możesz oddzielić każdy element dowolnym rodzajem białych znaków.

Przykłady przypadków

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

Najkrótszy kod wygrywa.

beary605
źródło
Powinieneś dołączyć co najmniej jeden przykład 4-głębokiej listy. Jeśli dobrze zrozumiałem, 4-głębokie jest coś [[[[5]]]], prawda?
sergiol
[[[[5]]]]działa na tio.run/…, ale nie na tio.run/…
sergiol
Trudno uznać, że Count all 0's within the input as a null space.średniignore zeros
l4m2

Odpowiedzi:

7

APL (10)

0~⍨⍎⍞~'[]'

Wyjaśnienie:

  • ⍞~'[]': Wprowadzane przez użytkownika ( ) bez ( ~) znaków '[]'
    Daje to coś takiego'1,2,0,2,3'
  • : Oceń ten ciąg. Tak się składa, że ,jest to operator konkatenacji, więc teraz mamy listę: 1 2 0 2 3(listy APL są domyślnie oddzielone spacjami)
  • 0~⍨: Usuń wszystkie cyfry 0 z tej listy. (Jest to lista liczb, a nie ciągów, więc zera w liczbach nie są usuwane.
  • Ta wartość jest wyprowadzana (domyślnie, ponieważ jest to wartość całego programu, podobnie jak Golfscript). Listy APL są domyślnie oddzielone spacjami, więc wygląda dokładnie tak, jak w pytaniu.
marinus
źródło
Najkrótsza odpowiedź, więc ta bierze ciasto. W przypadku wszystkich braków odpowiedzi podałem +, jeśli Twój kod był naprawdę krótki lub kreatywny.
beary605
7

Sed, 20 znaków

Rozwiązanie oparte jest na rozszerzonym wyrażeniu regularnym POSIX.

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

Wyjście :

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

Edycja : Podstawowe wyrażenie regularne POSIX ( rozwiązanie @clueless ), 19 znaków :

s/[^0-9][^1-9]*/ /g
Książę John Wesley
źródło
1
s/[^0-9][^1-9]*/ /gdziała również i nie wymaga rozszerzonych wyrażeń regularnych.
Clueless
7

Python, 45

w00, obsługa wyjątków w golfie!

def d(x):
 try:map(d,x)
 except:print`x`*(x!=0)
boothby
źródło
Bardzo sprytny sposób sprawdzania typów.
beary605
Podoba mi się to rozwiązanie, choć myślę, że oszustwem jest nieuwzględnianie d(input())wiersza w liczbie znaków.
Clueless
Wyzwanie jest niejasne ... nie, sprzeczne, jeśli chodzi o wejścia / wyjścia.
stoisko
5

Perl, 20 16 13 znaków

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

-lPrzełącznik jest niezbędne dla zachowania końcowego znaku nowej linii na wyjściu.

Oto alternatywna wersja, która faktycznie działa semantycznie z listami (51 znaków).

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

Oba te programy wykorzystują zastrzeżenie problemu, zgodnie z którym „może oddzielić każdy element dowolnym rodzajem spacji” i zamienia zera na puste miejsca, zamiast usuwać je całkowicie.

chlebak
źródło
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
tartin
źródło
W zależności od wersji k możesz użyć „wyjątku” ( x^y) w ten sposób: {(,//x)^0}a nawet {,/x^0}/. Działa w johnearnest.github.io/ok/index.html
ngn
3

Perla 13 , 14 char dit: pliczyć na jeden char

s/\D+|\b0/ /g

stosowanie:

cat '[[1, 0], [2, 0], [2, 3]]' | perl -pe 's/\D+|\b0/ /g'
Toto
źródło
Dobra robota. Chociaż twoja liczba to w rzeczywistości 14 znaków (musisz dołączyć pprzełącznik do liczby).
breadbox
@breadbox: Tak, masz rację. Tęsknie za tym.
Toto
Z echem zamiast wycinania zadziałałoby nawet - neutralna praca w liczbie znaków.
użytkownik nieznany
2

Ruby, 38 znaków

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

Liczby są drukowane oddzielone znakiem podziału linii.

Ventero
źródło
2

Golfscript 15

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

Wejście

Uruchom z wiersza poleceń, tak:

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

(zakładając, że x.gsplik zawiera kod przedstawiony powyżej).

Zauważ, że nie ma przecinków ( ,) podczas definiowania tablic; taka jest składnia Golfscript

Wynik

Po wydaniu polecenia opisanego w sekcji Wejście dane wyjściowe to:

1 1 1 2 2 2
Cristian Lupascu
źródło
2

Python 3, 49 znaków

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

Python 2, 58 znaków

import re
print re.sub('\D[^1-9]*',' ',raw_input())[1:-1]
bezradny
źródło
2

Japt , 5 bajtów

c f ¸

Sprawdź to


Wyjaśnienie

Domniemane wejście tablicy U. Spłaszcz tablicę za pomocą c. Filtruj za pomocą, faby usunąć 0s. Połącz go z ciągiem znaków, używając spacji ¸. Wyjściowy wynik wynikowego ciągu.

Kudłaty
źródło
2

Java 10, 106 bajtów

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

Wejście jako zagnieżdżone Object[], wyjście wydrukowane do STDOUT.

Wypróbuj online.


46 bajtów

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

Wejście i wyjście zarówno jako String.

Wypróbuj online.

Kevin Cruijssen
źródło
@Giuseppe Oops .. To dość głupi błąd. Powinien zostać teraz naprawiony.
Kevin Cruijssen
1

C, 45 znaków

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

Zakłada się, że dane wejściowe są podawane w modyfikowalnym obszarze pamięci wskazanym przez s.

Alexander Bakulin
źródło
Czy odpowiedź nie powinna być programem, a przynajmniej funkcją? Jeśli numer nie powiedzie się 01(wydaje mi się legalny). I *s-49&&puts(s)jest krótszy.
ugoren
@ugoren Nie znalazłem żadnych wymagań ograniczających odpowiedź tylko do kompletnych programów / funkcji. Czy są jakieś?
Alexander Bakulin
@ugoren Przepisane, aby radzić sobie z liczbami z wiodącymi zerami. I dzięki za sugestię skrócenia!
Alexander Bakulin
1

Python, 99 111 znaków

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()))

Poprzednia wersja 99 znaków - kończy się niepowodzeniem, gdy uwzględniane są tylko listy z zerami:

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)rekurencyjnie spłaszcza listę l, jednocześnie filtrując zera i konwertując liczby na ciągi.

ugoren
źródło
Zwraca 1 [0, 0] [0, 0] 1 1 2 2 2 [0, 0] [0, 0] dla trzeciego przypadku testowego.
beary605
@ beary605, właśnie pominąłem ten jeden test ... używam a and b or czamiast C a?b:c, ale kończy się niepowodzeniem, gdy bwartość jest fałszywa (w tym przypadku pusta lista).
ugoren
1

Scala, 42 znaki

Tokenizowany ciąg za pomocą cyfr i cyfr, po których następuje zero.

print(readLine split"\\D|\\b0"mkString" ")
Książę John Wesley
źródło
1

Prolog (79)

Wprowadza listę jako termin, więc musisz wstawić „.” po liście w danych wejściowych.

W rzeczywistości spłaszcza listę.

x([H|T]):-x(H),x(T).
x(0). x([]).
x(M):-write(M),put(32).
:-read(X),x(X),halt.
marinus
źródło
0

Scala 147:

Praca na prawdziwych listach, a nie na ciągach:

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

Teraz dane testowe:

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
nieznany użytkownik
źródło
0

bash: 29 znaków

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          

liczenie linii 2 tylko bez „echo $ l |”. Test na 3 próbki:

  1    2    2 3
   4 5 8   5 6 20   1 20 500
   1               1    1 2  2     2            
nieznany użytkownik
źródło
0

Tcl , 47 bajtów

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

Wypróbuj online!

Zakładając, że 4-głęboki jest podobny {{{{5}}}}. Ponieważ nie ma takiego przykładu na przypadkach testowych, może to być coś takiego {{{5}}}; jeśli tak, mogę skrócić kod!

Tcl , 66 bajtów

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

Wypróbuj online!

sergiol
źródło
0

R , 29 bajtów

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

Wypróbuj online!

unlistkonwertuje listę na atomic vectorrekurencyjnie, więc musimy tylko odfiltrować elementy zerowe.

Giuseppe
źródło
0

Brachylog , 8 bajtów

ċ∋↰|ℕ₁ẉ⊥

Wypróbuj online!

Pobiera dane wejściowe przez zmienną wejściową i drukuje dane wyjściowe rozdzielone znakami nowej linii. Zwykle narzekałem na format wyjściowy, ale tak naprawdę zaoszczędziłem bajt w sposób, w jaki mógłbym nie pomyśleć inaczej - nałożenie ẉ⊥końca jest krótsze niż owinięcie go {}ᶠ.

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

Jeśli elementy listy nie są ograniczone do nieujemnych liczb całkowitych:

Brachylog , 11 bajtów

ċ!∋↰|0!⊥|ẉ⊥

Wypróbuj online!

Niepowiązany ciąg
źródło
0

PHP , 70 bajtów

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

Wypróbuj online!

To nie będzie najkrótsza (ani najdłuższa), ale pomyślałam, że będzie to okazja, by ją wykorzystać array_walk_recursive(), a do dziś nie mogę myśleć o tym, żeby kiedykolwiek ją wykorzystać! Przynajmniej powinna być w stanie obsłużyć listy zagnieżdżone na dowolnym poziomie.

640 KB
źródło