Belirli bir öğe listesinin tüm kombinasyonlarını oluştur, sıralanmış


13

Bir listeyi ve bir sayıyı girdi olarak alan ve sayının uzunluğu ile tüm olası kombinasyonları üreten bir kod oluşturun. Örneğin, {0,1} listesi ve 2 sayısı ile :

00
01
10
11

Programınızın listede {0,0,0,0,0,1,1,5,5} gibi iki veya daha fazla karakter beklemesi gerekmez.

Kombinasyonları listeye göre sıralanmış şekilde yazdırdığınızdan emin olun:

{0,1} listesi ve 5 sayısı ile (kodumun bir kısmı tarafından oluşturuldu, bu da kazanmak için çok uzun bir yol):

00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
11110
11111

Ancak {1,0} listesi ve 2 sayısı ile :

11
10
01
00

Gördüğünüz gibi, tersine çevrilmiş liste tersine çevrilmiş düzen anlamına gelir.

Yapıya bir bakın, bir ağaç gibi.

Bu kod golf, yani bayt içindeki en kısa kod kazanır!


3
Bunun kopya olacağını düşündüm, ama bir tane bulamıyorum
Luis Mendo

1
Giriş listesi sıralanmazsa sıralama nasıl çalışır?
JAD

@Jarko Girdi endeksleri tuples çıktı sıralanır varsayalım
Luis Mendo

1
@brad, OP başka bir şey söylemedikçe varsayılan cevap evettir.
Stewie Griffin

3
Anlamıyorum ... Kendi adımı kullanıcı adı olarak kullanmanın nesi yanlış?
Stewie Griffin

Yanıtlar:


16

Jöle , 1 bayt

TryItOnline

Kartezyen yerleşik atom, sol argüman öğeleri ve sağ argüman sayımı ile bir ikili bağlantı veya ilk argüman öğeleri ve ikinci argüman sayımı ile tam bir program olarak.


1
Bir bayt! Bu çözüldü!
LMD

4
Ne biliyor musun, SIFIR bir bayt cevabı göndereceğim! JAVA'da! Bunu nasıl buldun, ha? :) (Cidden, yine de. Güzel golf.)
OldBunny2800

9

Haskell, 20 bayt

(mapM id.).replicate

Kullanım exaple:

*Main> ( (mapM id.).replicate )  2 "01" 
["00","01","10","11"]
*Main> ( (mapM id.).replicate )  2 "10" 
["11","10","01","00"]

replicateyapar n2 parametrenin kopyalarını ve mapM idkombinasyonlarını oluşturur. Btw, mapM idaynı sequence, ancak 1 bayt daha az.



6

Pyth, 2 bayt

^F

Formda girdi alan list,numberve bir liste listesi basan bir program .

Test odası

Nasıl çalışır

^F   Program. Input: Q
^FQ  Implicit input fill
 F   Fold
^    repeated Cartesian power
  Q  over Q
     Implicitly print

Bu çözülmüş gibi görünüyor, ama muhtemelen başka biri bunu bir bayt ile yapabilir?
LMD

evet, başkası kazandı (jöle, bir bayt) ama yine de güzel bir çözüm
LMD

6

Perl 6 , 15 bayt

{[X] @^a xx$^b}

Açıklama:

{[X] @^a xx$^b}

{             } # bare block lambda

     @^a        # declare first parameter as Positional
           $^b  # declare second parameter
         xx     # list repeat 「@a」, 「$b」 times

# at this point given 「 (0,1), 5 」
# ((0 1) (0 1) (0 1) (0 1) (0 1))

 [ ]            # list reduce
  X             #    using cross meta-operator

