Yerleştirme Listelerini Kaldırma


12

İçerisinde iç içe listeler bulunan bir liste verildiğinde, iç içe listelerin öğeleri iç içe geçmiş olarak listeyi döndürün.

Giriş

Liste, en fazla 4 derin iç içe listeye sahip olacaktır. Giriş içindeki 0'ların tümünü boş bir alan olarak sayın.

Çıktı

Her öğeyi ayrı ayrı yazdırın. Çıktıyı liste olarak yazdırmayın. Her öğeyi herhangi bir boşlukla ayırabilirsiniz.

Örnek Vakalar

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

En kısa kod kazanır.


4 derinlikli listenin en az bir örneğini eklemelisiniz. Doğru anladıysam, 4 derinlik gibi bir şey [[[[5]]]]değil mi?
sergiol

[[[[5]]]]tio.run/… üzerinde çalışıyor ancak tio.run/… üzerinde değil
sergiol

Bu Count all 0's within the input as a null space.anlamı tanımak zorignore zeros
l4m2

Yanıtlar:


7

APL (10)

0~⍨⍎⍞~'[]'

Açıklama:

  • ⍞~'[]': Kullanıcı girişi ( (olmadan) ~karakterleri) '[]'
    Bu gibi şeyler verir'1,2,0,2,3'
  • : Bu dizeyi değerlendirin. Bu ,birleştirme operatörü olduğu için, şimdi bir listemiz var: 1 2 0 2 3(APL listeleri varsayılan olarak boşlukla ayrılmıştır)
  • 0~⍨: Bu listeden tüm 0 rakamlarını kaldırın. (Şimdiye kadar dizelerin değil, sayıların bir listesidir, bu nedenle sayılardaki sıfırlar kaldırılmaz.
  • Bu değer çıktıdır (varsayılan olarak, tüm programın değeri, Golfscript gibi). APL listeleri varsayılan olarak boşlukla ayrılmıştır, bu nedenle soruda olduğu gibi görünür.

En kısa cevap, bu yüzden pastayı alır. Tüm cevap vermeyenler için, kodunuz gerçekten kısa veya yaratıcıysa + verdim.
beary605

7

Sed, 20 karakter

Çözüm, POSIX Genişletilmiş Düzenli İfadeye dayanmaktadır.

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

Çıktı :

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

Edit : POSIX Temel Normal İfade ( @clueless çözümü), 19 karakter :

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

1
s/[^0-9][^1-9]*/ /gayrıca çalışır ve genişletilmiş düzenli ifadeler gerektirmez.
clueless

7

Python, 45

w00, golf istisna işleme!

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

Türleri kontrol etmek için çok akıllı bir yol.
beary605

Çözümü seviyorum, ancak d(input())karakter sayısına bir satır eklememenin hile olduğunu düşünüyorum .
Clueless

I / O söz konusu olduğunda, zorluk belirsizdir.
boothby

5

Perl, 20 16 13 karakter

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

-lAnahtar çıkışında son yeni satır korumak için gereklidir.

İşte listelerle anlamsal olarak çalışan alternatif bir sürüm (51 karakter).

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

Bu programların her ikisi de, sorunun "her öğeyi herhangi bir boşlukla ayırabileceği" koşulundan yararlanır ve sıfırları, bunları doğrudan kaldırmak yerine boşluklarla değiştirir.


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

K sürümüne bağlı olarak, "hariç" ( x^y) yöntemini şu şekilde kullanabilirsiniz: {(,//x)^0}hatta {,/x^0}/. Johnearnest.github.io/ok/index.html
ngn

3

Perl 13 , 14 karakter : pbir karakter için sayım

s/\D+|\b0/ /g

kullanımı:

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

Aferin. Sayınız aslında 14 karakter olmasına rağmen ( panahtarı sayıya eklemeniz gerekir ).
breadbox

@breadbox: Evet, haklısın. Onu özledim.
Toto

Kesim yerine yankı ile bile işe yarar - karakter sayısında nötr çalışma.
kullanıcı bilinmiyor

2

Ruby, 38 karakter

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

Sayılar satır sonu ile ayrı ayrı yazdırılır.


2

Golf Yazıları 15

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

Giriş

Komut satırından şu şekilde çalıştırın:

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

(varsayalım ki x.gs dosyanın yukarıda sunulan kodu içerdiğini ).

,Dizileri tanımlarken virgül ( ) olmadığını unutmayın ; Golfscript sözdizimi

Çıktı

Giriş bölümünde açıklanan komut verildiğinde, çıktı:

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 bayt

c f ¸

Dene


açıklama

Örtülü dizi girişi U. Diziyi ile düzleştirin c. Filtreleri fkaldırmak için ile filtreleyin 0. Boşlukları kullanarak bir dizeye katılın ¸. Ortaya çıkan dizenin örtük çıktısı.


2

Java 10, 106 bayt

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

Yuvalanmış olarak girdi Object[], çıktı STDOUT'a yazdırıldı.

Çevrimiçi deneyin.


46 bayt

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

Hem giriş hem de çıkış olarak String.

Çevrimiçi deneyin.


@Giuseppe Oops .. Bu oldukça aptalca bir hata. Şimdi düzeltilmelidir.
Kevin Cruijssen

1

C, 45 karakter

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

Girişin işaret ettiği değiştirilebilir bir bellek alanında verildiğini varsayar s.


Cevap bir program mı yoksa en azından bir fonksiyon mu? Numara için başarısız olursa 01(bana yasal görünüyor). Ve *s-49&&puts(s)daha kısadır.
ugoren

@ugoren Sadece programların / işlevlerin yanıtını kısıtlayan herhangi bir gereksinim bulamadım. Orada hiç?
Alexander Bakulin

@ugoren Baştaki sıfırlarla sayılarla başa çıkmak için yeniden yazılmıştır. Ve kısaltma önerisi için teşekkürler!
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()))

Önceki 99 karakter sürümü - yalnızca sıfır içeren listeler dahil edildiğinde başarısız olur:

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)lsıfırları filtrelerken ve sayıları dizelere dönüştürürken listeyi yinelemeli olarak düzleştirir .


