Dizi Düzleştirin!


34

Bu zorlu görevde, göreviniz iç içe geçmiş bir dizi alan ve tek boyutlu düzleştirilmiş bir dizi döndüren bir program oluşturmaktır. Örneğin [10,20,[30,[40]],50]çıktı vermeli [10,20,30,40,50].


Giriş

Giriş iç içe geçmiş bir dizi olacaktır (örn. [10,20,[[[10]]]]). Yalnızca Tamsayılar (hem negatif hem de pozitif), Dizeler ve Diziler içerecektir. Girdiyi fonksiyon argümanı, STDIN veya dilinize uygun olanı olarak alabilirsiniz. Giriş dizisinin boş bir diziye sahip olmayacağını varsayabilirsiniz.


Çıktı

Çıktı, iç içe dizideki ve SAME sırasındaki ile aynı türde öğelere sahip düz boyutlu tek boyutlu bir dizi olacaktır.


Test Kılıfları

[10,20,30] -> [10,20,30]
[[10]] -> [10]
[["Hi"],[[10]]] -> ["Hi",10]
[[[20],["Hi"],"Hi",20]] -> [20,"Hi","Hi",20]
[[["[]"],"[]"]] -> ["[]","[]"]


Yorumları kullanarak herhangi bir açıklama sormaktan çekinmeyin. Bu , yani bayttaki en kısa kod kazanır!

Not: Eğer diliniz bunun için bir yerleşik içeriyorsa, kullanmamalısınız.


Düzenle

Lütfen ayrıca kodunuzun çalıştırılabileceği bir web sitesine bağlantı ekleyin.


7
Bazı diller dizgileri dizi olarak ele alır, [["Merhaba"], [[10]]] -> ["H", "i", 10] tamam mı?
Adem

4
@Mego PPCG'de bir unflattensoru olduğunu ancak flattensoru olmadığını öğrenmek için şaşırdım.
Arjun

3
Diliniz sadece aynı boydaki alt dizileri destekliyorsa ne olur? (Örneğin, Java?) Her bir öğenin türü aynıysa ne olacak? (Örneğin, Java, C ++ vb.) Ayrıca, lütfen örneğin ["[",[["[",],'[',"['['"]]bir test durumu olarak ekleyin .
kusur,

4
@flawr Bu sınama durumu yalnızca botu destekleyen 've "sınırlayıcı olarak dilleri anlamlıdır . (Ama test durumu kapsayan konusunda hemfikir [, ], "ve \bir dize içindeki faydalı olacaktır.)
Martin Ender

4
Test durumları ayrıca, bu tür dizileri birden fazla türe sahip olmayan ya da dizi değişmezleri için başka bir notasyona sahip olmayan dilleri de hariç tutar.
kusur,

Yanıtlar:


40

K, 3 bayt

,//

Bu oldukça yaygın bir deyimdir. Msgstr "Yakınsamaya katıl".

burada OK ile deneyin .

Nasıl çalışır:

Join ( ,), bir liste oluşturmak için atomları veya listeleri bir araya getirir. Over ( /) bir fiili alır (bu durumda birleştirme) ve listenin her bir öğesi arasında soldan sağa uygular. Böylece, bileşik ,/listenin tüm üst düzey elemanlarını düzleştirir. Simge /aslında, birleştiği fiilin değerine (argüman sayısı) bağlı olarak farklı anlamlara gelir. ,/Fiil olarak verdiğimizde , final /"yakınsama" olarak hareket eder - ,/değişmeyi bırakana kadar girişe tekrar tekrar uygulanır . Diğer bazı diller buna "sabit nokta birleştirici" gibi bir özellik diyor. Alt seviye listelerini tekrar tekrar kaynaştırarak, sonunda tek bir düz listeye varacaksınız ve işlemlerin hiçbiri öğelerin sırasını bozmayacak. Bu sorunu çözmek gibi görünüyor.


1
Tamam, açıklama için teşekkürler! İyi kazanılmış +1'inizi alın.
Değerli Mürekkep


