Wskazówki do gry w golfa w 05AB1E


28

Czy masz jakieś wskazówki dotyczące w w 05AB1E , języku golfowym stworzonym przez Adnana ?

Twoje porady powinny być przynajmniej nieco specyficzne dla 05AB1E.

Proszę zamieścić jedną wskazówkę na odpowiedź.


2
Z recenzji: Porady na pytania są na temat.
mbomb007

Odpowiedzi:


20

Ponieważ nie była częścią Wiki na stronach GitHub 05AB1E (myślę, że powinna), po prostu dodam ją teraz, aby lepiej ją zrozumieć.

Jak korzystać ze słownika?

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 sdo 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#] '“,

Wypróbuj online.

Ten program będzie:

  1. Weź dane jako małe litery, usuwa wszelkie znaki niealfabetyczne (z wyjątkiem spacji), a następnie dzieli słowa na spacje ( lAð«Ã#) lub zawija je na liście, jeśli wprowadzono tylko jedno słowo ( ¸˜)
  2. Pętle nad każdym słowem ( vyU)
  3. Następnie ma wewnętrzną pętlę nad każdym skompresowanym słowem ze słownika ( "€...ï"Dâvy), które spróbuje uruchomić jako program 05AB1E ( "“ÿ“".V)
  4. A jeśli jest równe bieżącemu słowu, wydrukuje je i przerwie wewnętrzną pętlę XlQiy?1#

Z wejściem good bye worldwynik 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).

Jak kompresować ciągi znaków, które nie są częścią słownika?

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 ".•ÿ•"

Wypróbuj online. .

Powyższy program obejmuje:

  • vAyk})>: Weź indeksy alfabetu z 1 indeksem dla poszczególnych liter wejścia, a spacje będą miały indeks 0
  • 27β: 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ągiem

Oto przykład odpowiedź gdzie @Kaldo wykorzystuje .•zíΘ•do kompresji słowo „gęś”.

Jak kompresować duże liczby całkowite?

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 18238098189071058293z 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 13562spowodowałaby •rl•, ale ponieważ używa tylko dwóch znaków, może być Žrlzamiast 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₁Ò'Θpci rltworzone? 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 "Žÿ" ë "•ÿ•"

Wypróbuj online.

Oto przykładowa odpowiedź, w której @Emigna używa •3Èñ•liczby całkowitej 246060.

Jak kompresować listy liczb całkowitych?

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"•ÿ•ÿв"

Wypróbuj online.

Powyższy program obejmuje:

  • Z>: Uzyskaj maksymalną liczbę + 1 z listy wejść ( ©: i zapisz ją w rejestrze)
  • β: Konwertuj listę wprowadzania z bazy max+1na pojedynczy numer
  • 255B: 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 ):

[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
  • Ale w tym przypadku Ž9¦Snajlepszą 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)
  • Ale w tym przypadku •1∊}•bnajlepsza byłaby opcja z 6 bajtami (skompresowana lista liczb całkowitych, zamiast binarnego zamiast , 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 ):


12

Domniemane dane wejściowe

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.

Sprawdź to tutaj


Jednak stosując dane niejawne , możemy skrócić do zaledwie 1 bajtu, a mianowicie +:

+    # Take two numbers implicitly and add them up.

Sprawdź to tutaj


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.

Sprawdź to tutaj


8

Podciągi

£to polecenie pobierania pierwszych bznaków ciągu a.
dawny: "hello_world"5£ -> "hello"

Ale jeśli bjest listą indeksów, zamiast tego dzieli ciąg na części (upto) tych rozmiarów.
dawny: "hello_world"5L£ -> ['h', 'el', 'lo_', 'worl', 'd']


8

Predefiniowane zmienne

Są trochę ukryte w 05AB1E. Oto lista wszystkich predefiniowanych zmiennych:

  • ¾, wypycha, 0jeśli zmienna licznika nie zostanie zmieniona przed tym poleceniem.
  • X, wypycha, 1jeśli zmienna X nie zostanie zmieniona przed tym poleceniem za pomocą U.
  • Y, wypycha, 2jeśli zmienna Y nie zostanie zmieniona przed tym poleceniem za pomocą V.
  • ®, wypycha, -1jeś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.)

24
¾wypycha 0 => to mniej niż mnemoniczne, jak się robi
Fatalize

6
@Fatalize: 0 również popycha 0. ¾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¾7jest o 2 bajty krótszy niż 5 0 7.
Emigna

7
Powrót w moich czasach ¾oznaczało .75, a ja raz pokonać Pyth z tego faktu . Te nowe języki gry w golfa nie mają pojęcia o mnemonice ...
ETHproductions

31
Nie mam pojęcia, o czym wszyscy mówicie: str. print(3 / 4)w Python 2 daje mi 0.
Adnan

2
Jeśli na początku Mpopycha -Inf.
mbomb007

7

