Zadanie
Biorąc dodatnia n
, wyjście n+1
jeśli n
jest nieparzysta, a wyjście n-1
jeśli n
jest parzysta.
Wkład
Dodatnia liczba całkowita. Możesz założyć, że liczba całkowita mieści się w zakresie możliwości językowych.
Wydajność
Dodatnia liczba całkowita, określona powyżej.
Przypadki testowe
input output
1 2
2 1
3 4
4 3
5 6
6 5
7 8
8 7
313 314
314 313
Punktacja
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Odpowiedzi:
C, 20 bajtów
Wypróbuj online .
źródło
Stack Cats , 3 + 3 (
-n
) = 6 bajtówWypróbuj online!
Potrzebuje
-n
flagi do pracy z numerycznymi danymi wejściowymi i wyjściowymi.Wyjaśnienie
Stack Cats zazwyczaj nie jest konkurencyjny, ponieważ ma ograniczony zestaw poleceń (z których wszystkie są zastrzykami, a większość z nich to inwolucje) oraz ponieważ każdy program musi mieć lustrzaną symetrię. Jednak jednym z tych dążeń jest przełączanie najmniej znaczącego bitu liczby i możemy zrównoważyć tę wartość za pomocą jednoznacznej negacji, która również istnieje. Na szczęście daje nam to symetryczny program, więc nie musimy się martwić o nic innego:
Dane wejściowe i wyjściowe są niejawne na początku i na końcu programu, ponieważ pobieranie danych wejściowych i generowanie danych wyjściowych nie jest operacją odwracalną, więc nie mogą być poleceniami.
źródło
perl -nle 'stuff'
to 2 znaki więcejperl -e 'stuff'
, więc liczy się 2 kolejne znaki ”. Czyli o(space)-n
3 bajty więcej niż bez flagi.-e "code"
a następnie wstawić dodatkowe flagi przede
, np-pe "code"
. Zatem-p
flaga ma tylko jeden bajt. Jednak Stack Cats nie ma takiego-e
argumentu, więc zawsze musisz dodać pełny<sp>-n
do polecenia, a zatem to trzy bajty.Zestaw x86, 9 bajtów (na konkurencyjny wpis)
Wszyscy, którzy podejmują to wyzwanie w językach wysokiego poziomu, tracą prawdziwą frajdę z manipulowania surowymi bitami. Jest tak wiele subtelnych odmian sposobów na zrobienie tego, jest to szalone - i dużo zabawy o tym myśleć. Oto kilka rozwiązań, które opracowałem w 32-bitowym języku asemblera x86.
Z góry przepraszam, że nie jest to typowa odpowiedź na golfa. Będę dużo gadać na temat procesu iteracyjnej optymalizacji (dla rozmiaru). Mam nadzieję, że jest to interesujące i edukacyjne dla większej grupy odbiorców, ale jeśli jesteś typem TL; DR, nie obrażę się, jeśli przejdziesz do końca.
Oczywistym i wydajnym rozwiązaniem jest sprawdzenie, czy wartość jest nieparzysta, czy parzysta (co można zrobić skutecznie, patrząc na najmniej znaczący bit), a następnie odpowiednio wybrać pomiędzy n + 1 lub n-1 . Zakładając, że dane wejściowe są przekazywane jako parametr w
ECX
rejestrze, a wynik jest zwracany wEAX
rejestrze, otrzymujemy następującą funkcję:(13 bajtów)
Ale do celów gry w golfa
LEA
instrukcje te nie są świetne, ponieważ kodowanie zajmuje 3 bajty. ProstaDEC
wersjaECX
byłaby znacznie krótsza (tylko jeden bajt), ale wpływa to na flagi, więc musimy być nieco sprytni w sposobie rozmieszczania kodu. Możemy wykonać ubytek pierwszy i parzyste / nieparzyste Test sekund , ale potem musimy odwrócić wynik testu parzyste / nieparzyste.Możemy również zmienić instrukcję warunkowego przeniesienia na gałąź, co może spowodować, że kod będzie działał wolniej (w zależności od przewidywalności gałęzi - jeśli dane wejściowe zmieniają się niekonsekwentnie między nieparzystymi i parzystymi, gałąź będzie wolniejsza; jeśli istnieje wzór, będzie szybciej), co pozwoli nam zaoszczędzić kolejny bajt.
W rzeczywistości dzięki tej zmianie cała operacja może być wykonana w miejscu, przy użyciu tylko jednego rejestru. Jest to świetne, jeśli wstawiasz gdzieś ten kod (i są szanse, że tak, ponieważ jest tak krótki).
(wstawiany: 7 bajtów; jako funkcja: 10 bajtów)
Ale co, jeśli chcesz, aby była to funkcja? Żadna standardowa konwencja wywoływania nie używa tego samego rejestru do przekazywania parametrów, jak ma to miejsce w przypadku wartości zwracanej, dlatego konieczne byłoby dodanie
MOV
instrukcji rejestru-rejestru na początku lub na końcu funkcji. To nie ma praktycznie żadnego kosztu prędkości, ale dodaje 2 bajty. (RET
Instrukcja dodaje również bajt i istnieje pewien narzut związany z koniecznością wykonania i powrotu z wywołania funkcji, co oznacza, że jest to jeden z przykładów, w którym wstawianie daje korzyści zarówno prędkości, jak i wielkości, a nie tylko klasyczną prędkość - dla kompromisu przestrzeni.) W sumie, napisany jako funkcja, ten kod rośnie do 10 bajtów.Co jeszcze możemy zrobić w 10 bajtach? Jeśli zależy nam w ogóle na wydajności (przynajmniej przewidywalnej wydajności), dobrze byłoby pozbyć się tej gałęzi. Oto bez rozgałęziające, zmieniające się w bitach rozwiązanie, które ma ten sam rozmiar w bajtach. Podstawowa zasada jest prosta: używamy bitowego XOR, aby odwrócić ostatni bit, konwertując wartość nieparzystą na parzystą i odwrotnie. Ale jest jeden problem - dla nieparzystych danych wejściowych, który daje nam n-1 , podczas gdy dla parzystych danych wejściowych daje nam n + 1 - dokładnie przeciwnie do tego, czego chcemy. Aby to naprawić, wykonujemy operację na wartości ujemnej, skutecznie odwracając znak.
(wstawiany: 7 bajtów; jako funkcja: 10 bajtów)
Całkiem zręczny; trudno jest zrozumieć, jak można to poprawić. Jedno rzuca się w oczy: te dwie 2-bajtowe
NEG
instrukcje. Szczerze mówiąc, dwa bajty wydają się być o jeden bajt za dużo, by zakodować prostą negację, ale to zestaw instrukcji, z którymi musimy pracować. Czy są jakieś obejścia? Pewnie! Jeśli otrzymamyXOR
-2, możemy zamienić drugąNEG
ację naINC
rement:(wstawiany: 6 bajtów; jako funkcja: 9 bajtów)
Inną osobliwością zestawu instrukcji x86 jest instrukcja uniwersalna
LEA
, która może wykonać ruch rejestru-rejestru, dodanie rejestru-rejestru, przesunięcie przez stałą i skalowanie wszystkiego w jednej instrukcji!(10 bajtów)
AND
Instrukcja jest podobna doTEST
instrukcji używaliśmy wcześniej, że zarówno zrobić bitowe AND i ustawić odpowiednio flagi, aleAND
faktycznie uaktualnia operand przeznaczenia. NastępnieLEA
instrukcja skaluje to o 2, dodaje oryginalną wartość wejściową i zmniejsza o 1. Jeśli wartość wejściowa była nieparzysta, odejmuje to 1 (2 × 0 - 1 = -1); jeśli wartość wejściowa była parzysta, to dodaje 1 (2 × 1 - 1 = 1).Jest to bardzo szybki i skuteczny sposób na napisanie kodu, ponieważ znaczną część wykonania można wykonać w interfejsie, ale nie kupuje nam to zbyt wiele bajtów, ponieważ tak wiele zajmuje kodowanie złożonego
LEA
instrukcja. Ta wersja również nie działa tak dobrze dla celów wstawiania, ponieważ wymaga zachowania oryginalnej wartości wejściowej jako danych wejściowychLEA
instrukcji. Tak więc przy ostatniej próbie optymalizacji cofnęliśmy się, sugerując, że nadszedł czas, aby się zatrzymać.Tak więc, dla końcowego konkurencyjnego wpisu, mamy 9-bajtową funkcję, która pobiera wartość wejściową do
ECX
rejestru (pół-standardowa konwencja wywoływania oparta na rejestrze na 32-bitowym x86) i zwraca wynik wEAX
rejestrze (jak w przypadku wszystkie konwencje wywoływania x86):Gotowy do montażu za pomocą MASM; zadzwoń z C jako:
źródło
dec eax; xor eax, 1; inc eax
zadziała i zaoszczędzi jeden bajt więcej?Galaretka , 3 bajty
Wypróbuj online!
Pseudo kod:
abs((-1)**n - n)
źródło
-1
.Python3,
2018 bajtówDość proste. Najpierw obliczamy n-1 i decydujemy, czy dodać do niego 2, czy nie.
Jeśli n jest parzyste -> n mod 2 będzie wynosić 0, dlatego dodamy 2 * 0 do n-1 , co daje n-1 .
Jeśli n jest nieparzyste -> n mod 2 będzie wynosić 1, dlatego dodamy 2 * 1 do n-1 , w wyniku czego n + 1 .
Wolę wyjaśnienie, które zrobiłem za pomocą MS paint i touchpada do laptopa ...
źródło
Python, 16 bajtów
Wypróbuj online!
źródło
"x+-012~|&^()*/%"
.-(1^-x)
.MATL , 7 bajtów
Pozwala to uniknąć operacji arytmetycznych. Wypróbuj online!
Wyjaśnienie
Rozważ dane wejściowe
4
jako przykład.źródło
Braingolf v0.1 ,
1110 bajtówWypróbuj online! (Drugi argument to kod Braingolfa, trzeci argument to dane wejściowe)
Zapisano bajt dzięki Neilowi
Pierwsza w historii konkurencyjna odpowiedź braingolfa: D
Wyjaśnienie:
Braingolf v0.2 , 9 bajtów [niekonkurujący]
Wypróbuj online! (Drugi argument to kod Braingolfa, trzeci argument to dane wejściowe)
Wyjaśnienia znajdują się powyżej. Jedyną różnicą jest Braingolf v0.2, domyślne zachowanie operatorów diadycznych i funkcja
,
modyfikatora są odwrócone, co oznacza, że 2 przecinki w odpowiedzi v0.1 nie są już potrzebne.Jednak po wyzwaniu została wydana wersja v0.2, więc ta nie jest konkurencyjna
źródło
.1<2,%?+:-
robi to, co myślę, że robi?-
aby wykonać operację w prawidłowy sposób, w którym to przypadku nadal będzie takiej samej długości jak moja odpowiedź<
, aby obrócić1
poniżej wejścia, tak, że będzie w odpowiednim miejscu już.-
stosu, wygląda to tak:[n,1]
operatory braingolfa są odwrócone, więc wykonałoby to1 - n
, co spowodowałoby-(n-1)
, że pożądany wynik jest po prostun-1
Cubix ,
109 bajtówWypróbuj online
Wyjaśnienie
Wersja netto
Wykonane postacie to
źródło
Python, 68 bajtów
W duchu wyjątkowego podejścia. Poniższy wykres pokazuje funkcję (z fioletowymi kropkami reprezentującymi pierwsze 10 przypadków). Teoretycznie powinno być możliwe skonstruowanie rozwiązania tego pytania na podstawie większości (wszystkich?) Funkcji okresowych (np. Sin, tan, sec). W rzeczywistości podstawianie cos na sec w kodzie, tak jak powinno, powinno działać.
źródło
PHP, 15 bajtów
źródło
;
jest wymagany, i próbowałem użyć.php
pliku, a także echa bezpośrednio do php (php7 cli.) Za każdym razem, gdy mówiono mi, że$argn
jest to niezdefiniowana zmienna.F
flagą i rurociągu:echo 42 | php -F script.php
.JavaScript,
1712 bajtówInne podejście, 10 bajtów
skradzionych z odpowiedzi C (sssshhh)źródło
x=>x-(-1)**x
|0
? Oba rozwiązania wyglądają tak, jakby powinny automatycznie konwertować ciągi na liczby. (Aby uzyskać pierwsze rozwiązanie, jeśli chcesz uniknąć miejsc po przecinku, użyj<input type=number>
.)JavaScript (ES6),
14131210 bajtówSpróbuj
Oryginalny, 12 bajtów
źródło
Python, 20 bajtów
n%2or-1
zwróci 1, jeśli jest nieparzysty, ale jeśli jest parzysty,n%2
to „false” (0), więc zamiast tego zwraca -1. Następnie po prostu dodajemy to don
.Poprzednie rozwiązanie, 23 bajty
n%2
oblicza resztę pon
podzieleniu przez 2. Jeśli jest parzysta, to zwraca 0, a element 0 na tej liście ton-1
. Jeśli jest nieparzysty, zwraca 1, a element 1 na tej liście ton+1
.źródło
lambda n:[n-1,n+1][n%2]
Retina , 21 bajtów
Wypróbuj online! Moja pierwsza odpowiedź na siatkówkę z dwoma końcowymi znakami nowej linii! Objaśnienie: Pierwsze dwa wiersze są konwertowane z dziesiętnego na jednoargumentowy. Trzeci i czwarty wiersz odejmują dwa od liczb parzystych. Ostatni wiersz konwertuje z powrotem na dziesiętne, ale dodaje także jeden.
źródło
05AB1E , 4 bajty
Wypróbuj online!
źródło
Èi>ë<
jest taka ładna;_;
.Cubix , 11 bajtów
Wypróbuj online!
Wyjaśnienie
Wersja netto:
Znaki są wykonywane w następującej kolejności:
źródło
Brain-Flak , 36 bajtów
Wypróbuj online!
Jestem osobiście bardzo zadowolony z tej odpowiedzi, ponieważ jest ona znacznie krótsza niż to, co uważam za tradycyjną metodę rozwiązania tego problemu.
Wyjaśnienie
Pierwszy bit kodu
konwertuje stos z tylko
n
naNastępnie, gdy górna część stosu jest różna od zera, zmniejszamy ją i odwracamy pod nią znak liczby
Usuwamy zero i dodajemy dwie pozostałe liczby
źródło
Matematyka,
2219 bajtówZaoszczędzono 3 bajty dzięki Gregowi Martinowi!
Poprzednia odpowiedź, 22 bajty
Wyjaśnienie (dla poprzedniej odpowiedzi)
Mathematica ma tę fajną funkcję, że operacje takie jak arytmetyka automatycznie przewijają listy.
W tym przypadku bierzemy,
Mod[#,2]
która zwróci 0 lub 1, ale musimy dodać 1, ponieważ listy Mathematica są indeksowane 1. Jeśli jest parzysty , wynik jest równy 1, więc#-1
jest zwracany. Jeśli jest nieparzysty , wynik jest równy 2, więc#+1
jest zwracany.źródło
[[0]]
możliwość:#-1[-1][[#~Mod~2]]&
.Mądry , 8 bajtów
Wypróbuj online!
Wyjaśnienie
Gdyby było na odwrót (zmniejszenie, jeśli nieparzyste, zwiększenie, jeśli parzyste), byłoby to dość łatwe.
Przerzucilibyśmy ostatni kawałek.
Poprawka polega na tym, że odwracamy ostatni bit, gdy jest ujemny. Liczby ujemne są o 1 wyłączone od negacji liczb,
~
więc tworzy to przesunięcie rozwiązujące problem.Więc po prostu wyjmujemy program i owijamy go
-
.źródło
Java 8,
1610 bajtówJava 7,
3428 bajtówNudne porty niesamowitej odpowiedzi w języku C @feersum .
Wypróbuj tutaj.
Stare odpowiedzi:
Java 8, 16 bajtów
Java 7, 34 bajty
Objaśnienie (starej odpowiedzi Java 7):
Wypróbuj tutaj.
Powyższa odpowiedź jest krótszym wariantem polegającym
int c(int n){return n%2<1?n-1:n+1;}
na pozbyciu się przestrzeni.źródło
Japt , 6 bajtów
Wypróbuj online!
źródło
Python, 20 bajtów
źródło
Befunge 93 , 18 bajtów
Nie skończyłem jeszcze gry w golfa (mam nadzieję).
źródło
kv
(lubjv
jeśli jest to dokładnie 1 lub 0) zamiast#v_
. Ponadto, jeśli używasz Wypróbuj online (i polecam), możesz zakończyć program innym&
(chociaż zajmie to 60 sekund), dzięki czemu możesz pozbyć się@
pierwszego wiersza, jeśli go użyjesz. Oto pełna lista poleceń dla Befunge-98 , chociaż nie wszystkie mogą być poprawnie zaimplementowane w TIO, np.&
kończenie programu zamiast cofania w EOF.Ruby, 12 bajtów
źródło
R, 17 bajtów
gdzie
n=scan()
bierze wartość cyfry.źródło
-(-1)^n
raczej niż+(-1)^n
skoro musimy wrócić,n-1
jeślin
jest nawetCasio-Basic, 27 bajtów
26 bajtów dla funkcji, +1, aby wprowadzić
n
w polu parametrów.źródło
C, 29 bajtów
źródło
Galaretka , 4 bajty
Wypróbuj online!
źródło
Partia, 20 bajtów
Niezależnie odkryłem ponownie algorytm @ feersum, szczerze!
źródło