1
Aynı algoritma ile geldim (ancak bu dilde değil). Uygulamak için doğru dili seçmek için +1!
Cyoce

@Cyoce Diliniz burada kullanılan üç operatöre eşdeğerse, bu çok doğal bir çözümdür. Elbette varyasyonunuzu yayınlayın.
JohnE

1
@JohnE Uzun hikaye, geldiğim algoritmalardan bir dil türetiyorum, bu yüzden dil henüz bitmedi (ve böylece uygulandı).
Cyoce

38

JavaScript (ES6), 35 bayt

Esinlenerek user81655 cevabı @ :

f=a=>a.map?[].concat(...a.map(f)):a

3
Çok zeki! [Ab] için +1, JS'nin eksik tuşları kullanmanın garip yolunu kullanıyor!
Cyoce

Bunu yenebilirim.
Bald Bantha

@BaldBantha: Cevabınızı bekliyoruz :-)
Bergi

2
Crap NVM 33 baytlık çözüm test senaryolarından birinde başarısız oldu. NOOOO
Bald Bantha

2
@BaldBantha, join-split, dizgelerin içindeki virgüllerde başarısız olur.
Qwertiy

19

Mathematica, 16 14 bayt

{##&@@#&//@#}&

Bir liste alıp veren isimsiz bir işlev, örneğin:

{##&@@#&//@#}& @ {{{20}, {"Hi"}, "Hi", 20}}
(* {20, "Hi", "Hi", 20} *)

açıklama

Sözdizimsel şeker partisi!

Anlamak için nasıl bu eserler, not Mathematica her ifade bir atom ya olduğu (örneğin sayılar, dizeleri, semboller) ya da formun bir bileşik ifadesi f[a, b, c, ...], f, a, b, ckeyfi ifadeler kendilerini bulunmaktadır. Burada ifadenin başıf denir . Bunun üzerine her şey sadece sözdizimsel şeker. Örneğin sadece .{a, b, c}List[a, b, c]

//@Hangi haritaların bir listenin tüm seviyelerinde işlediğiyle başlıyoruz . Örneğin:

f //@ {{{20}, {"Hi"}, "Hi", 20}}
(* f[{f[{f[{f[20]}], f[{f["Hi"]}], f["Hi"], f[20]}]}] *)

Bunun f, bileşik ifadelerin yanı sıra atomlar üzerinde haritalandığına dikkat edin . Şu an aradığımız şey liste başlıklarından kurtulmanın ve her şeyi saklamanın bir yolu.

ApplyFonksiyonu normal olarak bir işleve ayrı bağımsız değişken olarak bir listesinin elemanları beslemek için kullanılır, ancak gerçek tanımı daha geneldir ve basit bir ifade baş yerine geçer. Örneğin Apply[g, f[a, b]]verir g[a, b].

Şimdi Sequenceise basitçe yok olan özel bir "kafa" var . Örneğin, {a, Sequence[b, c], d}sadece değerlendirir {a, b, c, d}. Listeyi düzleştirme fikri, tüm iç listelerin başlıklarını Sequenceçevreleyen listelerine sıçramaları için değiştirmektir . Yani istediğimiz şey listelerin Applybaşına Sequencegeçmek. Eğer Applybir atom için bir şey yaparsak , atomu değiştirmeden bırakır, bu yüzden ifade türlerini birbirinden ayırmak zorunda değiliz.

Son olarak, küçük bir sorun var: fen dış seviyeye de uygulandı, böylece Listbizim de istemediğimiz en uç noktayı da çıkardı . Buna karşı koymanın en kısa yolu, sonucu tekrar bir listeye sarmaktır, böylece çevre Sequencegüvenli bir şekilde ortadan kalkar.

Ne Applyde ne Sequencekodda olduğunu unutmayın. @@operatörün şeklidir Applyve ##&uzun dahili adı kısaltmak için standart bir golf oyunudur Sequence. Yani her şeyi biraz ungolfing, şöyle bir şey olsun:

flatten[list_] := { MapAll[Apply[Sequence], list] }

##&İşlerin nasıl ve neden yapıldığı hakkında daha fazla bilgi için, Mathematica ipuçlarına cevabımdaki "Argüman dizileri" bölümüne bakın .


İlk defa gördüm //@. Hakkında bilmek çok yararlı!
DavidC

//@temiz bir desen yakalar. Bana Joy'daki bazı özyinelemeli birleştiricilerin bir kısmını hatırlatıyor. Mathematica'daki ilgili fonksiyonlara iyi bir referans ile bağlantınız var mı? Programlardan açıkça çıkarılan faktörleri hesaba katma yöntemleriyle çok ilgileniyorum.
JohnE

1
@JohnE Evet, işte doktorlar . Ayrıca gibi şeyler bakabilir Map, MapAt, Applyyanı sıra Replaceve ilgili işlevler. Genel olarak, isteğe bağlı olan bir levelpec parametresi alan (bkz. Orijinal 16 bayt çözümüm), bir kerede işlevi birden çok / tüm seviyelerde uygulamanıza izin veren birçok fonksiyon vardır.
Martin Ender

12

Python 2, 43 bayt

f=lambda l:[l]*(l*0!=[])or sum(map(f,l),[])

Bir listede, unsurları yeniden alır ve sonuçları birleştirir. Bir dize veya numarada, tekil bir listenin içine girer.

Ne yazık ki, Python 2'nin diğerleri arasındaki int < list < stringsandviçleri sipariş listetmesi, iki eşitsizliği kontrol etmeyi gerektiriyordu. Yani, bunun yerine l*0boş listeye göre kontrol edilir [], aksi halde 0veya verilir "".


10

Ruby, 43 42 34 bayt

Özyinelemeli çözüm. Şimdi istisna işleme! (Değişime ilham vermek için @akostadinov kredilerini de verebilir)

f=->a{a.map(&f).inject:+rescue[a]}

IDEOne bağlantısı


kısalık için
harikalar

Kullanabileceğin bilmiyordum rescueböyle
Cyoce

1
@Cyoce Sanırım bunun nedeni Ruby'nin teknik olarak bir trybloğu olmaması , yani beginyakalamak istediğiniz kısımları ve istemediğiniz kısımları ayırt etmek için kullanıyorsunuz. Öyleyse, bloğun geri kalanının tamamını yakalayacağınız için, teknik olarak ihtiyacınız yok mu? Geri kalan kısım sadece beyaz boşlukta kesilmiş, çünkü Ruby çizgiyi şu şekilde yorumluyor...inject(:+) rescue [a]
Value Ink

1
@ KevinLau-notKenny, hayır, aynı hatta kurtarma farklı, sadece bu kurtarma hattı. örneğin a = raise("haha") rescue 1atayın 1için a. Bu '
akostadinov

@ KevinLau-notKenny Bir satır içi var rescue, gibi bir satır içi ifve while.
Fon Monica'nın Davası

8

JavaScript (ES6), 41 bayt

f=a=>[].concat(...a.map(v=>v.pop?f(v):v))
<textarea id="input" rows="6" cols="40">[[[20],["Hi"],"Hi",20]]</textarea><br /><button onclick="result.textContent=JSON.stringify(f(eval(input.value)))">Go</button><pre id="result"></pre>


8

Perl 6 , 24 bayt

{gather {$_».&{.take}}}

Açıklama:

{ # has $_ as an implicit parameter

  gather {

    $_\ # the parameter from the outer block
    »\  # for each single value in the structure
    .&( # call the following block as if it was a method
      { # this block has its own $_ for a parameter
        .take # call the .take method implicitly on $_
      }
    )
  }
}

Ölçek:

#! /usr/bin/env perl6

use v6.c;
use Test;

my &flatten = {gather {$_».&{.take}}}

my @tests = (
  [10,20,30], [10,20,30],
  [[10,],], [10,],
  [["Hi",],[[10,],],], ["Hi",10],
  [[["[]",],"[]"],], ["[]","[]"],
);

plan @tests / 2;

for @tests -> $input, $expected {
  # is-deeply cares about the exact type of its inputs
  # so we have to coerce the Seq into an Array
  is-deeply flatten($input).Array, $expected, $input.perl;
}
1..4
ok 1 - $[10, 20, 30]
ok 2 - $[[10],]
ok 3 - $[["Hi"], [[10],]]
ok 4 - $[[["[]"], "[]"],]

7

Haskell, 43 bayt

data D a=L a|N[D a]
f(L x)=[x]
f(N l)=f=<<l

Haskell'de alt listelerin farklı derinliklerine sahip iç içe geçmiş listeler veya liste öğeleri için karışık türler yoktur. Yuvalama için, bazı öğelerin bulunduğu Dbir yaprak Lolan veya bir s Nlistesi olan bir düğüm olan özel bir veri türü tanımlarım D. Karışık elemanlar için Eitherburada iki türü bir araya getiren önceden tanımlanmış veri tipini kullanıyorum Either String Integer. Yeni tip Dve düzleştirme işlevi f, yaprak elemanlarının tipinde tamamen polimorfiktir, bu nedenle ilgili hiçbir şeye daha fazla dikkat etmem gerekmez Either.

Kullanım örneği: f (N[N[L(Right 20)], N[L(Left "Hi")], L(Left "Hi") , L(Right 20)])-> [Right 20,Left "Hi",Left "Hi",Right 20].


6

Pyth, 7 6 5 bayt

us+]Y

Çevrimiçi deneyin: Gösteri veya Test Paketi

Ancak elbette, görevi yalnızca 2 baytta halleden bir yerleşik işlevi de var: .n( Test Suite )


Mevcut kazanandan sadece 3 uzakta! +1
Arjun

@Sting: Başka bir bayt uzakta golf oynadı. Pyth'in, yazmazsam, son karakteri Gdolaylı olarak eklediğini unuttum .
Jakube

Tebrikler!
Arjun

6

JavaScript (Firefox 30-57), 43 bayt

f=a=>a.map?[for(b of a)for(c of f(b))c]:[a]

Sırf kullanmaktan kaçınabildiğim için concat.


Öyle değil mi 6 ECMAscript değil Firefox 30+ ?
Solomon Ucko

1
@SolomonUcko Hayır, [for(of)]yalnızca Firefox 30+ sürümünde kullanılabilir. ES7 için teklif edildi ancak daha sonra düştü.
Neil

1
açıkladığınız için teşekkürler! Çoğunlukla, sadece olduğunu düşündümfor(__ in __)
Solomon Ucko

@SolomonUcko [(in)] size nesnenin anahtarlarını veren alternatif bir deneysel sözdizimiydi.
Neil,

5

Perl, 34 29 bayt

Fonksiyonlar.

my @a = f(@a)29 bayt gibi bir listenin düzleştirilmesi gerekiyorsa :

sub f{map{ref()?f(@$_):$_}@_}

İdeone üzerinde test et

Ref gibi bir dizi düzleştirmek gerekirse my $a = f($a), 34 bayt:

sub f{[map{ref()?@{f(@$_)}:$_}@_]}

İdeone üzerinde test et .

Perl 5.22.0+, 27 bayt

Hobbs için teşekkürler .

my @a = f(@a)27 bayt gibi bir listenin düzleştirilmesi gerekiyorsa :

sub f{map{ref?f(@$_):$_}@_}

JDoodle'ta test et

Ref gibi bir dizi düzleştirmek gerekirse my $a = f($a), 32 bayt:

sub f{[map{ref?@{f(@$_)}:$_}@_]}

JDoodle'ta test et .


Test ettim, ama düşünmek değil ?@{f@$_}:yerine çalışmalıdır ?@{f(@$_)}:iki bayt tasarruf.
msh210

1
@ msh210 Hayır, çalışmıyor. Derleyici fbunun bir işlev olduğunu fbilmiyor , çünkü henüz açıklanmadı. sub f{}sub f{... f@$_ ...}Çalışma.
Denis Ibaev

1. refparenler çalışmak için 2 bayt tasarrufu gerekmez. 2. Görebildiğim kadarıyla sub f{map{ref?f(@$_):$_}@_}, kuralların içinde ve bir tane daha kaydeder 5. fliste olarak bir dizi (ref) alır, böylece aynı şekilde geri dönebilir.
Ocaklar

@ hobbs 1. Eğer parantez yoksa refderleyici bunun gibi bir işlem ?başlattığını varsayar . Böylece derleyici ikinci arama yapar ve hata atar. ?PATTERN?ref(?PATTERN?)?
Denis Ibaev

@DenisIbaev ah. ?PATTERN?5.22.0'da kaldırıldı ( m?PATTERN?hala çalışıyor) ve yeni bir sürümde test ediyorum. Böylece bu iki baytı 5.22+ belirterek kazanabilirsiniz.
Ocaklar

4

Julia, 29 bayt

f(x,y=vcat(x...))=x==y?x:f(y)

Bu, bir sabitleme noktasına ulaşana kadar bir birleştirme işlevinde özyinelemelidir. Örnek

julia> f([1,[2,[3,[4,[5,[6]]]]]])
6-element Array{Int64,1}:
 1
 2
 3
 4
 5
 6

3

Retina , 30 bayt

1>`("(\\.|[^"])+")|[][]
$1
$
]

Çevrimiçi deneyin! (İlk satır yalnızca bir kerede birden fazla test senaryosunu çalıştırmak için kullanılır.)

Ben bir "ortak" Giriş formatı ile gitmeye karar Retina, diziler, dize hazır veya sayı kavramı yok [...,...]tarzı diziler ve "-delimited dizeleri, \(özellikle herhangi bir karakter kaçmak için dizge içinde kullanılabilir "ve \kendisi).

Programın kendisi sadece tam bir dize veya köşeli ayraçla eşleşir ve bunları $1dizeleri tutan ve köşeli ayraçları kaldıranlarla değiştirir. Sınır 1>, ilk eşleşmeyi atlar; böylece baştaki çizgiyi kaldırmayız [. Bununla birlikte, bu izlemeyi kaldırır ], bu yüzden ayrı bir aşamada ekleriz.


3

Pyke, 11 bayt

.F~]+=])K~]

Burada dene!

Açıklama:

.F~]+=])    - Deep for loop
  ~]        -    contents of `]` ([] by default)
    +       -  ^+i
     =]     - `]` = ^
        K~] - Output value
        K   - Remove the output from the for loop
         ~] - Return the contents of `]`

Veya bir hatadan sonra 7 bayt

M?+]K~]

Burada dene!

Açıklama:

M?+]    - Deep map
 ?+]    -  `]` = `]`+i
    K~] - Output value
    K   - Remove the output from the for loop
     ~] - Return the contents of `]`

Stdout'a yazdırmaya izin verilirse hatta 2 bayt bile (Bu, yerleşiklerin altına girebilir)

M
<newline required>

Burada dene!

Bu, print_newlineişlevi girişteki her bir sıra dışı öğeye derinden uygular ve sıra öğeleri için özyinelemeler yapar.


K'dan sadece 4 uzakta! +1
Arjun

3

Java (v8) 390 276 bayt

public static Object[] f(final Object[]a) {
    List<Object>r=new ArrayList<>();boolean t=false;int n=0;
    for(final Object p:a)
        if(t=p instanceof Object[]){for(final Object q:(Object[])p) r.add(q);}
        else r.add(p);
    return(t)?f(r.toArray()):r.toArray();
}  

Sadece bütünlük ve hepsi için. :) Java'nın kod verimli olduğunu söyleyemem.


3
Merhaba, PPCG'ye hoş geldiniz! Bu soru kod-golf , bu yüzden lütfen kodunuzu en aza indirmeyi deneyin. Teşekkürler!
HayırOneIsHere

3
Gereksiz tüm boşlukları, sekmeleri ve yeni satırları kaldırın. Değişim oafiçin o, ve değişim flatteniçin f.
NoOneIsHere

2
S'ye ihtiyacınız yok final, her şey bir lambda olabilir, ihtiyacınız yok public static...
David Conrad

1
Nesne yerine generics kullanıyorsanız çift karakterleri kaydedebilirsiniz
user902383

1
Ayrıca 2 byte tasarruf değiştirmek eğer falseile 1>2ve ek 2 byte Eğer (derleyici otomatik 0 olarak tanımlamak) tanımlamak sen n ilan etmeleri halinde olsun ama could not
user902383

2

Python, 57 bayt

f=lambda a:sum([list==type(x)and f(x)or[x]for x in a],[])

Çevrimiçi deneyin: Python 2 , Python 3

Numara için Kevin Lau'ya teşekkürler list==type(x).


2
type(x)==listdaha kısa isinstance(x,list).
Değerli Mürekkep

1
“Yalnızca Tamsayıları (hem negatif hem de pozitif), Dizeleri ve Dizileri içerecektir.” Nasıl [`x`>'['and...? (Bu sadece Python 2'de çalışır.)
Lynn

2

Yakut

yerleşik bir flattenyöntem var.

Burada çalıştırabilirsiniz: http://www.tutorialspoint.com/execute_ruby_online.php

Bir 43 bayt, ancak paylaşmak için düşünülmüş:

f=->a{a.inject([]){|r,e|r+(f[e]rescue[e])}}

Bir önceki ve diğer yakut cevabından daha verimli olan bir 45 bayt:

f=->a{a.map{|e|Array===e ?f[e]:[e]}.inject:+}

İşte kıyaslama:

require 'benchmark'
n=10^9
arr=[[[20],[[[[[[[[123]]]]]]]],"ads",[[[[[[[4]]]]]]],5,[[[[[[[[[[6]]]]]]]]]],7,8,[[[[[[[[[[9]]]]]]]]]],[[[[[[[[[[0]]]]]]]]]],[[[[[[[[[[[["Hi"]]]]]]]]]]]],[[[[[["Hi"]]]]]],[[[[[20]]]]]]]
Benchmark.bm do |x|
  x.report { f=->a{a.map(&f).inject:+rescue[a]}; f[arr] }
  x.report { f=->a{a.map{|e|e!=[*e]?[e]:f[e]}.inject:+}; f[arr] }
  x.report { f=->a{a.inject([]){|r,e|r+(f[e]rescue[e])}}; f[arr] }
  x.report { f=->a{a.map{|e|Array===e ?f[e]:[e]}.inject:+}; f[arr] }
end

sonuç:

       user     system      total        real
   0.010000   0.000000   0.010000 (  0.000432)
   0.000000   0.000000   0.000000 (  0.000303)
   0.000000   0.000000   0.000000 (  0.000486)
   0.000000   0.000000   0.000000 (  0.000228)

1
Merhaba, PPCG'ye hoş geldiniz! Maalesef, cevap çünkü bu kural geçerli değil: Note: If your language contains a built-in for this, then you must NOT use it.
HayırOneIsHere

@HayırOnlarHere, teşekkürler, bunu bilmiyordum
akostadinov

1
Yeni güncellemem, zamana karşı sizinki aleyhine nasıl bir yığın oluşturuyor? Ayrıca, yeni cevabım gibi, etrafındaki boşlukları kaldırabilirsinizrescue
Value Ink

@ KevinLau-notKenny güncellendi, teşekkürler! rescueoldukça yavaş btw gibi görünüyor try/catch, java gibi
akostadinov

1
Bytecount'unuzu da güncelleyin
Value Ink


2

Clojure, 68 bayt

(def f #(if(some vector? %)(f(mapcat(fn[z](if(vector? z)z[z]))%))%))

mapcatönce her bir öğeye işlev uygular, ardından sonuçları birleştirir. Bu yüzden her gizlendiğinde bir 'yuvalama seviyesini' kaybediyor. Concat diziler üzerinde çalışmaz, bu yüzden elementler vektör değillerse vektöre sarılmalıdır.

Burada deneyebilirsiniz: http://www.tryclj.com

(f [[[20],["Hi"],"Hi",20]])
(f [[["[]"],"[]"]])

Güzel ilk kod golf. +1 :)
Arjun

2

ANSI C, 193 bayt

#define b break;
#define c case
#define p putch(_);
char f;main(_){switch(_){c 1:putch(91);b c 34:f^=1;p b c 91:f&&p b c 93:f&&p b c 10:c 13:putch(93);return;default:p}_=getch();main(_);}

:-/, baska öneri? BTW, bunu derlemek için çevrimiçi bir kaynak bulmaya çalıştım ama WL bu kodun derlenmesi için çok katı. Aksi halde VS ve gcc için çalışacaktır.


2
PPCG'ye Hoşgeldiniz!
Martin Ender

1
PPCG'ye Hoşgeldiniz! Güzel ilk golf. İleride iyi şanslar!
Arjun

Teşekkürler! Başka bir yerde yorum yapma ayrıcalıkları bulabilmem için puanlarımı arttırma girişimi oldu. Hesapların farklı portallar için olduğu gibi işler işler gibi görünmüyor. : DI, c ++ 'dan bazı şık özelliklerin kullanılıp kullanılamayacağını görecektir.
amritanshu

2

JavaScript 20 bayt

a=>(a+[]).split(',')

Array + array array.toString'e eşittir


@WheatWizard hoş geldiniz için teşekkürler ve siteye yeniyim. aslında afonksiyonun bir argümanıdır. Şimdi işlevi düzenlemeye çalışacağım.
ben

Bence şimdi @WheatWizard'da sorun yok. Lütfen bununla ilgili bir sorun olursa bana bildirin
i--

1
Aslında javaScript belgelerine bakmak, isimsiz bir fonksiyonun kesinlikle daha kısa olacağını, sadece a=>kodunuzun başlangıcına eklemeniz gerekeceğini söyledi .
Buğday Sihirbazı

@WheatWizard Bahsettiğiniz gibi ok fonksiyonu ile güncellendi. Ancak snippet'i kaldırmam gerekiyor, çünkü ok işlevi doğrudan çağrılamayı desteklemiyor. Sadece geri aramalar içindir
i--

1
Bu, dizeleri virgüllerle doğru şekilde kullanmaz
Jo King

2

C #, 48 bayt

()=>{$"[{i.Replace("[","").Replace("]","")}]";};

Henüz kimsenin C # çözümü vermediğinden de göndereceğimi düşündüm. Önerilerinizi bekliyoruz!


Siteye Hoşgeldiniz. Bir süredir C # 'da programlamamıştım, ancak bana bir takım sorunların olabileceği görünüyor. Birincisi nasıl ibaşlatılır? ve bunun [["[]"],"[]"]örnek üzerinde çalıştığından emin misin ?
Buğday Sihirbazı

Maalesef, dizge olarak iletilen giriştir. Boş bir dizi sadece boş bir dizgeye tercüme olur.
PmanAce

Son test çantası nasıl? Ayrıca, yapmak istediğini sanıyorum i=>$"{i.Replace("[","").Replace("]","")}"?
Cehalet

Ne yazık ki son durumda işe yaramıyor, boş diziden kurtulacak. :(
PmanAce

Bu cevap son test davasını geçmedi. Birkaç aydır sabit olmadığından, silmek için oy kullanıyorum.
mbomb007

1

Raket, 63 bayt

(define(f l)(apply append(map(λ(x)(if(list? x)(f x)`(,x)))l)))