# results in a list of lists
# ((0 0 0 0 0)
#  (0 0 0 0 1)
#  (0 0 0 1 0)
#  (0 0 0 1 1)
#  (0 0 1 0 0)
#  (0 0 1 0 1)
#  ...
#  (1 1 1 1 1))
say {[X] $^a xx$^b}( (0,1), 2 ); # ((0 0) (0 1) (1 0) (1 1))
say {[X] $^a xx$^b}( (1,0), 2 ); # ((1 1) (1 0) (0 1) (0 0))
say {[X] $^a xx$^b}( (0,1,2), 2 );
# ((0 0) (0 1) (0 2) (1 0) (1 1) (1 2) (2 0) (2 1) (2 2))

put {[X] $^a xx$^b}( (0,1), 5 )».join;
# 00000 00001 00010 00011 00100 00101 00110 00111 01000 01001 01010 01011 01100 01101 01110 01111 10000 10001 10010 10011 10100 10101 10110 10111 11000 11001 11010 11011 11100 11101 11110 11111

Perl 6'nın resmi sürümünden sonra Rakudo'nun bir sürümüne geçtiyse , bunu Ideone'de çalıştırabileceksiniz .
Brad Gilbert b2gills

5

JavaScript (Firefox 30+), 55 bayt

f=(a,n)=>n?[for(b of a)for(c of f(a,n-1))[b,...c]]:[[]]

Ben% 99 belirli özyineleme JavaScript bu konuda gitmek için en iyi yoldur.


4

Perl, 30 bayt

28 bayt kod + -nlbayrak.

$"=",";say for glob"{@F}"x<>

Çalıştırmak için:

perl -alE '$"=",";say for glob"{@F}"x<>' <<< "1 0
2"

Girdiyi bir sayı listesi olarak almanın Perl için mantıklı olduğunu düşünüyorum. Bununla birlikte, bazı fantezilere izin verirsek ve girdiyi parantez ve virgülle (soruda gösterildiği gibi) alırsak, 20 bayta düşebiliriz :

perl -nlE 'say for glob$_ x<>' <<< "{1,0}
2"