Korzystanie z kanwy ( Λ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:

  • a Długość: Rozmiar linii. Może to być pojedyncza liczba całkowita lub lista liczb całkowitych
  • b Ciąg: Znaki, które chcemy wyświetlić. Może to być pojedynczy znak, ciąg, lista znaków lub lista ciągów (w ostatnich trzech przypadkach użyje ich wszystkich jeden po drugim, łącznie z zawijaniem)
  • c Kierunek: Kierunek, w którym powinny być rysowane linie znakowe. Na ogół mamy cyfry[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:

  • a :[3,3,5,5,7,7,9,9]
  • b :!@#
  • c :[0,2,4,6]

To da następujące wyniki:

  !@#!@#!
  #     @
  @ #!@ #
  ! @ # !
  # ! ! @
  @   @ #
  !#@!# !
        @
@!#@!#@!#

Wypróbuj online.

Jak to działa? Oto kroki z powyższymi danymi wejściowymi:

  1. Rysuj 3znaki ( !@#) w górę (kierunek 0)
  2. Rysuj 3-1znaki ( !@) w prawo (kierunek 2)
  3. Rysuj 5-1znaki ( #!@#) w dół (kierunek 4)
  4. Rysuj 5-1znaki ( !@#!) w lewo (kierunek 6)
  5. Rysuj 7-1znaki ( @#!@#!) w górę (kierunek 0)
  6. Rysuj 7-1znaki ( @#!@#!) w prawo (kierunek 2)
  7. Rysuj 9-1znaki ( @#!@#!@#) w dół (kierunek 4)
  8. Rysuj 9-1znaki ( !@#!@#!@) w lewo (kierunek 6)

-1Są tam dlatego, że linie się pokrywają. Pierwsze dwa kroki to:

#
@
!

I

 !@

Które połączone to:

#!@
@
!

Kilka drobnych uwag:

  • Oprócz opcji [0,7] dostępnych jest kilka konkretnych opcji, które w zasadzie przekładają się na określoną sekwencję kierunkową.
  • Wbudowane płótno domyślnie doda końcowe spacje, aby wydruk był prostokątem.
  • Λ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:

1
Nawet nie wiedziałem, że 05AB1E ma płótno!
MilkyWay90

Jak ... jak to wymyśliłeś? Kod źródłowy?
Magic Octopus Urn

1
@MagicOctopusUrn Większość z tej odpowiedzi @Adnan (PS: jego najnowsza odpowiedź również jest dość dobrze wyjaśniona ). Dla +×8rzeczywiście szukałem w kodzie źródłowym.
Kevin Cruijssen

5

Pop lub weź

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 headfunkcja, ¬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 .


@NeilA. Dzięki! Link zaktualizowany
Luis Mendo

3

Warunkowe i pętle

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 nliczb 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ˆ¼]¯¥


3

Mały wskazówki do gry w golfa 05AB1E

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,cto 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 ).
  • .Bniejawnie 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.
  • (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 1053spowoduje[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 1w 05AB1E jest prawdą, a wszystko inne to falsey. SÖPpowodując prawdę (1 ) oznacza zatem, że liczba całkowita na wejściu jest równomiernie podzielna przez każdą z jej cyfr.
  • Po obejrzeniu û(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 Qjest sprawdzenie, czy dwie górne wartości na stosie są równe).
  • Gdy chcesz filtrować listę według wielu rzeczy, zwykle taniej jest mieć wiele luźnych filtrów, a nie wszystkie połączone w jednym. Ponieważ gdy masz dwa filtry, będziesz potrzebować czegoś w stylu 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ą 0cyfrę 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 @Grimy
  • Jeśli chcesz skompresować z liczbą całkowitą 0jako wypełniaczem, możesz użyć . Jednym z problemów jest to, że wypełniacz 0stanie 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” 0z 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 .
  • Jeśli chcesz zsumować cyfry wielu numerów na liście, możesz użyć €SO. Krótszy jednak używa , który automatycznie wektoryzuje. Ta wskazówka została dostarczona przez @Grimy, aby zapisać bajt tutaj (i 2 bajty tutaj ).
  • Jeśli masz do czynienia tylko z nieujemnymi liczbami całkowitymi i chcesz sprawdzić w filtrze, czy jest to 0 czy 1, możesz oczywiście użyć oczywistości 2‹. Jednak użycie !(silnia) spowoduje również tylko 1 (prawda) dla 0i 1, i każda inna wartość spowoduje coś wyższego (a zatem falsey, ponieważ tylko 1prawda jest w 05AB1E). Ta wskazówka została dostarczona przez @Grimy, aby zapisać bajt tutaj .

2

Automatyczna wektoryzacja

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 Soperator podzieli każdy element w tablicy i spłaszczy go do pojedynczej tablicy ( wypróbuj tutaj ).


Jak przypisujesz n-ty element w tablicy?
Andrew Savinykh

@AndrewSavinykh W tej chwili nie ma wbudowanego do tego celu, ale jest to coś, co chcę wdrożyć.
Adnan

@Adnan Znalazłem sposób, aby to zrobić. Utwórz kolejną listę, która ma wartość do przypisania również w n-tym indeksie. Następnie scal listy przy użyciu ñpoprzedzonego wartością n(indeks). tio.run/nexus/05ab1e#@2/iw2XiE2Tio81ldHjj//8A
mbomb007

@ mbomb007 Jest to możliwe, jedynym problemem jest to, że nie można później zmodyfikować tablicy, ponieważ polecenie scalania przyjmuje tylko łańcuchy jako argumenty (i konwertuje listę na łańcuch).
Adnan

2

Kolejność wejść

Kolejność, w jakiej przyjmujesz dane wejściowe, może mieć drastyczny wpływ na Twój kod, a często, jeśli używasz szamiany 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.


2

05AB1E ASCII-Art Golfing

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"

Wypróbuj online.

Dokonuje się tego poprzez:

  1. Wymienianie unikalnych znaków na rysunku ASCII.
  2. Uporządkuj je według liczby ich występowania w ciągu w kolejności malejącej (od najczęściej występujących do najmniej występujących znaków).
  3. Odwróć pierwsze dwa elementy, jeśli rysunek ASCII zaczyna się od najczęściej występującego znaku (aby zapobiec początkowym zerom w skompresowanej liczbie całkowitej).
  4. Odwzoruj znaki wejściowe na 0-9A-Za-zw tej kolejności, a każdy odrębny znak otrzymuje swój własny znak odwzorowujący, dopóki nie zostanie wymieniony.
  5. Baza skompresuj go, używając najwyższej bazy, którą potrzebowałeś zastąpić (na podstawie liczby unikalnych znaków).
  6. Baza przekształca go ponownie w bazę-255 (dla kompresji 05AB1E).
  7. Format wszystko w formacie: •<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:

05AB1E , 106 bajtów

•I£.µ*:]ó±øqaµb₄ΘYQmœ¹µû₄p´ζÂĆ_5ŠKÑ×ðòË|₄#¹¶úôÂ-Í|¯ε¼É₂ïδ&é–9»ÞFò1î×HÃBjý2ĆÉ≠FYÂÂèC j‘£Å₅Œ•“─ └┘┐┌
XBA“ÅвJ

Wypróbuj online.

(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).


Objaśnienie kodu:

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)

1
Nawiasem mówiąc, ponieważ 05AB1E zmieniło stronę kodową, maksymalna podstawa została zmieniona z 214 na 255 .
Adnan

1
Być może coś, co należy dodać do swojej odpowiedzi (lub zmodyfikować generator), ale jeśli w sztuce ASCII używanych jest mniej niż 10 różnych znaków, możesz zagrać w golfa o dwa bajty. Czyli generator daje to 22-byter , ale może być to 20-byter zamiast .
Kevin Cruijssen

@KevinCruijssen pomysł był tym, co próbowałem przekazać, nie twierdząc, że generator jest czymś dobrym: P. Szczerze wątpię, żeby nawet działało na osabie. Napisałem to dawno temu!
Magic Octopus Urn

@MagicOctopusUrn Nie jestem pewien, czy działa w trybie przepisywania Elixir, ale z pewnością nadal działa w starszej wersji. Już przed rokiem edytowałem Base-214 do Base-255 mniej więcej o połowę, jak wspomniano powyżej w komentarzu Adnana . Poza tym działa świetnie i korzystałem z niego kilka razy (chociaż grałem w golfa za każdym razem;)). Generowanie zarówno ciągu, jak i liczby działa świetnie!
Kevin Cruijssen

Oto ulepszona wersja. (Bardzo brzydkie i szybko napisane, ale działa). Byłby to twój przykład 108 bajtów zamiast 113. Poprawki, które wprowadziłem, to: najpierw sortuj różne znaki przy najwyższym wystąpieniu (chyba że najwyższe wystąpienie jest pierwszym znakiem, w którym to przypadku zamieni dwa górne znaki), więc skompresowane liczba całkowita jest tak mała, jak to możliwe; używanie <str><compr_int><int>вèJzamiast 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.
Kevin Cruijssen,

1

Ciągi i ints są równymi typami

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 .


0

Ukryte pętle i iteratory

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 :

  • Zamiast gF możesz użyć, vktóry ma również N-index, którego można użyć.
  • vy -> ʒWymiana jest nieco bardziej skomplikowany:
    • Musisz natychmiast wydrukować wyniki. Powoduje to zakłócenie automatycznego drukowania od wydrukowania górnej części stosu.
    • Fragment kodu jest uruchamiany na nowym stosie tymczasowym . Oznacza to, że nie można używać fragmentów zależnych od stosu.
    • Wywołanie ynie jest możliwe w tego rodzaju pętlach.

Wiem, że zostało to opublikowane rok temu, ale nie są [, µa εtakże częścią normalnych pętli / iteracji?
Kevin Cruijssen

Również wywoływanie yjest możliwe w przypadku niektórych z nich.
Magiczna Urna Ośmiornicy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.