Wprowadzenie
W teorii liczb liczba jest uważana za złą, jeśli w jej reprezentacji binarnej występuje parzysta liczba 1. W dzisiejszym wyzwaniu będziesz identyfikować, czy dana liczba jest zła, czy nie.
Wyzwanie
Twoim zadaniem jest napisanie pełnego programu lub funkcji, która przyjmuje jedną, nieujemną liczbę całkowitą jako dane wejściowe i wyjściowe (lub zwraca), niezależnie od tego, czy ta liczba jest zła, czy nie.
Tabela liderów
U dołu strony znajduje się fragment stosu zawierający tabelę wyników dla tego pytania. (Dzięki, @MartinEnder)
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
# Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
/* Configuration */
var QUESTION_ID = 169724; // Obtain this from the url
// It will be like https://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 81420; // This should be the user ID of the challenge author.
/* App */
var answers = [],
answers_hash, answer_ids, answer_page = 1,
more_answers = true,
comment_page;
function answersUrl(index) {
return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}
function commentUrl(index, answers) {
return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}
function getAnswers() {
jQuery.ajax({
url: answersUrl(answer_page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function(data) {
answers.push.apply(answers, data.items);
answers_hash = [];
answer_ids = [];
data.items.forEach(function(a) {
a.comments = [];
var id = +a.share_link.match(/\d+/);
answer_ids.push(id);
answers_hash[id] = a;
});
if (!data.has_more) more_answers = false;
comment_page = 1;
getComments();
}
});
}
function getComments() {
jQuery.ajax({
url: commentUrl(comment_page++, answer_ids),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function(data) {
data.items.forEach(function(c) {
if (c.owner.user_id === OVERRIDE_USER)
answers_hash[c.post_id].comments.push(c);
});
if (data.has_more) getComments();
else if (more_answers) getAnswers();
else process();
}
});
}
getAnswers();
var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;
var OVERRIDE_REG = /^Override\s*header:\s*/i;
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
var valid = [];
answers.forEach(function(a) {
var body = a.body;
a.comments.forEach(function(c) {
if (OVERRIDE_REG.test(c.body))
body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
});
var match = body.match(SCORE_REG);
if (match)
valid.push({
user: getAuthorName(a),
size: +match[2],
language: match[1],
link: a.share_link,
});
//else console.log(body);
});
valid.sort(function(a, b) {
var aB = a.size,
bB = b.size;
return aB - bB
});
var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
valid.forEach(function(a) {
if (a.size != lastSize)
lastPlace = place;
lastSize = a.size;
++place;
var answer = jQuery("#answer-template").html();
answer = answer.replace("{{PLACE}}", lastPlace + ".")
.replace("{{NAME}}", a.user)
.replace("{{LANGUAGE}}", a.language)
.replace("{{SIZE}}", a.size)
.replace("{{LINK}}", a.link);
answer = jQuery(answer);
jQuery("#answers").append(answer);
var lang = a.language;
lang = jQuery('<a>' + lang + '</a>').text();
languages[lang] = languages[lang] || {
lang: a.language,
lang_raw: lang,
user: a.user,
size: a.size,
link: a.link
};
});
var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);
langs.sort(function(a, b) {
if (a.lang_raw.toLowerCase() > b.lang_raw.toLowerCase()) return 1;
if (a.lang_raw.toLowerCase() < b.lang_raw.toLowerCase()) return -1;
return 0;
});
for (var i = 0; i < langs.length; ++i) {
var language = jQuery("#language-template").html();
var lang = langs[i];
language = language.replace("{{LANGUAGE}}", lang.lang)
.replace("{{NAME}}", lang.user)
.replace("{{SIZE}}", lang.size)
.replace("{{LINK}}", lang.link);
language = jQuery(language);
jQuery("#languages").append(language);
}
}
body {
text-align: left !important;
display: block !important;
}
#answer-list {
padding: 10px;
width: 290px;
float: left;
}
#language-list {
padding: 10px;
width: 500px;
float: left;
}
table thead {
font-weight: bold;
}
table td {
padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Sites/codegolf/all.css?v=ffb5d0584c5f">
<div id="language-list">
<h2>Shortest Solution by Language</h2>
<table class="language-list">
<thead>
<tr>
<td>Language</td>
<td>User</td>
<td>Score</td>
</tr>
</thead>
<tbody id="languages">
</tbody>
</table>
</div>
<div id="answer-list">
<h2>Leaderboard</h2>
<table class="answer-list">
<thead>
<tr>
<td></td>
<td>Author</td>
<td>Language</td>
<td>Size</td>
</tr>
</thead>
<tbody id="answers">
</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr>
<td>{{PLACE}}</td>
<td>{{NAME}}</td>
<td>{{LANGUAGE}}</td>
<td>{{SIZE}}</td>
<td><a href="{{LINK}}">Link</a></td>
</tr>
</tbody>
</table>
<table style="display: none">
<tbody id="language-template">
<tr>
<td>{{LANGUAGE}}</td>
<td>{{NAME}}</td>
<td>{{SIZE}}</td>
<td><a href="{{LINK}}">Link</a></td>
</tr>
</tbody>
</table>
EDYCJA: Uważam, że to pytanie nie jest duplikatem tego , ponieważ podczas gdy to pytanie wymaga policzenia liczby jedności, to pytanie pyta, czy liczba parzystych jest parzysta. Mimo, że można osiągnąć to pytanie przez zliczenie liczby bitów, istnieją inne metody zbyt .
666 => False
powinien to być przypadek testowy.Odpowiedzi:
Zespół Z80 (8 bitów), 2 bajty
Poniższy kod działa tylko z wartościami do 255:
Wersja 16-bitowa (działa na wszystkich testach), 3 bajty
Działa to z wartościami do 65535.
Jeśli masz ochotę na przygodę, możesz zgolić 1 bajt, przechowując dane wejściowe
A
i tymC
podobnea następnie bieganie
Obciąża to jednak program wywołujący, więc może się zdarzyć, że dwa bajty (
push BC
ipop AF
) również zostaną policzone.źródło
or
że są bitowe z 2 operandamior
mnemonika jest akumulator A. W tym przypadku polecenie nie zmienia się A. Odświeża tylko rejestr stanu (aw szczególności flagę parzystości), aby odzwierciedlają zawartość A.P
dozwolone jest zgodnie z codegolf.meta.stackexchange.com/a/8509/29560 ? Jest to jeden bit wF
rejestrze (flagi), na który wpływa tylko trzy pary instrukcji. Ponadto, ta odpowiedź nie wspomina, że konkuruje tylko o wartości 8-bitowe, ponieważA
jest rejestrem 8-bitowym. Oznacza to, że nie jest w stanie udzielić odpowiedzi777
ani żadnej innej wartości bez znaku powyżej 255.:P
A
jest sparowany zF
, więc nie zaakceptowałbymAB
lubBA
jako wartość 16-bitowa.BC
jest 16-bitowy, ale potrzebujesz dodatkowej instrukcji, aby załadować jedną z nichA
przed XOR-em drugiej. Zawsze tylko wspominałem, że moje odpowiedzi Z80 działają w pełni do 255 lub 65535, w zależności od pytania. Może dodać również wersję 16-bitową? Tak więc 2 bajty dla wartości 8-bitowych, 3 bajty dla wartości 16-bitowych.JavaScript (ES6), 18 bajtów
Wypróbuj online!
Wyjaśnienie
Bitowa logika wygląda następująco:
~-n
jest równoważne-(-n)-1
, więc jest to po prostu inny sposób działanian-1
. W tym konkretnym przypadku moglibyśmy faktycznie użyćn-1
.n & (n-1)
usuwa najmniej znaczący bit ustawiony na 1 w n, ponieważ zmniejszenie n zamienia wszystkie końcowe 0 na 1 i usuwa 1, który następuje bezpośrednio (przez propagację przenoszenia), pozostawiając wszystko inne bez zmian.Przykład dla n = 24 (11000 dwójkowo):
Dlatego przetwarzamy tyle wywołań rekurencyjnych, ile jest 1 w reprezentacji binarnej n , odwracając wynik za każdym razem za pomocą
!
. Ostatnie połączenie zawsze zwraca 1 .Przykłady:
źródło
Python 2 , 25 bajtów
Wypróbuj online!
bin(n)
daje wynik jak'0b10101'
. Czytamy to jako liczbę całkowitą base-13co zmniejsza moduł 2 do ≡ 1 ⋅ 1 5 + 1 ⋅ 1 4 + 0 ⋅ 1 3 + 1 ⋅ 1 2 + 0 ⋅ 1 1 + 1 ⋅ 1
Więc
int(bin(n),13)%2
równa się 1 + (liczba jedynekbin(n)
) modulo 2.Jeśli
n
jest zły, wynik wynosi 1; w przeciwnym razie jest to 0.Wybrałem tę sztuczkę z Noodle9 .
źródło
lambda n:int(`n`,13)%2
. Wypróbuj online!Japt
-h!
,543 bajtySpróbuj
Wyjaśnienie
źródło
¤¬x v
to jest odpowiedźC # (interaktywny kompilator Visual C #) ,
4338 bajtówGra w golfa Wypróbuj online!
Bez golfa
Pełny kod z testami
Wydawnictwa
-5 bytes
- ZamienionoCount
naSum
43 bytes
- Wstępne rozwiązanie.Notatki
źródło
Bash (bez zewnętrznych narzędzi),
5644 bajtówwhile(($1));do set $(($1/2)) $(($2+$1%2));done;!(($2%2))
Zakłada się, że liczba została znaleziona
$1
, ponieważ została przekazana jako pierwszy argument wiersza poleceń. Zakłada również, że jest to skrypt powłoki (aby mógłexec
sam).Powtarza się, po pewnym czasie, używając
exec $0
, aż liczba (in$1
) osiągnie zero, dzieląc ją przez dwa w każdej iteracji. Sumuje także (in$2
) liczbę razy, gdy otrzymujemy liczbę nieparzystą. Na koniec oryginalny numer był „zły”, jeśli suma$2
nie była nieparzysta.Przykładowe inwokacje:
Dla
0
:Prawidłowy wynik, z odrobiną dodatkowej z boku.
źródło
R ,
3726 bajtówWypróbuj online!
Alternatywa dla odpowiedzi Roberta S. pozwala uniknąć wbudowanego dzielenia bitów,
ale kończy się mniej golfa,a dzięki JayCe i digEmAll kończy się nieco bardziej golfowo.źródło
%/%
%%
05AB1E , 4 bajty
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
Stax , 4 bajty
Uruchom i debuguj
źródło
R ,
9998443428 bajtów-1 dzięki Kevin Cruijssen! -54 dzięki ngm! -10 dzięki Giuseppe! -6 dzięki JayCe!
Wypróbuj online!
Alternatywnie, używając
binaryLogic
pakietu (39 bajtów):źródło
==0
może być<1
:)C (gcc) , 36 bajtów
Wypróbuj online!
Metoda K&R https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan
Musi zostać skompilowany z poziomem optymalizacji 0
źródło
error: expected constructor, destructor, or type conversion before '(' token
(strzałka wskazuje naf
nazwę funkcji). Jakich flag kompilatora potrzebuję?-O
.-O0
flagi kompilatora.Wolfram Language (Mathematica) ,
2422 bajtówWypróbuj online!
źródło
2∣
jest poprawą naEvenQ
. Wypróbuj online!PHP,
3736 bajtówAby uruchomić:
Lub wypróbuj online!
Drukuje
1
na prawdę i0
na fałsz.-1 bajt dzięki Benoit Esnard !
źródło
<?=1&~substr_count(decbin($argn),1);
. Ten drukuje również 0 dla false.Brachylog , 4 bajty
Wypróbuj online!
Z wieloma przypadkami testowymi (😈 jest złe, a 👼 nie jest.)
Wykorzystuje coś, co odkryłem ostatnio o
-
predykacie: jego dokumentacja mówi tylko „różnicę elementów [danych wejściowych]”, ale tak naprawdę robi to „sumę elementów o indeksie parzystym (zaczynając od 0) danych wejściowych, pomniejszoną o sumę nieparzystych -indexed elementy wejściowe ".Tutaj,
ḃ
konwertuje liczbę na tablicę cyfr binarnych,o
sortuje je, aby zebrać wszystkie 1.Gdyby liczba parzystych była równa 1, liczba parzysta byłaby równa 1 w parzystych i nieparzystych. Więc
-
po tym dałoby zero. Ale jeśli byłaby nieparzysta liczba 1, wystałaby dodatkowa 1, powodując różnicę -1 lub 1.W końcu twierdzimy, że różnica jest
0
, i otrzymujemy prawdziwy lub fałszywy wynik zgodnie z tym. Przy bardziej elastycznych wymaganiach dotyczących wyjścia można to usunąć dla odpowiedzi 3-bajtowej, przy czym 0 to wyjście zgodne z prawdą, a -1 i 1 jako oba wyjścia falsey.źródło
INTERCAL ,
906563 bajtówWypróbuj online!
Nie ulepszone i rozszerzone (za to, co jest warte) z komentarzami w stylu C.
Musiałem poczynić kilka ustępstw, aby było to możliwe w INTERCAL. Pierwszym jest, podobnie jak we wszystkich programach INTERCAL, wprowadzanie danych numerycznych. Więc jeśli chcesz wprowadzić dane
707
, podaj jeSEVEN OH SEVEN
.Po drugie, INTERCAL tak naprawdę nie ma właściwej wartości prawdziwości lub fałszu. Zamiast tego wyświetli cyfrę rzymską
I
(1), jeśli liczba nie jest zła, lub 0 (zwykle reprezentowane jako,-
ponieważ cyfry rzymskie zwykle nie mogą reprezentować 0).Jeśli chcesz je odwrócić, aby liczby zła zwracały 1, a liczby zła zwracały 0, możesz zmienić linie 4 i 5 z wersji bez golfa w następujący sposób, chociaż dodaje 3 bajty.
źródło
Attache ,
1312 bajtówWypróbuj online!
(Stary 13 bajtów:
Even@1&`~@Bin
)Jest to kompozycja trzech funkcji:
Bin
Sum
Even
Ta sprawdza, że
Sum
zBin
ary rozbudową wejścia jestEven
.źródło
dc ,
1816 bajtówZwraca (do stosu) 0 za zło i 1 za nie zło
Wypróbuj online!
Dość proste - rekurencyjnie stosuje połączony operator ilorazu / reszty
~
do nowego ilorazu i dodaje wszystkie reszty razem, a następnie modyfikuje o 2(po spędzeniu dwóch bajtów na przejściu do standardowej wartości prawda / fałsz).Edytowane w celu odzwierciedlenia konsensusu, że 0 dla prawdy i 1 dla fałszu jest w porządku, szczególnie w języku, który nie ma żadnej
if(boolean)
konstrukcji.źródło
Python 2, 29 bajtów
Wypróbuj online!
Zwraca 1, jeśli Prawda, w przeciwnym razie 0.
Konwertuje liczbę na ciąg binarny, taki jak „0b11”, liczy liczbę 1, pobiera uzupełnienie wyniku i zwraca ostatni bit uzupełnienia (dzięki, https://codegolf.stackexchange.com/users/53560/cdlane !) (1, jeśli oryginalny numer był parzysty, 0, jeśli był nieparzysty).
źródło
lambda n:~bin(n).count('1')&1
zastępuje podział modułowy czymś potencjalnie tańszym.x86-16, 3 bajty
Lista NASM:
16-bitowa funkcja liczb całkowitych arg w AX (która jest zniszczona), zwracana wartość w PF.
Sprzęt oblicza dla nas parzystość wyniku na podstawie flagi parzystości x86 . Dzwoniący może użyć
jp
/jnp
do rozgałęzienia lub cokolwiek zechce.Działa dokładnie tak, jak odpowiedź Z80 / 8080 @ cschultz ; w rzeczywistości 8086 został zaprojektowany, aby ułatwić mechaniczne przenoszenie źródeł z 8080 .
Zauważ, że PF jest ustawiany tylko od niskiego bajtu szerszych wyników, więc
test edi,edi
nie działałby dla wersji x86-64. Musiałbyś xor poziomo do 16 bitów, lubpopcnt eax, edi
/and al,1
(gdzie 0 to prawda).źródło
C ++ (gcc) (-O0),
3631 bajtówWypróbuj online!
C ++ (clang) , 35 bajtów
Wypróbuj online!
Oto moja pierwsza próba gry w golfa z kodem, mam nadzieję, że nie złamałem żadnej zasady, którą mogłem przegapić.
Edycja:
- Zapisano 5 bajtów dzięki @Jonathan Frech: zastąpiony
!=
przez-
ireturn
przezi=
(ostatni zamiennik nie wydaje się jednak działać z clang)- Ponieważ wydaje się, że toczy się debata, czy powinienem użyć nadużycia gcc -O0, pomyślałem, że mógłbym po prostu podaj obie wersje
źródło
!=
w golfa-
i kolejne cztery, grającreturn
w golfai=
.gcc -O0
hacka? Przy porównywaniu implementacji nie jest tak ważna, jak długość całkowitej kotłów języka ma duże znaczenie. Ponadto sprawia, że bardziej interesujące jest wybieranie pomiędzyreturn
vs przez odniesienie (aktualizacja*i
na miejscu). Wolałbym pisać odpowiedzi w C lub C ++, a nie w odpowiedzi niezoptymalizowane-gcc, ponieważ niezoptymalizowany-gcc nie jest zbyt przydatnym językiem.SML , 32 bajty
Wyjaśnienie:
%
to nazwa funkcjin
jest wejściem, zwraca (n +% (n // 2))% 2Wykonane przez 2 znudzonych studentów Carnegie Mellon
źródło
Dalej (gforth) , 53 bajty
Wypróbuj online!
Wyjaśnienie
Przyjmuje sumę xor cyfr postaci binarnej liczby. (wielokrotnie dzieli przez 2, a xors resztę wartością „suma”)
Objaśnienie kodu
źródło
Java 8,
4036 bajtów-4 bajty dzięki @Okx za coś, czego sam nie powinienem zapomnieć ...
Wypróbuj online.
Wyjaśnienie:
Zauważ, że znaki kodujące dla
0
i1
są48
i49
, ale sumowanie ich i przyjmowanie modulo-2 nadal zawiera prawidłowe wyniki, ponieważ48%2 = 0
i49%2 = 1
.źródło
n.toString(n,2)
oszczędza 4 bajty.~n.toString(n,2).chars().sum()%2
aby zapisać jeden bajt.0
i1
nie są prawdziwe / falsey w Javie, tylkobooleans
/Booleans
są. Jeśli wyzwanie mówi, że dozwolone są dwa różne dane wyjściowe,<1
można by je rzeczywiście usunąć, aby zaoszczędzić 2 bajty. :)Perl 6 , 21 bajtów
Sprawdź to
Rozszerzony:
źródło
*.base(2)%9%%2
{:3(.base(2))%%2}
Retina 0.8.2 , 28 bajtów
Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:
Konwertuj na unary.
Częściowa konwersja binarna (pozostawia dodatkowe zera).
Usuń wszystkie zera.
Modulo te przez dwa.
Sprawdź, czy wynik wynosi zero.
źródło
Zestaw x86,
1211 bajtów-1 bajt dzięki sugestii @ ceilingcat
źródło
inc eax
zamiastnot eax
. Warto również wspomnieć, że wymaga to procesora obsługującegopopcnt
instrukcję.Narzędzia Bash + GNU, 33
Wypróbuj online!
Odczytuje dane wejściowe ze STDIN. Wyjścia 1 dla wartości True i 0 dla wartości False.
dc
konwertuje dane wejściowe na ciąg binarnytr
usuwa zerawc
zlicza pozostałe (i końcowy znak nowej linii, co koryguje logikędc
oblicza zliczanie mod 2 i wysyła odpowiedźźródło
Python 2,
2827 bajtówWypróbuj online!
Zwraca wartość truthy jeśli dokładnie jeden z
the ones-bit is a 1
ithe result of calling this function on n/2 is truthy
jest prawdą (lubn==0
). Działa ponieważn/2
jest równoważne poprawnemu przesunięciu bitów z podziałem podłogi (więc tylko Python 2).Wersja alternatywna, również
2827 bajtówWypróbuj online!
Oparty na metodzie K&R zliczania zestawów bitów, do których odwołuje się vazt.
Oba mogą być o dwa bajty krótsze, jeśli dane wyjściowe pozwolą falsey oznaczać zło.
Edycja: Podziękowania dla Amphibological za uratowanie bajtu!
źródło
1
i,or
aby zapisać +1 bajt. Fajne rozwiązanie!APL (Dyalog Unicode) , 10 bajtów SBCS
Anonimowa ukryta funkcja. Jako argument może przyjąć dowolną tablicę liczb całkowitych.
Wypróbuj online!
2∘⊥⍣¯1
konwertuj na binarny, używając tyle cyfr, ile potrzeba przez największą liczbę, oddzielne cyfry wzdłuż osi głównej1⍪
dodawaj te wzdłuż głównej osi≠⌿
Redukcja XOR wzdłuż osi głównejźródło
J , 9 bajtów
Anonimowa ukryta funkcja. Może przyjmować dowolną tablicę liczb całkowitych jako argument.
Wypróbuj online!
1-
jeden minus (tj. logiczna negacja)2|
mod-2 z1#.
suma (lit. ocena podstawy 1) z#:
reprezentacja binarnaźródło
2|1+1#.#: