Ponieważ ostatnio widzę więcej przesłanych > <> zgłoszeń, pomyślałem, że dobrym pomysłem może być utworzenie strony ze wskazówkami.
Trzymaj się jednej wskazówki na post, chyba że są one ściśle powiązane.
Oficjalny tłumacz języka Python
Tłumacz online (niektóre błędy są obecne, ale dobre w większości przypadków)
o
, a ponieważ\n
znak nowej linii to ASCII 10, możesz to zrobićao
.CR
zamiastLF
i naciskałemd
zamiasta
.Odpowiedzi:
Sprawdzanie względem 0
Używanie
?!
zamiast0=?
zwykle oszczędza bajt.Jednak tylko standard
?
może być czasem lepszy, jeśli stać cię na trochę restrukturyzacjiprzeciw
źródło
Sprawdzanie EOF
Po osiągnięciu EOF> <> wypycha -1 na stos, który można sprawdzić na dwa sposoby:
W celu sprawdzenia EOF są to negacje, więc to, która z nich jest bardziej korzystna, zależy od struktury twojego programu.
źródło
Skacz, aby ominąć rozpoczęcie nowych linii
Rozpoczęcie nowej linii czasami oznacza marnowanie dużej ilości wiodących białych znaków w następnej linii. W takiej sytuacji skakanie może być przydatne.
Na przykład,
można dopasować do jednej linii w taki sposób:
Dla praktycznego przykładu, oto program Hello World w jednym wierszu:
źródło
Użycie modułu w celu uproszczenia wprowadzania
To może być zbyt prosta wskazówka, więc jeśli tak, po prostu ją zastąpię lub usunę.
Powiedzmy, że chcesz wprowadzić dwa znaki „a” i „b” i zwrócić odpowiednio 1 i 2 dla każdego. Prawdopodobnie użyłbyś do tego warunkowych, ponieważ jest to najbardziej sensowne, a ja użyję bardziej skondensowanej formy dla tego konkretnego przykładu.
To sprawdza, czy dane wejściowe są większe niż „a” i dodaje 1. Ponieważ „a” zwróci 0 i „b” 1, da to 1 i 2. To całkiem nieźle się sprawdza, ale w przypadku naszego nakłady, możemy pójść jeszcze dalej.
W modzie 3, 97, który jest liczbowym odpowiednikiem „a”, staje się 1, a 98, który jest „b”, staje się 2. W przypadku dwóch różnych liczb gwarantowany jest mod, który daje unikalne wyniki dla obu. Dla więcej niż dwóch istnieje mod, który daje unikalne wyniki, ale nie mam umiejętności matematycznych, aby znaleźć najmniejszą w prosty sposób (np. Jeśli masz zestaw {100,101,102,103}, mod 104 dałby unikalne wyniki dla każda wartość w nim, ale niezbyt pomocna). Jednak w większości przypadków, gdy dane wejściowe są ograniczone do kilku znaków alfabetycznych, często można znaleźć mod, który działa.
Aby znaleźć najmniejszy moduł, który daje unikalne wyniki dla dwóch liczb, a i b, wykonaj następujące czynności. Weź wartość bezwzględną różnicy aib (
|a - b|
) i znajdź najmniejszą liczbę n, która jej nie dzieli. np. dla 97 i 98,|98 - 97| = 1
i tak 2 byłoby najmniejszym modem (ale dla naszego programu testowego daje to 1 dla 97 i 0 dla 98, więc mod 3 jest lepszy).źródło
Używanie skoków jako warunku
Czasami kończysz pisanie programów w> <>, które wymagają robienia różnych rzeczy po otrzymaniu różnych danych wejściowych. Zwykle używasz warunkowej (
?
) i zmieniaczy kierunku, aby to przeanalizować. W niektórych przypadkach działa to dobrze (szczególnie, gdy jest mniej typów danych do obsłużenia), ale czasem kończy się coś takiego. (Zignoruj fakt, że ten kod można zmniejszyć za pomocą innych sztuczek, to tylko w celach demonstracyjnych)Chociaż jest to w porządku, ma trochę białych znaków (których osobiście nigdy nie lubię widzieć) i ma wiele powtórzeń (
=?v
i.00n
). Zamiast tego możesz użyć skoku i różnych linii jako warunkowych. Oto przykład:To goli 10 bajtów. Oto co się dzieje:
i:
Raz duplikujemy dane wejściowe, abyśmy mogli je dwukrotnie ocenić"a")$"b")+
To może być swego rodzaju wskazówka, ale tutaj sprawdzam, czy dane wejściowe są większe niż znak „a”, a następnie czy są większe niż znak „b” i dodając wynik. Dla „a” da to 0, dla „b” 1, a dla „c” 2.1+0$.
To tam dzieje się magia; bierzemy wynik tego poprzedniego uproszczenia i dodajemy 1 (dając 1 dla „a”, 2 dla „b”, 3 dla „c”), a następnie naciśnij 0 i zamień wartości. Po osiągnięciu skoku nastąpi przejście do wiersza odpowiadającego wartości, którą przypisaliśmy tym postaciom (np. Wiersz 1 dla „a”). NB Linia 0 jest szczytem programu.źródło
Pisanie kodu, który może działać na dwa sposoby
Trampoliny (
!
) są bardzo przydatne, gdy chcesz, aby twój kod był uruchamiany do przodu i do tyłu (lub w górę iw dół). Te scenariusze są nieco mało prawdopodobne, ale w przypadku palindromu lub podobnych wyzwań ta wskazówka może być przydatna.Oto przykład: chcę raz uruchomić kod, a następnie przejść przez stos odrzucając wartości, aż osiągnę 0, a następnie zejść w dół. Wskaźnik wchodzi w tę pętlę z
>
. Możesz to zrobić za pomocą skoku, np?!v80.>ao
(powiedzmy, że najpierw chcę wydrukować nowy wiersz)ale jeśli kod, który chcemy uruchomić raz (kod obok
>
) powoduje, że linia jest dłuższa niż 16 znaków, nie możemy już używać skoku w trzech znakach. Jest to jednak przykład, w którym bieganie do przodu i do tyłu jest banalne ...?!v!?<>ao>
Idąc dalej, wypisujemy nowy wiersz, a następnie wciskamy,
?!v
który odrzuca wartość, jeśli nie jest to 0, a następnie z powodu trampoliny pomijamy następny?
i cofamy się. To samo dzieje się i pętla trwa, dopóki nie osiągniemy 0.Jest to dziwnie konkretny przykład, ale jest kilka (być może nie wiele) aplikacji.
źródło