Jak ustalić, czy liczba jest nieparzysta, czy nawet bez operacji modowo-bitowych?
To wyzwanie jest rażąco nieefektywne, ale podważa twoją zdolność do myślenia nieszablonowego na rzecz kreatywnego rozwiązania.
EDYTOWAĆ :
Proszę utworzyć funkcję. Ponadto, chociaż wyrażenie regularne jest zabawną odpowiedzią, funkcja powinna akceptować każdy prawidłowy numer.
TŁO : To pytanie pochodzi z moich najwcześniejszych dni programowania. Zadaniem domowym na nasz pierwszy dzień zajęć było napisanie prostego programu, który drukował „nieparzyste” lub „parzyste”. Jako bachor, którym byłem, nie przeczytałem książki, którą mieliśmy dla klasy, w której po prostu pokazał nam, jak jej używać%
. Spędziłem około pół godziny krocząc do przodu w swoim pokoju, próbując wymyślić sposób na zrobienie tego, i przypomniałem sobie z wykładu, że liczby mogą stracić i zyskać precyzję, gdy są przenoszone z jednego prymitywnego typu na inny. Dlatego, jeśli weźmiesz liczbę, podzielisz ją przez dwa, a następnie pomnożysz z powrotem, nie będzie równa pierwotnej liczbie, będziesz wiedział, że liczba była nieparzysta.
Następnego dnia byłem oszołomiony, gdy nasz instruktor oceniał nasze programy, że uznał, że jest to najbardziej oryginalny, choć nieefektywny sposób rozwiązania problemu.
źródło
Odpowiedzi:
W większości języków programowania podział zwraca iloraz liczb całkowitych. Możesz to po prostu sprawdzić
źródło
int
/long
floor()
. Działa to doskonale w C i C ++.Pyton
źródło
Brainf *** (179)
Jest to jeden z bardziej interesujących problemów związanych z logiką warunkową, które zrobiłem w BF.
Wymaga wprowadzania tekstu za pomocą liczby. Jeśli liczba jest parzysta, wyprowadza
E
, a jeśli jest nieparzysta, wyprowadzaO
.Jestem z tego wystarczająco dumny, że pokażę bardziej czytelną dla człowieka formę:
źródło
Matematyka
źródło
I
iPi
zamiasti
ipi
.do
Kilkakrotnie pomnożona przez siebie dowolna liczba parzysta przepełni się do 0, biorąc pod uwagę liczbę całkowitą o skończonym rozmiarze, a każda liczba nieparzysta będzie nadal mieć ustawiony co najmniej najmniej znaczący bit.
Edycja: jako prosta funkcja:
źródło
Python (wolny)
źródło
abs()
połączenie na początku.JavaScript
daje
true
liczbę parzystą. Działa to tylko z liczbami całkowitymi o rozsądnej wielkości (np. Nie notacja naukowa po konwersji na ciąg i brak części ułamkowej).źródło
/[02468]$/.test
./[02468]$/.test('I am a fake even number 0')
. W takim przypadku możesz zrobić/^[0-9].[02468]$/.test(i)
/-?^\d*[02468]$/
byłoby trochę bardziej rygorystyczne niż twoje wyrażenie regularne. Będziesz potrzebował więcej pracy, aby działało to poprawnie dla liczb, które są znakowane przy użyciu notacji naukowej.Pyton
Ponieważ nie jestem do końca pewien, jakie są kryteria punktacji, oto kilka rozwiązań, które wymyśliłem dla rozrywki. Większość z nich korzysta
abs(n)
obsługuje liczby ujemne. Większość, jeśli nie wszystkie, nigdy nie powinna być używana do prawdziwych obliczeń.Ten jest nudny:
I to jest moje ulubione, chociaż niestety nie działa (jak wskazał March Ho poniżej: tylko dlatego, że wszystkie liczby parzyste są sumą dwóch liczb pierwszych, nie oznacza, że nie wszystkie liczby nieparzyste).
źródło
Haskell
To oczywiście nie jest kreatywne, nieszablonowe rozwiązanie, którego szukasz, ale ile razy mam zamiar opublikować odpowiedź Haskell krótszą niż GolfScript, naprawdę? Szkoda, że to nie jest golf golfowy.
Ale poważniej:
źródło
odd
), który jest wbudowaną funkcją, która zwraca True, jeśli liczba jest nieparzysta. To kompletna odpowiedź sama w sobie i krótsza niż obecna odpowiedź GolfScript (która w chwili pisania tego tekstu ma 10 znaków, ale spodziewam się, że spadnie). Pytanie jest również nieco nieokreślone, dlatego twierdzę, żeodd
jest wystarczające. To również może się zmienić.parity
Algorytm działa przynajmniej na wszystkichNum
instancjach, które są liczbami całkowitymi. To jest gorące! Chociaż pewnie bym to zrobiłevens = [0,2..] >>= \n -> [-n, n]
. Podobne dla kursów.Używając celowo przewrotnej interpretacji pytania „Jak ustalić, czy liczba jest nieparzysta, czy parzysta”, oto implementacja C (załóż
bool
itrue
odpowiednio zdefiniuj):źródło
0.5
zwroty,true
kiedy nie powinna.Co, nie ma jeszcze algorytmów losowych?
do
Losowo paruj liczby w zakresie 0 .. n -1, aż pozostanie mniej niż 2. Jest to dość niezwykle nieefektywne: O ( n 3 ).
Zupełnie inny:
Haskell
Wykorzystuje fakt, że transformata Fouriera funkcji parzystej (np.
\x->x^^4
) Jest rzeczywista, podczas gdy transformata Fouriera funkcji nieparzystej jest urojona.źródło
Windows PowerShell
Bez operatorów bitowych, bez modułu, zgodnie z żądaniem.
źródło
Coq, 103
O ile mogę to stwierdzić, jest to pierwszy wpis w coq na codegolf.
Jeszcze krótszy (59):
źródło
Rubin
Jeśli chcesz wydrukować wynik:
źródło
.odd?
definicji.Unlambda
Świat potrzebuje więcej Unlambda.
Unlambda ma tutaj przewagę zabójcy: domyślną ( ahem ) reprezentacją liczb są cyfry kościelne, więc wszystko, czego potrzeba, to zastosować je do funkcji binarnej, aby nie działała jako prawda. Łatwo!
PS: Markdown i Unlambda zdecydowanie nie są stworzone dla siebie.
Weryfikacja pierwszych kilku liczb całkowitych:
źródło
Golfscript
źródło
Pyton
Podobna wydajność do wcześniejszej wersji. Działa teraz na 0.
Niepoprawna wcześniejsza wersja:
Niezbyt wydajny; czas i pamięć oczywiście O (n): 32 milisekundy na 1 000 000; 2,3 ms na 100000; 3.2 usec dla 100. Działa z liczbami ujemnymi. Zgłasza błąd dla 0, ponieważ 0 nie jest parzyste ani nieparzyste.
źródło
Fraktran
dotyczyło
daje albo
5
jeślin
jest nieparzysty albo1
jeślin
jest parzysty.Aktualizacja : Znacznie krótsza, ale nie tak interesująca:
jest
2
na nieparzysten
i1
na parzysten
.źródło
MMIX (4 bajty)
To rodzaj oszustwa. Nie używam ani modów, ani bitów. To raczej wbudowane testowanie liczb nieparzystych / parzystych. Zakładając, że
$3
zawiera liczbę do przetestowania, a wynik przechodzi do$2
:ustawia
$2
na1
if$3
jest parzyste, a0
jeśli nie. MnemnoricZSEV
oznacza nawet zero i ma następującą semantykę:Dla powyższej linii
mmixal
generuje te cztery bajty zestawu:źródło
Schemat
To najbardziej nieefektywne rozwiązanie, jakie znam.
źródło
Perl
Co powiesz na
źródło
JavaScript, 36
Zwraca,
true
jeśli nawet,false
jeśli nie.źródło
Perl
źródło
Pyton
testowanie kwadratu i, więc działa również dla liczb ujemnych
źródło
FA#
Wzajemna rekurencja dla wygranej.
Liczba n jest nawet jeśli jest zerowa lub (n-1) jest nieparzysta.
Liczba n jest nieparzysta, jeśli jest nierówna do zera, a (n-1) jest parzysta.
(abs dodane, jeśli ktoś jest zainteresowany parzystością liczb ujemnych)
źródło
Clojure
źródło
Co kwalifikuje się jako operacje bitowe? Pod maską dzielenie liczb całkowitych przez 2 prawdopodobnie będzie realizowane jako przesunięcie bitowe.
Zakładając, że przesunięcia bitów nie są wykluczone:
C / C ++
edytuj Pominięto niektóre nawiasy i ostatecznie zmieniono, aby usunąć zmianę, aby zrobić mniej. Możesz to przetestować, wykonując następujące czynności (w * nix):
... chociaż w Linuksie / tcsh musiałem uciec przed odwrotnym ukośnikiem,
\n
nawet jeśli był to pojedynczy cudzysłów. Testowałem w Little & Big-Endian, działa poprawnie w obu. Również ręcznie to skopiowałem; komputer, z którym piszę, nie ma kompilatora, więc mogą mieć błędy.x86 asm
.
lub
lub
... śledzony przez:
Alternatywnie, zmiany i porównania można również wykonać w ten sposób:
źródło
shl
i przyjaciele są niedozwoleni ...W procesorze 68000 możesz przenieść wartość słowa z adresu zdefiniowanego przez wartość do przetestowania:
i niech pułapka sprzętowa dla błędu adresu określa nieparzystą / parzystą naturę wartości - jeśli wyjątek zostanie zgłoszony, wartość była nieparzysta, jeśli nie, wartość była parzysta:
Nie działa na procesorach Intel x86, ponieważ są one bardziej elastyczne w zakresie dostępu do danych.
źródło
Pyton
Postanowiłem spróbować najbrzydszego, najbardziej zagmatwanego rozwiązania, jakie mogłem wymyślić:
Drukuje e, jeśli parzyste, a jeśli nieparzyste.
źródło
Q
Odejmuj 2, aż x <2, a następnie przelicz na bool
źródło