Pyth to proceduralny język programowania zainspirowany Pythonem, stworzony przez użytkownika PPCG isaacg .
Jakie masz ogólne wskazówki na temat gry w golfa w Pyth? Szukam pomysłów, które można by zastosować do ogólnych problemów z golfem, które są przynajmniej nieco specyficzne dla Pytha.
Poproszę jedną wskazówkę na odpowiedź.
Poznaj swoje zmienne
Pyth ma 3 kategorie zmiennych: zmienne ogólne wstępnie zainicjowane, zmienne wstępnie zainicjowane na podstawie danych wprowadzonych przez użytkownika oraz zmienne, które domyślnie generują przypisanie przy pierwszym użyciu.
Zmienne ogólne:
Zmienne inicjowane przez dane wejściowe:
Zauważ, że te inicjalizacje będą uruchamiane w danym programie tylko wtedy, gdy powiązana zmienna zostanie użyta poza ciągiem w kodzie. Ponadto kolejność jest
Q
wtedyz
, gdy oba są używane.Przypisanie zmiennych pierwszego użycia:
J
aK
. Jeśli chcesz zainicjować je obie na tę samą wartość, możesz to zrobić za pomocą wyrażenia takiego jakKJ0
, które jest równoważne dłuższemuJ0K0
.źródło
Skorzystaj z jeszcze nowszego tłumacza internetowego, aby sprawdzić swoje odpowiedzi.
Pamiętaj, że jest to nowe oprogramowanie, więc może być wadliwe. Proszę zgłaszać mi wszelkie problemy.
źródło
Ciągi na końcu wiersza nie wymagają cudzysłowów końcowych. Na przykład:
jest całkowicie poprawnym programem Hello World.
źródło
Użyj
C
do kompresji bazyJest to w rzeczywistości nieudokumentowane, C na łańcuchu tak naprawdę nie jest bezpośrednim chr -> int, ale zamiast tego base 256 -> base 10 (to samo na łańcuchach znaków). Jest to bardzo pomocne w kompresji int, możemy użyć tego skryptu do kompresji:
Weźmy
12345678910
, to powodujeßÜ>
(niektóre tam niedrukowalne).Również z tablicą liczb całkowitych można łączyć je i dużymi łańcuchami, konwertując do punktów kodowych i traktując jako podstawową liczbę 128.
Innym zastosowaniem
C
, dzięki @xnor za pokazanie mi tego, jest tworzenie dowolnej liczby. Naiwny sposób to:Ale możemy zrobić jeden bajt lepiej z:
ta baza 256 dekonwertuje cały alfabet. Wyniki
156490583352162063278528710879425690470022892627113539022649722
= ~1.56e62
.źródło
Istnieje teraz samouczek online dla Pyth.
Pełna dokumentacja zostanie dodana później.
źródło
Użyj krótkich funkcji funkcjonalnych ... err ...
Gdy argument lambda do
map
lubreduce
po prostu zastosuje jedną operację do argumentów, możesz użyć krótkich formularzyM
iF
.fMx
jest równoważnemfdx
ifFx
jest tym samym, co.UfbZx
. Załóżmy na przykład, że bierzemy listę liczb jako dane wejściowe i wyjściowe, z których każda jest zwiększana. Pierwszym podejściem może być:Można to jednak przepisać jako:
Podobnie jest
reduce
zF
. Na przykład powiedzmy, że istnieje wyzwanie obliczenia iloczynu listy liczb całkowitych. Ponownie, pierwszą próbą może być:Jednakże, z
F
, które mogą być skrócone do:Goli trzy bajty ... nieźle!
źródło
Q
, ponieważ jest on uzupełniany, gdy funkcja nie zawiera danych wejściowych, co czyni ją*F
Aktualizuj swoją implementację języka Pyth.
Dość regularnie poprawiam Pyth, usuwając mniej przydatne funkcje i dodając bardziej przydatne, więc miej oko na nowości i regularnie aktualizuj swoją kopię implementacji.
Niektóre ostatnio dodane funkcje: (stan na 19.10.14)
y
: Działa jak*2
na liczbach i jako lista wszystkich podzbiorów na ciągach i listach. Na przykład:f
:f
zwykle jest poleceniem filter. Teraz, gdy zostanie wywołany z liczbą jako drugim argumentem, przefiltruje nieskończoną sekwencję, zaczynając od tej liczby i zliczając je, a następnie zwróci pierwszy element wynikowej sekwencji.Na przykład, oto kod, aby znaleźć najmniejszą liczbę pierwszą ponad miliard:
źródło
yz
?mvdczd
nie może być najkrótszą drogą ...y
ponieważ nie sądzę, że Pyth musi mieć wiele bardzo łatwych do przeanalizowania formatów wejściowych, tylko jeden, np. Format Python. Tak, tak, myślęmvdczd
, że niestety trzeba będzie to zrobić.r
pakietu przetwarzania ciągów.r
wygląda całkiem użytecznie.@
rootowania w Fdr1 + 1 @ Q2Iq% Qd0d, aby zrobić kalkulator czynnikowy. Kiedy próbuję go użyć, domyślnie maindex
znaczenie. Czy jest jakiś sposób obejścia tego zachowania?Nazwane argumenty w funkcjach (nie są już obsługiwane)
Czasami wartości domyślne w funkcjach mogą być przydatne do gry w golfa. Pyth faktycznie to obsługuje (ku mojemu zaskoczeniu). Na przykład:
Wydrukuje:
Możesz także użyć J i K, aby zapisać postacie, wykonując następujące czynności:
drukuje:
Jest to zwykle przydatne w przypadku algorytmów rekurencyjnych.
To już nie działa, ale zostawiłem to tutaj na wypadek, gdyby ktoś chciał grać w golfa przy użyciu starej wersji Pytha.
źródło
Rozpakowanie krotek 2-elementowych za pomocą
F
Powiedzmy, że masz krotkę 2-elementową
J = (a, b)
i chceszr(a,b)
, dla jakichś 2 funkcji arity r.Naiwnym sposobem na to jest
rhJeJ
.Fantazyjnym sposobem na to jest
r.*J
użycie operatora rozpakowywania.Naprawdę wymyślnym sposobem na to jest
rFJ
użycie operatora składania.źródło
.u
?.u
wydaje się teraz kumulować się teraz.Użyj krótkich funkcji arytmetycznych
h
: Oprócz zwracania pierwszego elementu listy, zwiększa liczbę, np.hT
Ocenia na11
. Krótszy niż+1T
.t
: Zmniejsza liczbę (inną niż zwrócenie ogona listy), np.tT
Ocenia na9
. Krótszy niż-T1
.y
: Podwaja liczbę, np.yT
Ocenia na20
, krótszy niż*T2
lub+TT
.źródło
Służy
map
do generowania listJest to w zasadzie odpowiednik fantazyjnej listy python. Użyj istniejącej listy lub zakresu, aby iterować i mapować każdą wartość, nawet jeśli wartość nie ma znaczenia.
Dwa przykłady:
Wygeneruj listę 8 zer.
mZ8
zamiast*8]Z
Wygeneruj listę 5 liczb losowych od 0 do 9:
mOT5
zamiastV5~Y]OT)
Drugi automatycznie przypisuje listę do
Y
(no cóż, faktycznie dołącza do Y), ale nawet=YmOTU5
jest krótszy.źródło
Implikowane Q w EOF
To nowa zmiana na dzień dzisiejszy.
Q
jest zmienną, która jest inicjalizowana automatycznie dla analizowanego wejścia. Jest on domyślnie dołączany na końcu programu Pyth, tyle razy, ile jest to konieczne, aby arity działało. Aby zobaczyć przykład wykorzystania tego do gry w golfa, powiedzmy, że chcemy obliczyć funkcję Collatz wejścia.Najkrótszy sposób na napisanie tego jest następujący:
Ponieważ jednak
Q
s są niejawne na końcu pliku, możemy po prostu napisać:Zapisywanie 2 bajtów.
Zauważ, że funkcje z niepotrzebnymi argumentami nie będą wypełnione tymi argumentami. Na przykład
c"12 12"
nie będą miały niejawnego charakteruQ
, ponieważc
wymaga tylko 1 argumentu.źródło
Użyj zmniejszania, aby wielokrotnie stosować funkcję.
Załóżmy, że musisz ustawić zmienną na jakąś funkcję samą w sobie i powtórzyć określoną liczbę razy. Weźmy na przykład problem ze znalezieniem liczby 100 później w sekwencji Collatza na podstawie danych wejściowych. Najkrótszym sposobem znalezienia następnego numeru w sekwencji, jeśli jest numerem początkowym
Q
, jestNajbardziej oczywistym sposobem na zastosowanie tego 100 razy i wydrukowanie wyniku byłby
Zapętl 100 razy, za każdym razem aktualizując wartość Q, a następnie zakończ pętlę i wypisz Q.
Zamiast tego możemy użyć funkcji redukcji, która ignoruje zmienną sekwencji (
H
).To jest 2 znaki krótsze. Jest o 3 znaki krótszy, jeśli próbujesz zapętlić tyle razy, ile jest elementów w sekwencji.
źródło
Zwykle istnieją krótsze alternatywy dla Any
Gdy chcesz sprawdzić, czy jakakolwiek sekwencja spełnia warunek, zwykle byś użył
.Em
. Na przykład, jeśli chcesz dowiedzieć się, czy któryś z listy jest większy lub równy 5:Ale jeśli to musi być tylko prawda / falsey, a nie prawda / fałsz,
sm
działałoby, ponieważ suma działa na boolach.Możemy zrobić nawet jeden krótszy, z
f
ilter:Ten ostatni wygląda jednak naprawdę brzydko.
Dla mnie
.A
jedyne, co mogę wymyślić, to zastosować przeciwny warunek i zanegować go dla jednego znaku oprócz.Am
:źródło
Spójrz na wszystkie opcje przepływu sterowania
Pętle:
F
: Dla pętli. Podobnie jak Python.V
: Dla pętli w zakresie. Nie należy podawać ani zmiennej, ani zakresu, więc 2 znaki krótsze.W
: Podczas pętli. Podobnie jak Python.#
: Nieskończona pętla while. Escape z błędem lub wyraźną przerwą.Teraz dostępnatylkotry ... except
w Pyth.Funkcje:
D
: Ogólne określenie. Tak jak Python.L
: 1 argument, brak funkcji przypisania, jak lambda Pythona, ale o nazwie. Nazwa funkcji, nazwa zmiennej i zwrot (R
) nie muszą być podawane, więc 3 znaki krótsze.Programowanie funkcjonalne:
f
: Filtruj - wybierz elementy sekwencji wejściowej, które zwracają wartość true na wejściowej lambda.f
: Pierwsza liczba całkowita większa lub równa wartości wejściowej, która daje prawdziwy wynik filtru.m
: Mapa - transformuj elementy sekwencji wejściowej za pomocą wejściowej lambda.u
: Zmniejsz - złóż sekwencję wejściową na wejściowej lambda, inicjując akumulator do trzeciego argumentu.o
: Order - starsze elementy sekwencji wejściowej, w których kluczem jest wejściowa lambda.Zazwyczaj istnieje wiele możliwości dla danego problemu i tylko pisząc rozwiązania testowe dla każdego z nich, możesz dowiedzieć się, który jest najkrótszy.
źródło
.x
może być później używany do bloków try-oprócz..x{some_statments}{except_block - can this be empty}
.# ... B
może być używany w ten sposób, jeśli nie jesteś w wyrażeniuPrzełączanie dwóch elementów na liście
Przełączanie dwóch elementów może być dość kosztownym zadaniem. Oto dwa podejścia, których chcesz użyć.
Podejście zmienne Tmp
W przygotowaniu definiujemy listę
Y
i wypełniamy ją liczbami. Celem jest zmiana drugiego i trzeciego elementu.Po prostu przypisujemy zmienną tmp
J = Q[G]
, wykonujemy pierwsze przypisanie listy,Y[G] = Y[H]
a następnie drugie ostatnie przypisanieY[H] = J
. Sztuczka polega na zagnieżdżeniu dwóch przypisań do listy, dzięki czemu nie trzeba pomijać drukowania i nie trzeba używać polecenia refer to dwa razyY
.zamiast
Podejście do tłumaczenia
Jeśli elementy, które chcesz przełączyć, są unikalne na liście, użyj tego podejścia. To jest naprawdę krótkie. Tym razem przełączamy pierwszy i trzeci element (wartości
1
i5
są unikalne).Korzysta z funkcji tłumaczenia listy:
Ten tłumaczenia zastępuje każdy element
Y[0]
zY[1]
I każdyY[1]
zY[0]
. Jeśli więc wartości nie są unikalne, zdarzają się złe rzeczy. Na przykładK,1 2
wyniki w[1, 5, 3, 5, 6, 7]
.Zauważ, że nawiasy zamykające są opcjonalne, jeśli instrukcja jest ostatnią w kodzie.
źródło
Debugowanie za pomocą
<newline>
Jeśli kod jest napisany w trybie programowania imperatywnego, debugowanie jest dość łatwe, ponieważ można łatwo wydrukować wyniki pośrednie. (bezpośredni link )
Ale duża liczba programów Pyth wykorzystuje elementy programowania funkcjonalnego, takie jak mapowanie, filtrowanie i redukcja, które nie pozwalają na tak prosty wydruk. Ale nadal jest to możliwe przy użyciu
\n
polecenia.Ten sam kod używający
u
(zmniejsz) to: (bezpośredni link )Jeśli chcesz wydrukować wartości pośrednie, po prostu wstaw
\n
: (bezpośredni link )\na
drukujea
na nowej linii i zwracaa
. Możesz więc wstawić go w dowolne miejsce, nie martwiąc się o zmianę funkcjonalności programu.źródło
Znajdowanie maksymalnie dwóch liczb całkowitych
Załóżmy na przykład, że masz
J=5
iK=12
. Następnieg#JK
= 12, a takżeg#KJ
= 12.Zostało to odkryte przez @ Pietu1998, który ujął to w następujący sposób:
Nie jestem pewien, czy ktoś go już znalazł, ale istnieje fajny sposób na zrobienie maksimum (A, B) w 2 bajtach, nie trzeba używać 3 dla
eS,AB
.g#AB
robi to samo. (Jest to jednak bardzo nieefektywne, ponieważ zapętla maksymalnie (1, A-B + 1) razy. Optymalizacja polega na umieszczeniu liczby, która prawdopodobnie będzie większa jako B.)źródło
join
Metoda Pythajoin
Metoda w Pythonie często może być trochę irytujące, ponieważ tylko dołącza ciągi. Pyth'sjoin
jest bardziej hojny. Domyślnie przekształca wszystkie obiekty w ciągi.Np.
jkUT
Daje0123456789
lubjb["abc"4,5\f]7
dajeźródło
j2\a\b
->"a2b"
Mówienie, jeśli liczba jest liczbą całkowitą
I
Dobrą sztuczką jest użycie nvariant, aby stwierdzić, czy liczba jest liczbą całkowitą jako taką:To sprawdza, czy liczba nie zmienia się po obcięciu, co nie zmieni się, jeśli będzie to liczba całkowita.
Na przykład możesz użyć tego jako idealnego kwadratu:
źródło
Użyj spakowanego Pytha
Spakowany Pyth to nowy „język programowania”, który jest dokładnie taki sam jak Pyth, z tym wyjątkiem, że używa 7 bitów na znak zamiast 8 bitów na znak.
Aby go użyć, sklonuj repozytorium pyth . Plik
packed-pyth.py
jest tłumaczem.Powiedz, że masz kod
"Hello, world!
.Najpierw umieść go w pliku:
echo -n '"Hello, world!' > code.pyth
Następnie spakuj kod Pyth do spakowanego pliku Pyth:
python3 packed-pyth.py -p code.pyth code.ppyth
Na koniec uruchom spakowany kod Pyth:
python3 packed-pyth.py code.ppyth
Podczas uruchamiania kodu możesz podać
-d
flagę, aby zobaczyć, jaki jest faktycznie uruchamiany kod Pyth, a także podać dane jako drugi argument wiersza poleceń po pliku zawierającym kod.Do góry nogami:
Minusem:
Tylko ASCII.
Brak interaktywnego wejścia.
Opcje pełnego debugowania nie są dostępne.
Gorsze raportowanie błędów.
źródło
Testy podzielności za pomocą
I
i GCDZrzeczenie się: Działa to tylko w przypadku liczb całkowitych nieujemnych.
Aby sprawdzić, czy dwie nieujemne liczby całkowite są podzielne, możesz wykonać następujące czynności:
Jeśli a jest podzielne przez b oraz a ≥ b ≥ 0 , to gcd (a, b) = b .
Niekoniecznie oszczędza bajtów
!%<dividend><divisor>
, ale może przynieść oszczędności, ponieważ:Q
) podczas pracy z dywidendą.<pfn>
, ponieważ jest to funkcja sama w sobie.0
.Spróbuj!
źródło
iI
jest funkcją samą w sobie, podczas gdy!%
nie jest, więc możesz użyć jej jako funkcji prefiksu.Przypisywanie zmiennej do funkcji zastosowanej do niej samej
Jeśli masz funkcję arity 1 i chcesz zastosować ją do zmiennej i zastosować do siebie, możesz użyć następującej składni:
Zamiast:
Na przykład, jeśli chcesz zwiększyć zmienną
Z
, możesz:Co oszczędza jeden bajt
=ZhZ
.źródło