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 0
temsilci 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 32223
iç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 1
ve
ile 0
elde 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 ...)