Odpowiedzi:
Ponieważ nie była częścią Wiki na stronach GitHub 05AB1E (myślę, że powinna), po prostu dodam ją teraz, aby lepiej ją zrozumieć.
05AB1E ma następujący plik słownika words.ex zawierający wszystkie znane mu słowa. Ale w jaki sposób uzyskujemy dostęp do słów w tym słowniku? Weźmy słowo"testing"
za przykład:
"testing"
można znaleźć w wierszu 1453 pliku słownika. Ponieważ pierwsze dwa wiersze nie są słowami i potrzebujemy słowa o indeksie 0, odejmujemy 3.
Więc teraz mamy indeks ( 1450
), ale jak go używać?
Otwieramy i rozpoczynamy skompresowany ciąg za pomocą “
† . Następnie patrzymy na drugą kolumnę pliku info.txt . (Tak €
jest 00; ‚
jest 01; itd.)
W przypadku "testing"
tego środka î
(14) i »
(50).
Skompresowany ciąg znaków "testing"
to: “
Wypróbuj online. Podobnie jak w przypadku prawie wszystkich fragmentów kodu 05AB1E, trailing “
jest opcjonalny, jeśli nie masz dostępu do ciągu, więc bez działa również w tym przypadku .
Kilka rzeczy do zapamiętania:
Wszystkie znaki, które nie mają żadnego indeksu w pliku info.txt, mogą być używane tak jak są. Może to być przydatne do dodawania s
do generowania liczby mnogiej zamiast pojedynczego słowa lub użycia interpunkcji jak ,.?!
na przykład.
ÿ
(interpolacja ciągów) może być również używana, gdy chcesz wstawić wartości ze stosu w ciągu.
UWAGA: Każdy luźny znak, który nie ma żadnego indeksu w pliku info.txt, liczy się jako słowo dla poniższych typów kompresji.
† Istnieją różne rodzaje skompresowanych ciągów, których możesz użyć:
'
: Weź jedno skompresowane słowo w takiej postaci, w jakiej jest (nie jest '
wymagane kończenie ) - 'î»
: „testowanie”„
: Pobiera dwa skompresowane słowa z separatorem spacji (nie jest „
wymagane kończenie ) - „î»î»
: „testowanie testowe”…
: Pobiera trzy skompresowane słowa z separatorem spacji (nie jest …
wymagane końcowe ) - …î»î»î»
: „testowanie testowanie testowanie”“
: Weź skompresowany ciąg z separatorem spacji - “î»î»“
: „testowanie testowania”’
: Weź skompresowany ciąg bez ukrytych spacji - ’î»î»’
: „testingtesting””
: Weź skompresowany ciąg znaków w tytule z ogranicznikiem spacji - ”î»î»”
: „Testowanie Testowanie”‘
: Weź skompresowany ciąg dużymi literami z separatorem spacji - ‘î»î»‘
: „TESTOWANIE TESTOWANIE”Oto przydatny program do uzyskania skompresowanego ciągu znaków na podstawie słów oddzielonych spacjami:
'“? lAð«Ã#¸˜ vyU "€‚ƒ„…†‡ˆ‰Š‹ŒŽ•–—™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîï" Dâ vy"“ÿ“".V XlQi y?1#] '“,
Ten program będzie:
lAð«Ã#
) lub zawija je na liście, jeśli wprowadzono tylko jedno słowo ( ¸˜
)vyU
)"€...ï"Dâvy
), które spróbuje uruchomić jako program 05AB1E ( "“ÿ“".V
)XlQiy?1#
Z wejściem good bye world
wynik byłby zatem “‚¿Þ¡‚ï“
. Wypróbuj online.
UWAGA: Musisz jeszcze sprawdzić, czy słowo istnieje w słowniku, aby ten generator działał i zignoruje wszelkie znaki specjalne lub słowa w liczbie mnogiej. Zostaną znalezione tylko te słowa, które są dokładnie takie same w słowniku.
Oto przykład, w którym używam …Ÿ™‚ï!
ciągu „witaj świecie!” a ’‚¿Þ¡ ÿ ‚ï!’
na ciąg „do widzenia ÿ świecie!”. Zwróć uwagę, jak spacje i wykrzyknik są używane, ponieważ nie mają indeksów w pliku info.txt. Ponadto używa ÿ
wstawiania „okrutnego”, który był na górze stosu, który niestety nie był częścią słownika (ale nadal był skompresowany przy użyciu metody opisanej w poniższej sekcji).
Mimo że plik słownika words.ex jest dość duży (dokładnie 10 000 słów), może się zdarzyć, że potrzebujesz słowa, które nie jest jego częścią, lub łańcucha, który jest zwykłym bełkotem. Czy istnieje więc sposób na ich skompresowanie?
Z pewnością istnieje użycie .•
skompresowanego ciągu opartego na bazie alfabetu-255. UWAGA: Tej metody można używać tylko dla znaków z małych liter i spacji.
Oto przydatny program do konwersji słowa / ciągu na skompresowany ciąg oparty na alfabecie base-255:
vAyk})> 27β 255B ".•ÿ•"
Powyższy program obejmuje:
vAyk})>
: Weź indeksy alfabetu z 1 indeksem dla poszczególnych liter wejścia, a spacje będą miały indeks 027β
: Konwertuj te indeksy z bazy 27 na jedną liczbę255B
: Konwertuj ten numer na Base-255, używając własnej strony kodowej 05AB1E".•ÿ•"
: Umieszcza wiodący .•
i końcowy •
przed tym skompresowanym ciągiemOto przykład odpowiedź gdzie @Kaldo wykorzystuje .•zíΘ•
do kompresji słowo „gęś”.
Powiedzmy, że chcemy do czegoś użyć bardzo dużej liczby, ale tak naprawdę nie można jej odzyskać za pomocą obliczeń pow. Załóżmy na przykład, że chcemy uzyskać dostęp do dużej liczby całkowitej 18238098189071058293
z dowolnego powodu.
W tym przypadku możemy użyć zarówno wiodącego, jak i końcowego, •
aby skompresować liczbę w formacie [1-9][0-9]+
.
Powyższy przykładowy numer stanie się •15Y₁Ò'Θpc•
. Wypróbuj online. Ponownie, podobnie jak w przypadku skompresowanego ciągu słownika, trailing •
można opcjonalnie usunąć .
Opcjonalnie, gdy liczba całkowita jest wystarczająco mała, aby użyć tylko 2 skompresowanych znaków, możemy użyć Ž
zamiast tego, w którym to przypadku nie będziemy potrzebować tylnego bajtu, aby ją zamknąć, a liczba całkowita zostanie skompresowana w 3 bajtach zamiast 4. Dla przykład, liczba całkowita 13562
spowodowałaby •rl•
, ale ponieważ używa tylko dwóch znaków, może być Žrl
zamiast tego.
Liczby z tego zakresu [101, 355]
można również skompresować w 2 bajtach przy użyciu Ƶ
plus dodatkowego znaku ze strony kodowej 05AB1E. Na przykład Ƶ–
można użyć liczby całkowitej 250
. Oto przegląd wszystkich dostępnych numerów. Znaki te są konwertowane z Base-255 na Base-10, a następnie dodawane jest 101 (ponieważ liczby w zakresie [0,100]
mają już 1 lub 2 bajty).
Jak są one tworzone 15Y₁Ò'Θpc
i rl
tworzone? Bardzo prosto, liczba jest konwertowana na Base-255 przy użyciu własnej strony kodowej 05AB1E. Więc można użyć poniższy program, aby uzyskać sprężonego numer, na który będzie następnie użyć Ƶ.
, Ž..
lub •...•
w zależności od wielkości sprężonego całkowitej:
101 355Ÿså i 101-255B"Ƶÿ" ë 255B Dg2Qi "Žÿ" ë "•ÿ•"
Oto przykładowa odpowiedź, w której @Emigna używa •3Èñ•
liczby całkowitej 246060
.
Czasami chcesz skompresować całą listę liczb całkowitych zamiast pojedynczej liczby. Załóżmy na przykład, że chcemy listy [5,93,17,83,4,44,32,19,4,45,83,90,0,14,3,17,17,81]
z jakiegokolwiek powodu. W takim przypadku możemy zamiast tego użyć następujących opcji: •4βŸ{©£MG]q‡dZΘp•94в
Wypróbuj online.
Tutaj przydatny program do generowania zarówno tej skompresowanej liczby, jak i bazy, na którą chcemy przekonwertować:
Z>© β 255B ®s"•ÿ•ÿв"
Powyższy program obejmuje:
Z>
: Uzyskaj maksymalną liczbę + 1 z listy wejść ( ©
: i zapisz ją w rejestrze)β
: Konwertuj listę wprowadzania z bazy max+1
na pojedynczy numer255B
: Skompresuj ten pojedynczy numer (jak to zrobiliśmy w powyższej sekcji)®s"•ÿ•ÿв"
: Zwraca wynik w formacie: wiodący •
, liczba skompresowana •
, maks. + 1, końcoweв
Oto przykładowa odpowiedź, w której używam •4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в
do kompresji listy [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]
.
PS: W tej odpowiedzi •6j|eDEJÞó(ÍêΓλùÄÞKüzHÇ-ø`JδŠ₂+Öηôî®À8†6/ðÎ6ùøΓ°ÓĆ;ˆ©Ā•2ô
jest alternatywa dla równych bajtów (57), ponieważ wszystkie liczby mają dokładnie dwie cyfry. W niektórych przypadkach (szczególnie na małych listach) może to być krótsza alternatywa.
Kompresja liczb całkowitych a kompresja liczb całkowitych:
Z tymi dwoma może iść w obie strony. Czasami skompresowana lista jest krótsza, czasami skompresowana liczba całkowita, czasem zupełnie inna alternatywa jest krótsza. Dlatego zawsze używaj własnego osądu i umiejętności gry w golfa, aby dalej grać w golfa, zamiast całkowicie polegać na powyższych generatorach. Oto kilka przykładów:
[44, 59]
( użyte w odpowiedzi na @Emigna ):
•A–•60в
ma 7 bajtów (generowany przez skompresowany generator list liczb całkowitych)•H|•2ô
lub na •H|•2ä
stałe 44 59‚
są wszystkie 6 bajtówŽH|2ô
lub ŽH|2ä
oba mają 5 bajtów„,;Ç
najlepszym rozwiązaniem byłyby 4 bajty (punkty kodowe znaków „,” i „;”)[2,4,6,0]
( użyte w odpowiedzi na @Emigna ):
•3ā•7в
ma 6 bajtów (generowanych przez skompresowany generator list liczb całkowitych)Ž3ā7в
ma 5 bajtówŽ9¦S
najlepszą opcją byłyby 4 bajty (skompresowana liczba całkowita 2460 do listy cyfr)10101001100101001
( użyte w mojej odpowiedzi ):
•a½₄Ƶ6®í•
ma 9 bajtów (generowany przez skompresowany generator dużej liczby całkowitej)•1∊}•2вJ
ma 8 bajtów (generowany przez skompresowany generator list liczb całkowitych z dodanym złączeniem)•1∊}•b
najlepsza byłaby opcja z 6 bajtami (skompresowana lista liczb całkowitych, zamiast binarnego zamiast 2в
, który domyślnie dołącza)[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]
( użyte w mojej odpowiedzi ):
•4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в
ma 57 bajtów (generowanych przez skompresowany generator list liczb całkowitych)•6j|eDEJÞó(ÍêΓλùÄÞKüzHÇ-ø
JδŠ₂ + Öηôî®À8 † 6 / ðÎ6ùøΓ ° ÓĆ; ˆ © Ā • 2ô` to również 57 bajtów (liczba całkowita skompresowana, podzielona na części wielkości 2)•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ
,λ₂ϦP(Ì•65в₂+
jest jednak o 2 bajty krótszy, poprzez kompresję listy z każdą wartością o 26 niższą, a następnie dodanie tej wartości za pomocą `₂ + ` . Tej sztuczki polegającej na dodawaniu później wartości jednobajtowej można dość często używać do zapisywania bajtów na skompresowanych listach.W czasach, gdy 05AB1E zostało wydane, niejawne dane wejściowe były całkiem nowe i fantazyjne. W dzisiejszych czasach wydaje się to konieczne do śledzenia innych konkurencyjnych języków (takich jak Jelly, MATL, Pyth itp.).
Na przykład, jeśli chcesz dodać dwie liczby, możesz II+
:
I # Input_1.
I # Input_2.
+ # Add them up.
Jednak stosując dane niejawne , możemy skrócić do zaledwie 1 bajtu, a mianowicie +
:
+ # Take two numbers implicitly and add them up.
Dzieje się tak tylko wtedy, gdy długość stosu jest mniejsza niż ilość operatora. Ostatni przykład to 3+
. Arity +
operatora wynosi 2, podczas gdy na stosie jest tylko 1 element:
3 # Push the number 3 on top of the stack.
+ # Request implicit input and add to the 3.
£
to polecenie pobierania pierwszych b
znaków ciągu a
.
dawny: "hello_world"5£
->
"hello"
Ale jeśli b
jest listą indeksów, zamiast tego dzieli ciąg na części (upto) tych rozmiarów.
dawny: "hello_world"5L£
->
['h', 'el', 'lo_', 'worl', 'd']
Są trochę ukryte w 05AB1E. Oto lista wszystkich predefiniowanych zmiennych:
¾
, wypycha, 0
jeśli zmienna licznika nie zostanie zmieniona przed tym poleceniem.X
, wypycha, 1
jeśli zmienna X nie zostanie zmieniona przed tym poleceniem za pomocą U
.Y
, wypycha, 2
jeśli zmienna Y nie zostanie zmieniona przed tym poleceniem za pomocą V
.®
, wypycha, -1
jeśli rejestr nie zostanie zmieniony przed tym poleceniem za pomocą ©
.¯
, wypycha []
(pusta tablica), jeśli nic nie zostanie dodane do tablicy globalnej przed tym poleceniem.¸
, wypycha [""]
pusty stos, jeśli nie ma danych wejściowych. (Dziękuję @Emigna za znalezienie tego.)¾
wypycha 0 => to mniej niż mnemoniczne, jak się robi
¾
wypycha zmienną licznika, która jest inicjalizowana jako 0. Jeśli chcesz tylko push 0, 0 jest oczywiście bardziej naturalne, ale jeśli chcesz push 5,0,7
, 5¾7
jest o 2 bajty krótszy niż 5 0 7
.
¾
oznaczało .75
, a ja raz pokonać Pyth z tego faktu . Te nowe języki gry w golfa nie mają pojęcia o mnemonice ...
print(3 / 4)
w Python 2 daje mi 0
.
M
popycha -Inf
.
Λ
lub .Λ
)Ponieważ nie było to częścią dokumentacji, a @Adnan jest obecnie zbyt zajęty, aby go napisać, poprosiłem o pozwolenie na dodanie go tutaj jako wskazówki.
Funkcja Canvas ( Λ
lub .Λ
) może być używana do rysowania linii ASCII na ekranie. Ma trzy wymagane parametry:
[0,7]
kierunków, dla których możemy użyć jednego lub wielu. Istnieją również specjalne opcje, które wymagają określonej postaci (więcej o tym później).Cyfry kierunkowe [0,7]
odwzorowują następujące kierunki:
7 0 1
↖ ↑ ↗
6 ← X → 2
↙ ↓ ↘
5 4 3
Niektóre przykłady 05AB1E odpowiadają, gdzie używane jest płótno:
Zróbmy coś podobnego do ostatniego, więc załóżmy, że używamy Λ
funkcji Canvas z następującymi trzema parametrami:
[3,3,5,5,7,7,9,9]
!@#
[0,2,4,6]
To da następujące wyniki:
!@#!@#!
# @
@ #!@ #
! @ # !
# ! ! @
@ @ #
!#@!# !
@
@!#@!#@!#
Jak to działa? Oto kroki z powyższymi danymi wejściowymi:
3
znaki ( !@#
) w górę (kierunek 0
)3-1
znaki ( !@
) w prawo (kierunek 2
)5-1
znaki ( #!@#
) w dół (kierunek 4
)5-1
znaki ( !@#!
) w lewo (kierunek 6
)7-1
znaki ( @#!@#!
) w górę (kierunek 0
)7-1
znaki ( @#!@#!
) w prawo (kierunek 2
)9-1
znaki ( @#!@#!@#
) w dół (kierunek 4
)9-1
znaki ( !@#!@#!@
) w lewo (kierunek 6
)-1
Są tam dlatego, że linie się pokrywają. Pierwsze dwa kroki to:
#
@
!
I
!@
Które połączone to:
#!@
@
!
Kilka drobnych uwag:
[0,7]
dostępnych jest kilka konkretnych opcji, które w zasadzie przekładają się na określoną sekwencję kierunkową.
+
( '+
inline) przekłada się na wzór 04402662
, który tworzy +
krzyż z ramionami o danej długości.Zobacz to w akcji.×
( '×
inline) przekłada się na wzór 15513773
, który tworzy X
krzyż z ramionami o danej długości.Zobacz to w akcji.8
wraca do początku, od którego zaczęliśmy rysować. Zobacz to w akcji i zobacz różnicę bez8
.Λ
Natychmiast wyjście wola i.Λ
wyniki ciąg znaków, który jest popychany do stosu, który wciąż możemy ponownego wykorzystania, modyfikowania i zrobić coś z tym, że chcemy. Kilka przykładów:
+×8
rzeczywiście szukałem w kodzie źródłowym.
Podobnie jak w innych językach opartych na stosie, funkcje 05AB1E zwykle wyskakują (zużywają) swoje dane wejściowe ze stosu i wypychają dane wyjściowe na stos.
Jednak niektóre funkcje pobierają dane wejściowe ze stosu, nie zużywając ich. Przykładem jest head
funkcja, ¬
która tworzy pierwszy element z listy danych wejściowych. Zobacz przykładowy program tutaj: ¬+
. To dodaje pierwszą liczbę listy wejściowej do każdej liczby tej listy.
Aby dowiedzieć się, które funkcje pop i które uzyskać, zobacz odpowiednią kolumnę w pliku informacyjnym funkcji .
Pętle i warunki warunkowe automatycznie otrzymują nawiasy zamykające na końcu programu, więc wystarczy dodać je do kodu, jeśli potrzebujesz czegoś poza pętlą / warunkową.
Na przykład ten (niepolity) program tworzący listę pierwszych n
liczb pierwszych nie potrzebuje nawiasów zamykających.
[¹¾Q#NpiNˆ¼
Ale jeśli chcemy wykonać jakąś operację na wynikowej liście, na przykład biorąc delta, musimy najpierw zamknąć pętlę.
[¹¾Q#NpiNˆ¼]¯¥
Rozszerzę to o małe wskazówki do gry w golfa, których nauczyłem się po drodze. (Rozpoczęłam 05AB1E osobiście.)
D
(duplikat) i Ð
(trzykrotnie) w połączeniu z s
(swap) i Š
(triple-swap a,b,c
to c,a,b
) są zwykle krótsze niż użycie ©
(zapisz w zmiennej_globalnej ) i ®
(wciśnij zmienną_globalną ) wewnątrz pętli. To uratowało bajt w mojej odpowiedzi , a także dwa w mojej odpowiedzi .½
(jeśli 1, to zwiększenie zmiennej licznika o 1) nie jest konieczne na końcu µ
(podczas gdy zmienna_przyczyny ! = a, zrób ...), ponieważ odbywa się to niejawnie ( zapisano bajt w mojej odpowiedzi )..B
niejawnie dzieli się na nowe linie. Przydało mi się to w mojej odpowiedzi gdy szukaliśmy alternatywy dla¡
(dzielenia) przy jednoczesnym zachowaniu pustych elementów (UWAGA: Rozwiązanie w połączonej odpowiedzi nie działa, gdy elementy zawierają końcowe spacje po podzieleniu.) - Mam nadzieję, że wbudowane zostać dodane do podziału, ale zachowaj puste linie w przyszłości.SÖ
(która z cyfr liczby całkowitej wejściowej może równomiernie podzielić liczbę całkowitą wejściową) będzie zawierać samą liczbę cyfr 0
(zamiast błędów dzielenia przez zero). Na przykład 1053
spowoduje[1,1053,0,1]
, że (1053 jest podzielna przez 1 i 3; nie jest podzielna przez 5; i daje błąd dzielenia przez zero dla 0). Było to bardzo przydatne w mojej odpowiedzi, biorąc moc listy, ponieważ tylko 1
w 05AB1E jest prawdą, a wszystko inne to falsey. SÖP
powodując prawdę (1
) oznacza zatem, że liczba całkowita na wejściu jest równomiernie podzielna przez każdą z jej cyfr.û
(palindromize danego ciągu) byłem zaskoczony, że nie ma wbudowanego is_palindrome . Ale później zdałem sobie sprawę, że do osiągnięcia tego potrzebne są tylko 2 bajty ÂQ
(gdzie Â
jest bifurkate, co jest skrótem DR
: Duplikat i kopia odwrotna; i Q
jest sprawdzenie, czy dwie górne wartości na stosie są równe).Ds*
(duplikuj, zamień, mnoż, aby działał jak logiczne-AND) vs }ʒ
(zamknij pierwszy filtr, ponownie filtruj), gdy używasz dwóch filtrów. Na przykład: w tym wyzwaniu musimy wymienić wszystkie liczby o długości czterech cyfr, zawierające co najmniej jedną 0
cyfrę o sumie cyfr równej 9
. Użycie zakresu [1000,10000]
obejmuje liczbę czterech cyfr, ale pozostały jeszcze dwa filtry. Początkowo użyłem ₄4°ŸʒD0åsSO9Q*
(14 bajtów), ale przy użyciu dwóch filtrów można zapisać bajt: ₄4°Ÿʒ0å}ʒSO9Q
(13 bajtów). (Który później został golfem .)₄4°ŸεW°ö9Q
(10 bajtów) przez @Grimy0
jako wypełniaczem, możesz użyć 0ζ
. Jednym z problemów jest to, że wypełniacz 0
stanie się łańcuchem "0"
, więc jeśli później spróbujesz posortować z mieszanymi łańcuchami i liczbą całkowitą, najprawdopodobniej nie da to pożądanego wyniku. Oto przykład jak to uporządkować spakowane list wewnętrzne: 0ζ€{
. To może być ustalona przez dodanie wyraźnego oddanych do int ( ï
) po zip, a dopiero potem sortowania: 0ζï€{
. Jednak użycie parametru „ ¾
constant” 0
z wypełniaczem zip spowoduje, że podczas zip pozostanie liczbą całkowitą zamiast ciągu. Więc ¾ζ€{
zapisze bajt tutaj. Ta wskazówka została dostarczona przez @ Mr.Xcodera, aby zaoszczędzić bajt w mojej odpowiedzi .€SO
. Krótszy jednak używa 1ö
, który automatycznie wektoryzuje. Ta wskazówka została dostarczona przez @Grimy, aby zapisać bajt tutaj (i 2 bajty tutaj ).2‹
. Jednak użycie !
(silnia) spowoduje również tylko 1 (prawda) dla 0
i 1
, i każda inna wartość spowoduje coś wyższego (a zatem falsey, ponieważ tylko 1
prawda jest w 05AB1E). Ta wskazówka została dostarczona przez @Grimy, aby zapisać bajt tutaj .Zauważ, że niektórzy operatorzy w 05AB1E wektoryzują automatycznie tablice. Na przykład kod5L3+
, który rozkłada się na następujący pseudokod:
[1, 2, 3, 4, 5] + 3
stanie się:
[4, 5, 6, 7, 8]
Jeśli nie wektoryzuje się automatycznie, możesz także użyć €
operatora. Pobiera polecenie jednoznakowe i wykonuje ten (monadyczny) operator na każdym elemencie. Przykładem podziału każdego elementu jest następujący kod ( spróbuj tutaj ):
€S
Podczas gdy normalny S
operator podzieli każdy element w tablicy i spłaszczy go do pojedynczej tablicy ( wypróbuj tutaj ).
ñ
poprzedzonego wartością n
(indeks). tio.run/nexus/05ab1e#@2/iw2XiE2Tio81ldHjj//8A
Kolejność, w jakiej przyjmujesz dane wejściowe, może mieć drastyczny wpływ na Twój kod, a często, jeśli używasz s
zamiany góry stosu na następną najwyższą pozycję na stosie, nie myślisz poprawnie o problemie. Spróbuj zmienić kolejność danych wejściowych i sprawdź, czy możesz pozbyć się potrzeby zamiany, albo zamieniając dane wejściowe z wyprzedzeniem, dodając je do stosu wcześniej lub kopiując gdzieś. Najbardziej oczywiste operacje I&O mogą być najmniej udaną odpowiedzią 05AB1E.
Poniższy kod pomaga zmienić ASCII-art w 05AB1E przy użyciu niestandardowej konwersji podstawowej.
|»©ÐÙSDŠ¢øΣθ}R€н¬®sÅ?iD2£RDŠKsì}J©žLR‡®gö₅B®s"•ÿ•“ÿ“ÅвJ"
Dokonuje się tego poprzez:
0-9A-Za-z
w tej kolejności, a każdy odrębny znak otrzymuje swój własny znak odwzorowujący, dopóki nie zostanie wymieniony.•<compressed_integer>•“<sorted_distinct_characters>“ÅвJ
.“
Pozwala również kompresować String-cudzysłowie "
; Åв
użyje tego ciąg baza-konwersji generowanego całkowitą pomocą ciągu jako zlecenie podstawy; iJ
połączy wszystkie te znaki razem w jeden ciąg, który jest generowany niejawnie.
Akceptuje wzory zawierające do 62 unikalnych znaków włącznie, dobre dla ASCII-art.
Im mniej unikalnych znaków, tym lepsza kompresja.
Przykładowe dane wyjściowe dla Narysuj cyfrowy schemat synchronizacji XNOR (214 bajtów, 9 unikalnych znaków):
┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐
A ──┘ └─┘ └─┘ └─┘ └─┘ └─┘ └──
┌───┐ ┌───┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐
B ┘ └─┘ └─┘ └─┘ └───┘ └─┘ └
┌─────┐ ┌─┐ ┌─┐ ┌───┐
X ──┘ └───┘ └───┘ └───┘ └────
Byłoby:
•I£.µ*:]ó±øqaµb₄ΘYQmœ¹µû₄p´ζÂĆ_5ŠKÑ×ðòË|₄#¹¶úôÂ-Í|¯ε¼É₂ïδ&é–9»ÞFò1î×HÃBjý2ĆÉ≠FYÂÂèC j‘£Å₅Œ•“─ └┘┐┌
XBA“ÅвJ
(106/214) * 100 = 49,53% wielkości oryginalnego ciągu ASCII-art.
Co odpowiada tej samej liczbie bajtów, co faktyczne przesłanie mi tego wyzwania w 05AB1E (starsza wersja).
UWAGA: Kod absolutnie nie jest golfowy. Szybko napisano, aby przekonwertować grafikę ASCII na najbardziej efektywną kompresję, więc jest dość brzydka i długa ...
|» # 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
zamiast twojego <compr_int><int>BžLR<str>‡
; i używając “
zamiast "
jako cudzysłowu, więc "
może być częścią danych wejściowych.
Nie jest to coś, z czym wszyscy się zgadzają, ale działa.
Rozważ następujące dwa programy:
4 5+
"4""5"+
Oba dają wynik 9 . Jest tak, ponieważ każda wartość jest najpierw oceniana (za pomocą ast.literal_eval
). Z tego powodu możemy wykonywać wszystkie operatory operacji na łańcuchach znaków int i wszystkie operatory operacji na łańcuchach znaków.
Na przykład 12345û
palindromizuje liczbę 12345
, w wyniku czego 123454321
. Następnie możemy wykonywać regularne obliczenia matematyczne na tym numerze.
12345û50000-
Wynikałoby to z: 123404321 .
05AB1E ma następujące normalne pętle i iteratory:
F
, który iteruje przez 0 .. n-1 .G
, który iteruje przez 1 .. n-1 .ƒ
, który iteruje przez 0 .. n .v
, który iteruje każdy element s [0], s [1], .., s [n] .ʒ
, który nie jest dokładnie pętlą, ale poleceniem filtrowania według . Nadużywamy tego polecenia ze względu na jego niezamierzone zachowanie w pętli przez każdy element.Korzystając z tych pętli, możemy uzyskać następujące ukryte pętle :
gF
możesz użyć, v
który ma również N
-index, którego można użyć.vy -> ʒ
Wymiana jest nieco bardziej skomplikowany:
y
nie jest możliwe w tego rodzaju pętlach.[
, µ
a ε
także częścią normalnych pętli / iteracji?
y
jest możliwe w przypadku niektórych z nich.