Üçüncü test durumu için 1 [0, 0] [0, 0] 1 1 2 2 2 [0, 0] [0, 0] döndürür.
beary605

@ beary605, ben sadece bu bir testi atladı ... a and b or cC yerine kullanın a?b:c, ancak byanlış olarak değerlendirilirse başarısız olur (bu durumda boş liste).
ugoren

1

Scala, 42 karakter

Dizgeyi rakamsız ve rakamsız ve ardından sıfır ile işaretledi.

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

1

Prolog (79)

Listeyi bir terim olarak girer, bu yüzden bir '.' girişteki listeden sonra.

Aslında düzleştirmeyi listeler.

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



0

Scala 147:

Dizelerde değil, gerçek listelerde çalışma:

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

Şimdi test verileri:

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          

2 numaralı satırı yalnızca 'echo $ l |' 3 numune için test:

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

0

Tcl , 47 bayt

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

Çevrimiçi deneyin!

4-derin varsaymak böyle bir şeydir {{{{5}}}}. Test senaryolarında böyle bir şeye örnek olmadığı için {{{5}}}; öyleyse kodumu kısaltabilirim!

Tcl , 66 bayt

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

Çevrimiçi deneyin!



0

R , 29 bayt

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

Çevrimiçi deneyin!

unlistlisteyi atomic vectoryinelemeli olarak dönüştürür , bu yüzden sıfır öğeleri filtrelememiz yeterlidir.



0

Brachylog , 8 bayt

ċ∋↰|ℕ₁ẉ⊥

Çevrimiçi deneyin!

Girişi değişken üzerinden alır ve çıktıyı satırsonu çizgileri ile ayırarak yazdırır. Genellikle çıktı biçimi hakkında şikayet ediyorum, ama aslında bana başka türlü düşünmediğim bir şekilde bir bayt kurtardı - ẉ⊥sonuna koymak onu sarmaktan daha kısa {}ᶠ.

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

Liste öğeleri negatif olmayan tamsayılarla sınırlı değilse:

Brachylog , 11 bayt

ċ!∋↰|0!⊥|ẉ⊥

Çevrimiçi deneyin!


0

PHP , 70 bayt

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

Çevrimiçi deneyin!

Bu en kısa (ya da en uzun) olmayacak, ancak kullanmak için bir şans olacağını düşündüm array_walk_recursive(), bu güne kadar hiç kullanmamayı düşünemiyorum! En azından keyfi düzeyde derin iç içe listeler işleyebilmelidir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.