1

Java 8 165 karakter

import java.util.*;<T>T[]f(T[]a){List<T>l=new ArrayList<>();for(T e:a)if(e instanceof Object[])Collections.addAll(l,f((T[])e));else l.add(e);return(T[])l.toArray();}

Bir sınıfa ungolfed:

public class Q80096 {

    public static <T> T[] flatten(T[] array) {
        List<T> flattenedList = new ArrayList<>();
        for (T element : array)
            if (element instanceof Object[])
                 Collections.addAll(flattenedList, flatten((T[]) element));
            else
                flattenedList.add(element);
        return (T[]) flattenedList.toArray();
    }
}

Bu cevap Jeremy Harton'un yaklaşımına dayanıyor . Bazı yerlerde değiştirdim ve daha golf benzeri bir sürüm oluşturdum.


Arrays.asList () işlevini "dizi" de kullanırken ve foreach lambda ile gidip bunu bir Kollektör ile sonlandırırken daha iyi olmaz mıydı?
Serverfrog

1

JavaScript, 17 Bayt

a=>eval(`[${a}]`)

Son olarak, JavaScript'in tür dönüşümleri iyi bir kullanıma sokulabilir! Lütfen bunun bir dizi çıktısı alacağını unutmayın, ancak dize dönüşümü (HTML'ye koyarak) virgülle ayrılmış bir liste olmasına neden olur.

