Japt , 43 bayt
"Ýûÿ©ÿßY÷ß"®c s4äëAU ¬£2839¤ë4X÷d0S1U
Bazı yazdırılamazlar içeriyor. Çevrimiçi deneyin!
Tallies: 13 bayt sıkıştırılmış veri, açmak için 9 bayt ve çıktıyı oluşturmak için 21 bayt.
açıklama
Kod çözülmemiş kod:
"Ýûÿ©ÿßY÷ß"® c s4à ¤ ëAU ¬ £ 2839¤ ë4Xà · d0S1U
"Ýûÿ©ÿßY÷ß"mZ{Zc s4} s2 ëAU q mX{2839s2 ë4X} qR d0S1U
Tam olarak 4 farklı sıra olasılığı vardır: ( #bir rakamı temsil eder)
#
#
# #
###
Böylece, her sayı beş baz-4 basamaklı bir küme olarak saklanabilir. Her sayı daha sonra 10 bit içinde saklanabildiğinden, toplam 100 bittir ve 13 bayta karşılık gelir. Sıkıştırma işlemini atlayacağım ve dekompresyonu açıklayacağım.
mZ{Zc s4}
mZ{ } // Replace each character Z in the compressed string with the following:
Zc // Take the char-code of Z.
s4 // Convert to a base-4 string.
Dekompresyondan sonra 13 baytlık sıkıştırılmış dize şöyle görünür:
3131332333332111200122213333313321011121213133133133
4 basamaklı çalışmalardan herhangi biri ile başlarsa bunun başarısız olacağını unutmayın 0, çünkü çalıştırıldığında önde gelen sıfırlar kapalı kalacaktır s4. Bunu sadece üç kez görünen 0temsilci ile düzeltebiliriz # ve bunların hiçbiri 4 haneli bir çalışmanın başlangıcına düşmez.
s2 // Slice off the first two chars of the result.
Tamam, bu yüzden 50 basamaklı dizgimizi 4 parça halinde güzelce sıkıştırmak için iki ekstra rakam eklememiz gerekiyordu. Bunları dizenin başına eklemek, onları bir byter ile parçalayabileceğimiz anlamına gelir ¤.
ëAU // Take every 10th (A) char in this string, starting at index <input> (U).
Utanç verici bir şekilde, Japt, bir dizeyi X uzunluğundaki dilimlere bölmek için yerleşik bir yapıya sahip değildir. tüm ikinci sıralar vs.
Yani şimdi biz, örneğin oluşturmak istediğiniz rakamı kodlayan 5 haneli dizesi var 32223için 0.
q mX{2839s2 ë4X} qR
q // Split the resulting string into chars.
mX{ } // Replace each char X with the result of this function:
2839s2 // Convert the magic number 2839 to a binary string.
ë4X // Take every 4th char of this string, starting at index X.
qR // Join the result with newlines.
Sihirli sayıyı açıklamak için dört ayrı satıra bakın. Eğer değiştirirseniz #ile 1ve ile 0elde edersiniz
100
001
101
111
Bunu aktarmak ve sonra tek bir dizeye katılmak bize verir 101100010111. Ondalık biçime dönüştürün ve 2839'a sahipsiniz. Süreci tersine çevirmek rakamları eşleştirir0123 çevirmek, yukarıda gösterilen dört ikili satıra .
Neredeyse bitti! Şimdi tek yapmanız gereken boşluklara ve rakamlara eklemek:
d0S1U // In the resulting string, replace 0 with " " (S) and 1 with <input> (U).
Presto, örtük çıktı gerisini halleder. Üzgünüm bu açıklama çok uzun, ama daha az anlaşılır hale getirmeden golf yapmak için gerçek bir yol göremiyorum (anlaşılabilir ise ...)