Yanıtlar:
05AB1E'nin GitHub sayfalarındaki Wiki'nin bir parçası olmadığı için (olması gerektiğini düşünüyorum), şimdi ekleyeceğim, onu daha iyi anlayacağım.
05AB1E, bildiği tüm kelimeleri içeren aşağıdaki words.ex sözlük dosyasına sahiptir . Peki bu sözlükteki kelimelere nasıl erişiriz? Sözcüğü "testing"
örnek olarak alalım:
"testing"
Sözlük dosyasının satır 1453'ünde bulunabilir. İlk iki satır kelime olmadığından ve 0 indeksli sözcüğe ihtiyacımız olduğunda, 3 çıkarırız.
Öyleyse şimdi index ( 1450
) var, ama nasıl kullanılır?
Sıkıştırılmış bir string'i açıp “
† ile başlatırız . Daha sonra info.txt dosyasının ikinci sütununa bakarız . (Yani €
00; ‚
01; vb.)
Bu durumda (14) ve (50) "testing"
anlamına gelir .î
»
Bu "testing"
nedenle sıkıştırılmış dize : “
Çevrimiçi deneyin. Neredeyse tüm 05AB1E kod parçalarında olduğu gibi, dizgeye erişemiyorsanız izlemeniz “
isteğe bağlıdır , bu durumda bu da işe yaramaz .
Unutulmaması gereken bazı şeyler:
İnfo.txt dosyasında indeks bulunmayan tüm karakterler olduğu gibi kullanılabilir. Bu, s
tekil bir kelime yerine çoğul bir çıktının eklenmesi veya ,.?!
örneğin noktalama işaretlerinin kullanılması için yararlı olabilir .
ÿ
(string-interpolation), dizge içindeki yığından değer eklemek istediğinizde de kullanılabilir.
NOT: info.txt dosyasında herhangi bir dizini olmayan her gevşek karakter, aşağıdaki sıkıştırma türleri için bir kelime olarak sayılır.
† Kullanabileceğiniz farklı tipte sıkıştırılmış dizeler vardır:
'
: Olduğu gibi tek bir sıkıştırılmış kelime alın (izlemeye '
gerek yok ) - 'î»
: "test"„
: Boşluk sınırlayıcı ile sıkıştırılmış iki kelime alır (izlemeye „
gerek yok ) - „î»î»
: "test testi"…
: Boşluk sınırlayıcı ile üç sıkıştırılmış kelime alır (izlemeye …
gerek yoktur ) - …î»î»î»
: "test testi testi"“
: Sıkıştırılmış dizgiyi boşluk sınırlayıcı ile alın - “î»î»“
: "test testi"’
: Sıkıştırılmış dizeyi örtük boşluklar olduğu gibi alın - ’î»î»’
: "testingtesting"”
: Başlık sınırlayıcısında sıkıştırılmış dizgiyi boşluk sınırlayıcı ile al - - ”î»î»”
"Test Etme Testi"‘
: Sıkıştırılmış dizeyi boşluk sınırlayıcıyla tam büyük harfle alın - ‘î»î»‘
: "TEST TEST"Burada, kelimelerin boşlukla sınırlandırılmış bir girişine dayanarak sıkıştırılmış dizgiyi almak için faydalı bir program:
'“? lAð«Ã#¸˜ vyU "€‚ƒ„…†‡ˆ‰Š‹ŒŽ•–—™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîï" Dâ vy"“ÿ“".V XlQi y?1#] '“,
Bu program:
lAð«Ã#
), yalnızca bir sözcük girildiyse listedeki sözcükleri sarar ( ¸˜
)vyU
)"€...ï"Dâvy
05AB1E programı ( "“ÿ“".V
) olarak çalıştırmayı deneyecek olan sözlükten bir iç döngü vardır.XlQiy?1#
Bir giriş good bye world
ile çıkış bu nedenle olacaktır “‚¿Þ¡‚ï“
. Çevrimiçi deneyin.
NOT: Bu jeneratörün çalışması için sözlüğün içinde kelimenin var olup olmadığını görmeniz gerekir ve herhangi bir özel karakteri veya çoğul kelimeleri görmezden gelir. Sadece sözlükte tamamen aynı olan kelimeler bulunur.
İşte …Ÿ™‚ï!
"merhaba dünya!" Dizesi için kullandığım bir örnek ve ’‚¿Þ¡ ÿ ‚ï!’
"güle güle ÿ dünya!" dizesi için. Boşlukların ve ünlem işaretinin nasıl kullanıldığını not edin, çünkü info.txt dosyasında indeksleri yoktur. Ek olarak, ÿ
yığının en üstünde bulunan ve ne yazık ki sözlüğün bir parçası olmayan "acımasız" kelimesini eklemek için kullanılır (ancak aşağıdaki bölümdeki yöntemi kullanarak hala sıkıştırılmıştır).
Words.ex sözlük dosyası oldukça büyük olsa da (tam olarak 10.000 kelime), bunun bir parçası olmayan bir sözcüğe veya sadece düz saçma olan bir dizgeye ihtiyacınız olabilir. Yani bunları da sıkıştırmanın bir yolu var mı? Sıkıştırılmış bir temel-255 alfabe tabanlı dize olan,
kesinlikle vardır .•
. NOT: Bu yöntem yalnızca küçük harfli alfabedeki ve boşluklardaki karakterler için kullanılabilir.
Bir sözcüğü / dizeyi sıkıştırılmış base-255 alfabesine dayalı dizgeye dönüştürmek için yararlı bir program:
vAyk})> 27β 255B ".•ÿ•"
Yukarıdaki bu programın yaptığı şey:
vAyk})>
: Girdi harfinin 1 indeksli alfabe indeksini alın, boşluklar indeks olur.27β
: Bu endeksleri taban 27'den tek bir sayıya dönüştür255B
: 05AB1E'nin kendi kod sayfasını kullanarak bu numarayı Base-255'e çevir".•ÿ•"
: Bu sıkıştırılmış dizeden önce bir .•
satır önde•
Burada, @Kaldo 'nun.•zíΘ•
"kaz" kelimesini sıkıştırmak için kullandığı örnek bir cevap .
Diyelim ki bir şey için çok büyük bir sayı kullanmak istiyoruz, ancak gerçekten güç hesaplamaları ile alınamıyor. Örneğin, 18238098189071058293
ne olursa olsun büyük tamsayıya erişmek istediğimizi varsayalım.
Bu durumda •
, formattaki bir sayıyı sıkıştırmak için hem öncü hem de sondaki kısmı kullanabiliriz [1-9][0-9]+
.
Yukarıdaki örnek sayı olacak •15Y₁Ò'Θpc•
. Çevrimiçi deneyin. Yine, sıkıştırılmış sözlük dizgisinde olduğu gibi , takip yolu •
isteğe bağlı olarak kaldırılabilir .
İsteğe bağlı olarak, tamsayı yeterince küçük olduğunda, yalnızca 2 sıkıştırılmış karakterin kullanılması gerektiğinde, Ž
bunun yerine kullanabiliriz ; bu durumda, onu kapatmak için izleyen bir bayta ihtiyaç duymayacağız ve tamsayı 4 yerine 3 baytta sıkıştırılacak. örneğin, tamsayı 13562
sonuçlanır •rl•
, ancak yalnızca iki karakter kullandığından Žrl
bunun yerine olabilir .
Ayrıca, aralıktaki sayılar , 05AB1E'nin kod sayfasından ilave bir karakter ve artı bir karakter [101, 355]
kullanılarak 2 Ƶ
baytta sıkıştırılabilir . Yani, örneğin, Ƶ–
tamsayı için kullanılabilir 250
. İşte tüm mevcut numaralara genel bir bakış. Bu karakterler Base-255'ten Base-10'a dönüştürülür ve ardından 101 eklenir (aralıktaki sayılar [0,100]
zaten 1 veya 2 bayttır).
Bunlar nasıl oluşturulur 15Y₁Ò'Θpc
ve rl
oluşturulur? Çok basit, sayı 05AB1E'nin kendi kod sayfasını kullanarak Base-255'e çevrildi. Aşağıdaki program kullanabilirsiniz Yani o zaman kullanacağı için sıkıştırılmış bir numara almak için Ƶ.
, Ž..
ya da •...•
sıkıştırılmış tamsayı boyutuna bağlı olarak:
101 355Ÿså i 101-255B"Ƶÿ" ë 255B Dg2Qi "Žÿ" ë "•ÿ•"
Burada, @Emigna'nın•3Èñ•
tamsayı için kullandığı örnek bir cevap 246060
.
Bazen bir tam sayı listesini tek bir sayı yerine sıkıştırmak istersiniz. Örneğin, listeyi [5,93,17,83,4,44,32,19,4,45,83,90,0,14,3,17,17,81]
ne nedenle olursa olsun istediğimizi varsayalım. Bu durumda, aşağıdakileri kullanabiliriz: •4βŸ{©£MG]q‡dZΘp•94в
Çevrimiçi deneyin.
Bu sıkıştırılmış sayıyı ve dönüştürmek istediğimiz Temel'i oluşturmak için yararlı bir program:
Z>© β 255B ®s"•ÿ•ÿв"
Yukarıdaki bu programın yaptığı şey:
Z>
: Giriş listesindeki maksimum sayı + 1'i alın ( ©
: ve kayıt defterine kaydedin)β
: Giriş listesini tabandan max+1
tek bir sayıya dönüştürün255B
: Bu sayıyı sıkıştırın (yukarıdaki bölümde yaptığımız gibi)®s"•ÿ•ÿв"
: Biçimdeki sonucu döndürür: satır başı •
, sıkıştırılmış sayı •
, maksimum + 1, izleyenв
İşte •4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в
listeyi sıkıştırmak için kullandığım örnek bir cevap [85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84]
.
Not: Bu cevapta •6j|eDEJÞó(ÍêΓλùÄÞKüzHÇ-ø`JδŠ₂+Öηôî®À8†6/ðÎ6ùøΓ°ÓĆ;ˆ©Ā•2ô
tüm sayılar tam olarak iki rakam olduğundan, eşit baytlık (57) bir alternatiftir. Bazı durumlarda (özellikle küçük listeler) bu daha kısa bir alternatif olabilir.
Tamsayılı sıkıştırma vs Tamsayılı liste sıkıştırma:
Bu ikisi ile her iki şekilde gidebilir. Bazen sıkıştırılmış bir liste daha kısa, bazen sıkıştırılmış bir tamsayı, bazen tamamen farklı bir alternatif daha kısadır. Bu nedenle, yukarıdaki jeneratörlere tamamen güvenmek yerine, muhtemelen daha fazla golf oynamak için kendi yargı ve golf becerilerinizi kullanın. İşte bazı örnekler:
[44, 59]
( @Emigna'nın bu cevabında kullanılır ):
•A–•60в
7 bayttır (sıkıştırılmış tamsayı listesi üreticisi tarafından oluşturulur)•H|•2ô
veya •H|•2ä
veya kodlanmış 44 59‚
tüm 6 baytŽH|2ô
veya ŽH|2ä
her ikisi de 5 bayttır„,;Ç
4 bayt ile en iyi seçenek olacaktır (',' ve ';' karakterlerinin kod noktaları)[2,4,6,0]
( @Emigna'nın bu cevabında kullanılır ):
•3ā•7в
6 bayttır (sıkıştırılmış tamsayı listesi üreticisi tarafından oluşturulur)Ž3ā7в
5 bayttırŽ9¦S
4 bayt ile en iyi seçenek olacaktır (2460 tamsayıları bir basamak listesine sıkıştırılmış)10101001100101001
( bu cevabımın cevabında kullanılmış ):
•a½₄Ƶ6®í•
9 bayttır (sıkıştırılmış büyük tamsayı üreteci tarafından üretilir)•1∊}•2вJ
8 bayttır (eklenen birleştirme ile sıkıştırılmış tamsayı listesi üreteci tarafından oluşturulur)•1∊}•b
6 bayt ile en iyi seçenek (sıkıştırılmış tamsayı listesi, yerine bir ikilik ile sıkıştırılmış tamsayı listesi 2в
)[85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84]
( bu cevabımın cevabında kullanılmış ):
•4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в
57 bayttır (sıkıştırılmış tamsayı listesi üreticisi tarafından oluşturulur)•6j|eDEJÞó(ÍêΓλùÄÞKüzHÇ-ø
JδŠ₂ + Öηôî®À8 † 6 / ðÎ6ùøΓ ° C; ©  • 2ô` (boyut 2 bölüme sıkıştırılmış bir tamsayı, ayrılma) da 57 byte bir•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ
,λ₂ϦP(Ì•65в₂+
ancak 2 bayt daha kısadır, listeyi her bir değer 26 daha düşük olacak şekilde sıkıştırarak daha sonra `₂ + ` ile ekleyin . Daha sonra tek baytlık bir değer ekleme hilesi, baytları sıkıştırılmış listelerde kaydetmek için sıklıkla kullanılabilir.05AB1E'nin piyasaya sürüldüğü günlerde, örtük girdi oldukça yeni ve şıktı. Günümüzde diğer rekabetçi dillerle (Jelly, MATL, Pyth, vs.) takip etmek için gerekli gibi görünüyor.
Örneğin, iki sayı eklemek istediğinizde şunları yapabilirsiniz II+
:
I # Input_1.
I # Input_2.
+ # Add them up.
Bununla birlikte, örtük girdi kullanarak , yalnızca 1 bayta kadar kısaltabiliriz, yani +
:
+ # Take two numbers implicitly and add them up.
Bu, yalnızca yığının uzunluğu operatörün arkasından küçük olduğunda gerçekleşir. Son bir örnek 3+
. +
Operatörün aritesi yığında sadece 1 eleman varken 2'dir :
3 # Push the number 3 on top of the stack.
+ # Request implicit input and add to the 3.
£
b
dizenin ilk karakterlerini almak için kullanılan komuttur a
.
örn: "hello_world"5£
->
"hello"
Fakat eğer b
bir endeks listesi ise, dizeyi bu büyüklüklerin (üstüne) parçalarına böler.
örn: "hello_world"5L£
->
['h', 'el', 'lo_', 'worl', 'd']
05AB1E'de biraz gizlenmişler. İşte tüm önceden tanımlanmış değişkenlerin bir listesi:
¾
0
counter_variable bu komuttan önce değişmediyse , iter .X
, 1
X değişkeni bu komuttan önce değişmediyse iter U
.Y
, 2
Y değişkeni bu komuttan önce değişmediyse iter V
.®
, -1
eğer bu komuttan önce kayıt değiştirilmezse , iter ©
.¯
, []
bu komuttan önce global_array öğesine hiçbir şey eklenmediyse (boş dizi) iter .¸
, [""]
giriş yoksa boş bir yığına iter . (Bunu bulmak için @Emigna teşekkür ederim.)¾
iter 0 => o olmayan anımsatıcı alır gibi yaklaşık en
¾
Yalnızca 0 itmek istiyorsanız 0 olarak başlatılır bir karşı değişkeni 0 kurs daha doğal taşımaktadır iter, ancak itmek isterseniz 5,0,7
, 5¾7
2 daha kısadır bayt olduğunu 5 0 7
.
¾
demek istediğim .75
, bir zamanlar bu gerçeği Pyth ile yendim . Bu yeni çıkmış golf dilleri, anımsatıcılarla ilgili bir ipucuna sahip değil ...
print(3 / 4)
Python'da 2 bana veriyor 0
.
M
başındaysa , iter -Inf
.
Λ
veya .Λ
)Dokümanların bir parçası olmadığından ve @Adnan şu anda yazmak için biraz meşgul olduğundan, şimdilik burada bir ipucu olarak eklemek için izin istedim.
Canvas işlevi ( Λ
veya .Λ
), ekranda ASCII çizgileri çizmek için kullanılabilir. Üç gerekli parametreye sahiptir:
[0,7]
, bir veya daha fazla kullanabileceğimiz yönleriçin rakamlarımız vardır. Belirli bir karakter gerektiren bazı özel seçenekler de vardır (daha sonra bununla ilgili daha fazla).Yön haneleri [0,7]
aşağıdaki yönlere eşlenir:
7 0 1
↖ ↑ ↗
6 ← X → 2
↙ ↓ ↘
5 4 3
Tuvalin kullanıldığı yerlerde bazı örnek 05AB1E cevapları:
En sonuncusu gibi bir şey yapalım, bu yüzden Canvas Λ
işlevini aşağıdaki üç parametre ile kullandığımızı varsayalım :
[3,3,5,5,7,7,9,9]
!@#
[0,2,4,6]
Bu aşağıdaki çıktıyı verecektir:
!@#!@#!
# @
@ #!@ #
! @ # !
# ! ! @
@ @ #
!#@!# !
@
@!#@!#@!#
Peki nasıl çalışıyor? Peki, işte bu girdilerin üstündeki adımlar:
3
(karakter !@#
) yukarı doğru (yön 0
)3-1
Karakterleri ( !@
) sağa doğru (yön 2
)5-1
Karakterleri ( #!@#
) aşağıya doğru (yön 4
)5-1
Karakterleri ( !@#!
) sola doğru (yön 6
)7-1
(karakter @#!@#!
) yukarı doğru (yön 0
)7-1
Karakterleri ( @#!@#!
) sağa doğru (yön 2
)9-1
Karakterleri ( @#!@#!@#
) aşağıya doğru (yön 4
)9-1
Karakter çiz (!@#!@#!@
) sola doğru (yön 6
) -1
Çizgiler örtüşmesi vardır. Yani ilk iki adım:
#
@
!
Ve
!@
Hangi birleştirilir:
#!@
@
!
Bazı küçük notlar:
[0,7]
temel olarak belirli bir yön sırasına çeviren birkaç özel seçenek vardır.
+
( '+
satır içi) verilen uzunluktaki kollarla çaprazlama 04402662
oluşturan +
kalıba dönüşür.Hareket halinde görün.×
( '×
satır içi) verilen uzunluktaki kollarla çaprazlama 15513773
oluşturan X
kalıba dönüşür.Hareket halinde görün.8
çizmeye başladığımız yerin orijine geri döner. Eylem olarak görmek ve olmadan farkı görmek8
.Λ
İrade çıkışı derhal ve.Λ
istifte itilen ve hala istediğimiz her şeyi yeniden kullanabileceğimiz, değiştirebileceğimiz ve yapabileceğimiz bir dizge çıkar. Bazı örnekler:
+×8
ben gerçekten kaynak kodunda baktım.
Diğer yığın tabanlı dilde gibi, 05AB1E fonksiyonları genellikle pop (tüketmek) girdilerini yığından ve yığına üretimlerini itin.
Ancak, bazı işlevler olsun bunları tüketen olmadan yığınından girdilerini. Bir örnek, girdi listesinden ilk elemanı üreten head
fonksiyondur ¬
. Burada bir örnek program bakınız: ¬+
. Bu, giriş listesinin ilk sayısını o listenin her sayısına ekler.
Hangi fonksiyonların patladığını ve hangilerinin geldiğini bilmek için, fonksiyon bilgi dosyasındaki ilgili sütuna bakın .
Döngüler ve şart koşucular bir programın sonunda otomatik olarak kapanış parantezleri alırlar; bu nedenle, bunları döngünün / koşulların dışında bir şeye ihtiyacınız olursa koda eklemeniz gerekir.
Örneğin, ilk n
asal sayıların bir listesini oluşturan bu (asılsız) programın kapatma dirseklerine ihtiyacı yoktur.
[¹¾Q#NpiNˆ¼
Fakat sonuçta ortaya çıkan listede bir işlem yapmak isteseydik, örneğin delta almak için önce döngüyü kapatmamız gerekir.
[¹¾Q#NpiNˆ¼]¯¥
Bu yol boyunca öğrendim küçük golf ipuçları ile bu genişletecek. (Sadece 05AB1E şahsen başladı.)
D
(çift) ve Ð
(üç katlı) ile kombinasyon halinde s
(takas) ve Š
(üç-takas a,b,c
için c,a,b
) kullanılarak göre genellikle daha kısa olan ©
(içinde kaydetmek global_variable ) ve ®
(itme global_variable ) döngüler içinde. Bu bir benim bu yanıtında bayt kaydedilmiş içinde, hem de iki benim bu cevap .½
(1 ise, o zaman artırmak counter_variable 1 ile) sonunda gerekli değildir µ
(ederken counter_variable ! = a, do ...) ki (örtük bitti beri benim bu yanıtında bir bayt kaydedilir )..B
dolaylı olarak yeni çizgiler üzerinde böler. Bu benim¡
cevabımda, boş eşyaları tutarken (bölme) için bir alternatif aradığımızda benim cevabımda faydalı oldu (NOT: Bağlantılı cevabın çözümü, öğeler bölmeden sonra boşluklar içerdiğinde işe yaramaz.) - Umarım bir yerleşik bölünmeye eklenir ancak gelecekte boş satırlar kalır.SÖ
(giriş tamsayısının rakamlarından hangisi giriş tamsayısını eşit bir şekilde bölebilir) basamakların sayısının kendisini içerir 0
(sıfıra bölme hataları yerine). Örneğin, (1053 1 ve 3 ile bölünebilir; 5 ile bölünemez; 0 için bölünerek sıfır hatası verir) ile 1053
sonuçlanır[1,1053,0,1]
. Bu benim1
cevabımdaki listenin gücünü alarak benim için oldukça yararlı oldu , çünkü sadece 05AB1E'deki acımasızlık ve diğer her şey yanlış. bu nedenle SÖP
truthy ( 1
) ile sonuçlanan bir giriş tamsayı, her bir basamağı tarafından eşit şekilde bölündüğü anlamına gelir.û
(belirli bir dize palindromize) bir is_palindrome yerleşik olmadığını şaşırttı . Ancak daha sonra bunu gerçekleştirmek için sadece 2 bayta ihtiyaç duyulduğunu fark ettim, bunun hangisi olduğu ÂQ
( Â
bifürkat olduğu, bunun için kısa DR
: Çoğalt ve Ters kopya; Q
yığındaki ilk iki değerin eşit olup olmadığını kontrol etmek).Ds*
(yinelenen, takas, mantıksal-VE) gibi davranmak için (yinelenen, değiştir, tekrarla) satırları boyunca bir şeye ihtiyacınız olacaktır }ʒ
. Örneğin: Bu mücadelede , en az bir tane içeren 0
ve rakamların toplamına eşit olan dört basamaklı tüm sayıları listelemeliyiz 9
. Bir aralık kullanılması [1000,10000]
, dört basamak uzunluğunu kapsar, ancak daha sonra iki filtre daha kalır. Başlangıçta ₄4°ŸʒD0åsSO9Q*
(14 bayt) kullandım, fakat iki filtre kullanarak bir bayt kaydedilebilir: ₄4°Ÿʒ0å}ʒSO9Q
(13 bayt). (Hangisi daha sonra ₄4°ŸεW°ö9Q
(10 byte) ' a kadar golf oynadı golf oynadı)?)0
ile dolgu olarak sıkıştırmak istediğinizde kullanabilirsiniz 0ζ
. Bununla birlikte, bununla ilgili bir sorun, dolgunun 0
bir dizge haline gelmesidir "0"
, bu nedenle daha sonra karışık dizeler ve tamsayı ile sıralama yapmayı denerseniz, bu muhtemelen istediğiniz sonucu vermeyecektir. O sıkıştırılmış iç listelerini sıralamak nasıl bir örnek Buraya: 0ζ€{
. Bu int için açık bir döküm (ilave edilmesi suretiyle tespit edilebilmektedir ï
ancak o zaman sıralama zip sonra), ve: 0ζï€{
. Bununla birlikte, zip-dolgu ile ¾
aynı sabiti kullanmak, 0
zip sırasında bir string yerine bir tamsayı olarak kalmasına neden olacaktır. Yani ¾ζ€{
burada bir bayt kurtaracak. Bu ipucu tarafından sağlanan Mr.Xcoder @ bir byte kaydetmek için benim bu yanıtında .€SO
. Ancak daha kısa 1ö
olanı otomatik olarak vektörleştiren kullanıyor. Bu ipucu @Grimy tarafından burada bir byte (ve burada 2 byte ) tasarruf etmek için verilmiştir .2‹
. Bununla birlikte, !
(faktoring) kullanmak ayrıca 0
ve için sadece 1 (truthy) ile 1
sonuçlanacaktır ve diğer her değer daha yüksek bir şeyle sonuçlanacaktır (ve bu nedenle 1
falsey , çünkü sadece 05AB1E'deki truthy'dir). Bu ipucu tarafından sağlandı @Grimy için buraya bir bayt kaydetmek .05AB1E’deki bazı operatörlerin dizilerde otomatik olarak vektörleştirdiğini unutmayın. Örneğin 5L3+
, aşağıdaki sözde koduna aykırı olan kod:
[1, 2, 3, 4, 5] + 3
olacaktı:
[4, 5, 6, 7, 8]
Otomatik olarak vektörleşmiyorsa, €
operatörü de kullanabilirsiniz . Tek bir karakter komutu alır ve bu (monadik) operatörünü her eleman üzerinde gerçekleştirir. Her öğeyi bölmek için bir örnek aşağıdaki koddur ( burada deneyin ):
€S
Oysa normal S
işleç, dizideki her öğeyi bölüştürür ve tek bir diziye düzleştirir ( burada deneyin ).
ñ
önce gelen değerleri n
(dizin) kullanarak listeleri birleştirin . tio.run/nexus/05ab1e#@2/iw2XiE2Tio81ldHjj//8A
Girdiğiniz emrin kodunuz üzerinde çok büyük bir etkisi olabilir ve çoğu zaman s
, yığının en üstünü yığında en yüksek şeyle değiştirmek için kullanıyorsanız , sorunu doğru düşünemezsiniz. Girişleri yeniden sıralamaya çalışın ve girişleri zamanından önce değiştirerek, önceden yığına ekleyerek veya bir yere çoğaltarak değiştirme gerekliliğinden kurtulabileceğinizi görün. En belirgin I&O en başarılı 05AB1E cevabı olabilir.
Aşağıdaki kod, ASCII sanatını özel bir temel dönüştürme kullanarak 05AB1E'ye dönüştürmeye yardımcı olur.
|»©ÐÙSDŠ¢øΣθ}R€н¬®sÅ?iD2£RDŠKsì}J©žLR‡®gö₅B®s"•ÿ•“ÿ“ÅвJ"
Bu, aşağıdakiler tarafından gerçekleştirilir:
0-9A-Za-z
Her biri değiştirilinceye kadar girişin karakterlerini o sırayla eşleştirin, her biri kendi eşleme karakterini elde eder.•<compressed_integer>•“<sorted_distinct_characters>“ÅвJ
.“
Ayrıca kompres dize tırnak yapmanızı sağlar "
; Åв
Bu dizisi kullanılır özel baz olarak dizge kullanılarak oluşturulan tamsayı taban-dönüştürmek; ve J
tüm bu karakterleri birlikte verilen tek bir dizgeyle birleştirecektir.
ASCII-art için iyi 62 eşsiz karakter içeren ve içinde olan desenleri kabul eder.
Benzersiz karakter sayısı ne kadar az olursa, sıkıştırma o kadar iyidir.
XNOR dijital zamanlama şemasını çizin (214 bayt, 9 benzersiz karakter) için örnek çıktı :
┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐
A ──┘ └─┘ └─┘ └─┘ └─┘ └─┘ └──
┌───┐ ┌───┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐
B ┘ └─┘ └─┘ └─┘ └───┘ └─┘ └
┌─────┐ ┌─┐ ┌─┐ ┌───┐
X ──┘ └───┘ └───┘ └───┘ └────
Olabilir:
•I£.µ*:]ó±øqaµb₄ΘYQmœ¹µû₄p´ζÂĆ_5ŠKÑ×ðòË|₄#¹¶úôÂ-Í|¯ε¼É₂ïδ&é–9»ÞFò1î×HÃBjý2ĆÉ≠FYÂÂèC j‘£Å₅Œ•“─ └┘┐┌
XBA“ÅвJ
(106/214) * 100 = orijinal ASCII-art dizesinin boyutunun% 49.53'ü.
05AB1E'deki (eski) bu meydan okuma için yaptığım asıl başvurumla aynı bayt sayısı .
NOT: Kod kesinlikle golf oynamaz. ASCII sanatını en verimli sıkıştırmaya dönüştürmek için hızlıca yazılmıştır, bu yüzden oldukça çirkin ve uzun ..
|» # Take multi-line input
© # Store it in the register to reuse later
ÐÙS # Only leave unique characters (as list)
DŠ¢ø # Map it with the count for each of those characters
Σθ}R # Sort it based on that count (highest to lowest)
€н # Remove the count again, so the sorted characters remain
¬®sÅ?i # If the input starts with the most occurring character:
D2£RDŠKsì} # Swap the first two characters in the list
J© # Join everything together, and store it in the register to reuse later
žLR‡ # Map each character to [0-9A-Za-z]
®gö # Get the amount of unique characters, and convert it to that Base
₅B # And then convert that to Base-255
®s # Push the string and swap so the compressed integer is at the top again
"•ÿ•“ÿ“ÅвJ" # Insert it in the correct output format
# `•<compressed_integer>•“<sorted_distinct_characters>“ÅвJ`
"•ÿ•" # (after which the result is output implicitly with trailing newline)
<str><compr_int><int>вèJ
yerine kullanarak <compr_int><int>BžLR<str>‡
; ve string-tırnak “
yerine yerine , girişin bir parçası olabilir. "
"
Herkesin kabul ettiği bir şey değil ama işe yarıyor.
Aşağıdaki iki programı göz önünde bulundurun:
4 5+
"4""5"+
Her ikisi de 9 sonuçlanır . Bunun nedeni, her değerin ilk önce (ile ast.literal_eval
) değerlendirilmesidir . Bu nedenle, tüm dize manipülasyon operatörlerini ints üzerinde ve tüm int manipülasyon operatörlerini dize üzerinde gerçekleştirebiliriz.
Örneğin , sonuçta 12345û
palindromize olur 12345
, sonuçta 123454321
. Ondan sonra bu sayı üzerinde düzenli bir matematik yapabiliriz.
12345û50000-
Bu sonuçlanacaktır: 123404321 .
05AB1E aşağıdaki normal döngülere ve yineleyicilere sahiptir:
F
, 0 ile yinelenir .. n-1 .G
, 1 ile yinelenir .. n-1 .ƒ
, 0 ile yinelenir .. n .v
, her elemanın üzerinde yinelenen s [0], s [1], .., s [n] .ʒ
tam olarak bir döngü değil, bir süzgeç komutudur. Bu komutu her bir öğenin içinde döngüde bulunma biçiminin istenmeyen davranışı nedeniyle kötüye kullanıyoruz.Bu döngüleri kullanarak, aşağıdaki gizli döngüleri türetebiliriz :
gF
kullanılabilecek v
bir N
deindex olanı da kullanabilirsiniz .vy -> ʒ
Yedek biraz daha karmaşıktır:
y
Bu tür ilmeklerde çağrı yapmak mümkün değildir.[
, µ
ve ε
döngüler / yineleme normalin de parçası?
y
şimdi bunlardan bazıları ile çağırmak mümkündür.