Virgülle ayrılmış listeler kabul edilebilir çıktıysa, aşağıdakiler geçerlidir:

7 Bayt

a=>""+a

NOT: Snippet bazı nedenlerden dolayı bozuldu

var subject = 
  a=>eval(`[${a}]`)
<input oninput="try {output.innerHTML = subject(this.value)} catch(e) {output.innerHTML='Invaild Input'}" />
<div id="output"></div>


3
Bu giriş konsolu çalıştırıldığında işe yaramadı ["["]... (a=>eval([$ {a}] koşmaya çalıştım ))(["["])ve birSyntaxError
jrich 'de

@jrich. Karakteri karakter yazdığınızda sadece bu hatayı alırsınız. Herhangi bir geçerli diziyi kopyalayıp yapıştırırsanız , beklendiği gibi çalışır. Bu arada, güzel cevap SpeedNinja, sadece oninputbir buttontıklamayla olayı değiştirecektim .
Washington Guedes

Bu, içinde virgül bulunan teller için işe yaramaz
Jo King


1

Ataşesi , 14 bayt

{Reap[Sow@>_]}

Çevrimiçi deneyin!

Neyse ki, Attache bir listenin atomlarında bir fonksiyon uygulayan bir "vektörleştirme" işlecine sahiptir. Bu durumda, yapılacak tüm biz ihtiyacı olan bir orak kurmaktır Reapve Sowgirilecek tüm atomları _ile @>. Bence oldukça şık.

Alternatifler

15 bayt: Fixpoint{`'^^_}

16 bayt: Fixpoint!&Concat

17 bayt: {q:=[]q&Push@>_q}

17 bayt: Fixpoint[&Concat]


1

İksir , 74 bayt

def d(l)do l|>Stream.flat_map(fn x->if is_list(x)do d(x)else[x]end end)end

İlk İksir cevabı, bu yüzden muhtemelen biraz golf olabilir.

Çevrimiçi deneyin.

Açıklama:

def d(l)do l|>            # Recursive method taking a list as input:
  Stream.flat_map(fn x->  #  Map over each item `x` of the input-list:
    if is_list(x)do       #   If `x` is a list itself:
      d(x)                #    Do a recursive call with `x`
    else                  #   Else:
      [x]                 #    Simply leave `x` unchanged
    end                   #   End of the if-else statements
  end)                    #  End of the map
end                       # End of the recursive method

Elbette eğer yerleşiklere izin verilirse, bunun yerine 25 bayt olabilir :

fn(l)->List.flatten(l)end

Çevrimiçi deneyin.



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.