Perl, 39 37 35 bayt
(Önce eski bir sürümü anlatır. Yeni kısa program sonundadır)
İçin +3 içerir -alp
STDIN'de bir karakter kümesiyle çalıştırın, örn. perl -alp kleene.pl <<< "a b c"
kleene.pl
(bu sürüm 34 + 3 bayttır):
$#a=$"=","}for(@a){push@a,<{@F}$_>
İçin +2 ekleyin -F
( -a
giriş karakterleri arasında boşluk yoksa boşluk bırakın veya STDIN üzerindeki karakterler arasına virgül koyarsak -6 (yalnızca @a=""
önce }
) bırakın
Açıklama:
-alp
Seçenekler etkin bir kod olun:
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
our @F = split(' ', $_, 0);
$#a = $" = ',';
}
foreach $_ (@a) {
use File::Glob ();
push @a, glob('{' . join($", @F) . '}' . $_);
}
<>
Perl'de görebileceğiniz gibi sadece okuma çizgisi için kullanılmaz, aynı zamanda kabuk tarzı globbing de yapabilir (aslında eski perls'te kabuk çağrılarak uygulanır).
Örneğin <{a,b}{1,2}>
genişleyecek"a1","a2","b1","b2"
Öyleyse içindeki öğelere @F
sahipsek , aralarına virgül eklememiz gerekir. Enterpolasyon için varsayılan ara karakter, özel değişkende saklanan boşluktur $"
. Ayar Yani $"
için ,
dönecek "{@F}"
içine {a,b}
eğer @F=qw(a b)
(Neználkovo dize olarak genişletmek)
Aslında böyle bir şeyle döngü yapmak isterdim glob"{@F}"x$n++
, ancak ilk boş satırın üretilemediği sorununa devam ettim ve bulduğum tüm geçici çözümler kodu çok uzun zamandır yaptı.
Bu nedenle, bu kodun diğer bir önemli kısmı ise, for
bir dizi üzerinde döngü yapmak için bir döngü kullanırsanız , döngü boyunca fazladan elemanlar zorlayabilirsiniz ve döngü de bu yeni öğeleri alır. Dolayısıyla, eğer döngüde örneğin elementindeyiz "ab"
, o <{@F}$_>
zaman <{a,b}ab>
liste içeriğinin ne olacağı genişleyecektir ("aab", "bab")
. Bu yüzden eğer bunları bastırırsam @a
, bir tane sola doğru uzatılmış teller de kullanılabilir duruma gelir
Yapmam gereken tek şey, döngüyü boş bir dize ile doldurmak. Bu $#a = 0
( ,
sayısal bağlamda olur 0
) kullanılarak yapılır ve bu ilk ve tek elemanın ben kullandığım zamanki @a
gibi davranacak şekilde tanımlanmamasına neden olur.""
Gelişme iyilesme duzelme ilerleme
Aslında bu açıklama için testler yaparak, ilk boş girişi düzgün bir şekilde idare eden büyüyen bir küre kullanmanın kısa bir yolunu buldum. Farklı çalıştır perl -ap kleene0.pl <<< "a b"
(böylece için 2 bayt ekleyin -ap
)
kleene0.pl
(bu sürüm 33 + 2 bayttır):
$"=",";print<$z,>;$z.="{@F}";redo
Tüm bu çözümler bellekteki çıktının gittikçe daha fazla olmasını sağlayacak ve programın bir süre sonra başarısız olmasına neden olacaktır. Perl globlarını tembel üretimi için skaler bağlamda kullanarak da kullanabilirsiniz, ancak bu programları daha uzun hale getirir ....