Açıklamalar: glob Perl'deki ilk amaç dosya adlarını listelemek ve yinelemektir, ancak argümanı süslü parantez içerdiğinde, her parantez grubunun bir elemanından oluşan kombinasyonlar oluşturur.
-aautosplit komutunu girdiler üzerinde boşluk bırakıp sonucu @Fdizinin içine yerleştirir .
$"liste ayırıcıdır: bir dizenin içindeki bir listenin öğeleri arasına eklenen ayırıcıdır. Biz bunu ,, yani "{@F"}üretir üretir {.,.}( @F0 ve 1 içeriyorsa).
Sonra xdize tekrarlama operatörüdür (ve <>bir girdi satırı alır).
Son olarak, say foroluşturulan liste boyunca yinelenir globve öğeleri yazdırır.


4

Mathematica, 6 bayt

Tuples

Hala Jelly'den daha kötü :(

kullanım

Tuples[{0, 1}, 5]

{{0, 0, 0, 0, 0}, {0, 0, 0, 0, 1}, {0, 0, 0, 1, 0}, {0, 0, 0, 1, 1}, {0, 0, 1, 0, 0}, {0, 0, 1, 0, 1}, {0, 0, 1, 1, 0}, {0, 0, 1, 1, 1}, {0, 1, 0, 0, 0}, {0, 1, 0, 0, 1}, {0, 1, 0, 1, 0}, {0, 1, 0, 1, 1}, {0, 1, 1, 0, 0}, {0, 1, 1, 0, 1}, {0, 1, 1, 1, 0}, {0, 1, 1, 1, 1}, {1, 0, 0, 0, 0}, {1, 0, 0, 0, 1}, {1, 0, 0, 1, 0}, {1, 0, 0, 1, 1}, {1, 0, 1, 0, 0}, {1, 0, 1, 0, 1}, {1, 0, 1, 1, 0}, {1, 0, 1, 1, 1}, {1, 1, 0, 0, 0}, {1, 1, 0, 0, 1}, {1, 1, 0, 1, 0}, {1, 1, 0, 1, 1}, {1, 1, 1, 0, 0}, {1, 1, 1, 0, 1}, {1, 1, 1, 1, 0}, {1, 1, 1, 1, 1}}


3

Python, 57 bayt

from itertools import*
lambda o,n:list(product(*([o]*n)))

repl.it

Adsız işlev, bir nesne listesi ove bir sayı nalarak kombinasyonların bir listesini döndürür.


3

Saf Bash, 36

printf -vv %$2s
eval echo ${v// /$1}

Komut satırı parametreleriyle giriş - Liste, parantez içinde virgülle ayrılmış bir listedir, örneğin:

./elemcombo.sh "{0,1}" 2

Arama listesinin tırnak içine alınması gerektiğini unutmayın, böylece çağrı kabuğu çok erken genişletilmez.

Ideone .


Bu işe yaramıyor gibi görünüyor.
Ipor Sircer

Yalnızca girişi n kez tekrarlar, tüm olası kombinasyonları yazdırmaz.
Ipor Sircer

@IporSircer Gerekli giriş formatını açıkladım. Bu şimdi senin için çalışıyor mu?
Dijital Travma

bash a.sh "{0,1}" 2-> {0,1}{0,1}(sürüm 4.4.5 (1)
-çalışma

1
@IporSircer Görünüşe göre TIO muhtemelen argümanları execve () veya benzeri bir çağrıya sokuyor. Tırnaklar yalnızca, çağrılan kabuğun kaşlı ayraçların genişlemesini önlemek için komut dosyası başka bir kabuktan çağrıldığında gereklidir. Ben TIO durumunda, liste tırnak gerektirmez. tio.run/nexus/…
Dijital Travma

3

R , 53 45 bayt

function(x,n)rev(expand.grid(rep(list(x),n)))

Çevrimiçi deneyin!

rev (Bu gerçekten sorun için önemli görünmüyor) istenen kesin sıralama düzenine uygun ve 5 bayt ekler.


Sadece reviçin 45 byte :)
Jayce

Akılda matris vardı ve sonuç aslında bir liste (veri çerçevesi) unuttum.
ngm

1

Raket 123 bayt

(let p((s "")(l(map number->string(sort l <))))
(if(= n(string-length s))(displayln s)(for((i l))(p(string-append s i)l))))

Ungolfed:

(define(f l n)
  (let loop ((s "")
             (l (map number->string (sort l <))))
    (if (= n (string-length s))
        (displayln s)
        (for ((i l))
          (loop (string-append s i) l)))))

Test yapmak:

(f '(0 1) 2)
(f '(0 1) 3)
(f '(0 1) 5)

Çıktı:

00
01
10
11

000
001
010
011
100
101
110
111

00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
11110
11111

1

PHP, 109 bayt

for($o=$a=array_slice($argv,2);--$argv[1];$o=$c,$c=[])foreach($a as$n)foreach($o as$s)$c[]=$n.$s;print_r($o);

Uzunluğu ilk argüman olarak ve listeyi başka argümanlar olarak alır.
Gibi kullanın:

php -r "for($o=$a=array_slice($argv,2);--$argv[1];$o=$c,$c=[])foreach($a as$n)foreach($o as$s)$c[]=$n.$s;print_r($o);" 5 0 1

0 uzunluğu istendiğinde "bellek yetersiz" önemli bir hata ile karşılaşır.


0 uzunluğu ile uğraşmak zorunda
LMD

1

05AB1E , 2 1 bayt s

ã

@Enigma sayesinde -1 bayt .

Çevrimiçi deneyin.

number\nlistOlarak giriş, listelerin listesi olarak çıkış.

Açıklama:

     # Implicit input `a`, `b`
ã    # Take the Cartesian product of list `b` repeated `a` times

1
IBurada ihtiyacın yok.
Emigna

@Emigna Ah elbette. Ben Ibaşlangıçta birden çok giriş var nasıl anlamaya çalışıyordu ve numara ve liste ters vardı çünkü vardı. IOrada tutmak için çok aptalca .. Teşekkürler!
Kevin Cruijssen
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.