Mathematica, 72 65 61 bayt
Print@@@Tuples@{a=##/(b=#5#9#15#21#25#)&@@Alphabet[],b,a,b,a}
Test için Print@@@
ile değiştirilmesini öneririz ""<>#&/@
. Mathematica, sonsuza kadar 288.000 satır yazdırmak yerine, ilk birkaç ve son birkaç kelimeyi gösteren kesik bir form gösterecektir.
açıklama
Sonunda dizeleri bölmek için bir kullanım buldum. :)
Bir süre dizeleri ekleme veya çarpma olasılığı ilgimi çekti, ancak gerçek kullanım durumları oldukça sınırlı. Asıl nokta, Mathematica'da "foo"+"bar"
veya benzeri bir şeyin "foo"*"bar"
(ve dolayısıyla kısa formun "foo""bar"
) tamamen geçerli olduğudur. Ancak, aritmetik ifadelerdeki dizelerle ne yapılacağını tam olarak bilmiyor, bu yüzden bu şeyler değerlenmeden kalıyor. Mathematica , genel olarak uygulanabilir basitleştirmeler uygular. Özellikle, dizgiler kanonik düzende sıralanacaktır (bunlar Mathematica'da oldukça karışık, çeşitli durumlarda harfleri, rakamları ve harf olmayan harfleri içeren dizeleri sıralamaya başladığınızda), bunlar genellikle bir sorun kırıcıdır, ancak burada önemli değildir . Ayrıca, "abc""abc"
basitleştirilecektir"abc"^2
(Bu, tekrarlanan dizeleriniz olduğunda bir problemdir, fakat biz de buna sahip değiliz) ve benzer bir şey "abc"/"abc"
aslında iptal eder (hatta biz onu kullanacağız).
Öyleyse burada ne golf oynamaya çalışıyoruz. Ünlüler listesine ve ünsüzler listesine ihtiyacımız var, bu yüzden Tuples
olası tüm kombinasyonları oluşturmak için onları besleyebiliriz . İlk yaklaşımım saf çözümdü:
Characters@{a="bcdfghjklmnpqrstvwxz",b="aeiouy",a,b,a}
Bu kodlanmış ünsüzlerin listesi biraz acıtıyor. Alphabet
Ünlüleri ucuz bir şekilde çıkarabilseydim, Mathematica'nın kendimden sakınmama izin verecek bir yeri var. Burası zorlaştığı yer. Öğeleri kaldırmanın en basit yolu Complement
, aşağıdaki seçeneklerden birini kullanarak daha uzun olur;
{a=Complement[Alphabet[],b=Characters@"aeiouy"],b,a,b,a}
{a=Complement[x=Alphabet[],b=x[[{1,5,9,15,21,25}]]],b,a,b,a}
(Artık Characters
her şeye başvurmamız gerekmediğine dikkat edin, çünkü Alphabet[]
bir dize değil, bir mektup listesi verir.)
Öyleyse şu aritmetik işi deneyelim. Alfabenin tamamını liste yerine bir harf ürünü olarak temsil edersek, iptal kuralı nedeniyle harfleri basit bir şekilde kaldırabiliriz. Bu çok fazla bayt kazandırır, çünkü ihtiyacımız olmayacak Complement
. Ayrıca, "a""e""i""o""u""y"
aslında ondan daha kısa bir bayttır Characters@"aeiouy"
. Bu yüzden şunu yapıyoruz:
a=##/(b="a""e""i""o""u""y")&@@Alphabet[]
Ünsüz ve ünlü ürünleri sırasıyla a
ve içinde depoladığımız yer b
. Bu, tüm argümanlarını çarpan ##
ve ünlülerin çarpımına ayıran bir işlev yazarak çalışır . Bu işlev, her harfi ayrı bir argüman olarak ileten alfabe listesine uygulanır .
Şimdiye kadar çok iyi, ama şimdi biz var
{a=##/(b="a""e""i""o""u""y")&@@Alphabet[],b,a,b,a}
argüman olarak Tuples
ve bu şeyler hala ürün, listeler değil. Normalde, düzeltmek için en kısa yol List@@@
, bir öne koyar , bu da ürünleri tekrar listelerine dönüştürür. Ne yazık ki, bu 7 baytı eklemek, naif yaklaşımdan daha uzun sürüyor.
Ancak, Tuples
iç listelerin kafalarını hiç umursamadığı ortaya çıkıyor . Yaparsan
Tuples[{f[1, 2], f[3, 4]}]
(Evet, tanımsız bir şey için f
.)
{{1, 3}, {1, 4}, {2, 3}, {2, 4}}
Sanki List
yerine kullanmış gibisin f
. Bu yüzden aslında bu ürünleri doğrudan geçip Tuples
doğru sonucu alabiliyoruz . Bu, iki sabit kodlanmış dizgiyi kullanarak naif yaklaşımdan 5 bayt kazandırır.
Şimdi "a""e""i""o""u""y"
hala oldukça can sıkıcı bir durum. Ama bekle, biz de birkaç byte tasarruf edebiliriz! Bizim fonksiyonumuzun argümanları bireysel harflerdir. Dolayısıyla, doğru argümanları seçersek, üçe daha kısa olan dizgelerin tam anlamıyla yerine tekrar kullanabilirsiniz. Biz argümanları istiyoruz #
(kısaltılmışı #1
), #5
, #9
, #15
, #21
ve #25
. Biz koyarsanız #
sonunda, o zaman biz de herhangi eklemek gerekmez *
(regex), çünkü onları bir arada çoğalmaya #\d+
kendisine eklenmiş olmayan rakamı olamaz tam bir belirteç olduğunu. Bu nedenle #5#9#15#21#25#
, başka bir 4 byte tasarruf yaparak son buluruz .