Napisz program / funkcję, która przyjmuje dwie liczby całkowite z zakresu od do włącznie i zwraca, czy binarne formy liczb są dokładnie o jeden bit inne.
Na przykład i mają formy binarne 00000001
i 00000000
, które są nieco od siebie oddzielone. Podobnie i są 010011000
i 000011000
dlatego zwracają wartość true.
Jednak twój kod musi być nieskazitelny , tak aby jeśli jakiś bit w twoim programie został odwrócony, powinien generować błąd. Na przykład, jeśli twój program był jednobajtowya
(01100001
), to wszystkie 8 możliwych zmodyfikowanych programów:
á ! A q i e c `
musi zgłosić błąd. Upewnij się, że modyfikujesz bajty (np. á
Tam, gdzie faktycznie reprezentuje bajt , a nie rzeczywisty znak dwóch bajtów á
).
Przypadki testowe:
0,1 => Truthy
1,0 => Truthy
152,24 => Truthy
10,10 => Falsey
10,11 => Truthy
11,12 => Falsey
255,0 => Falsey
Zasady:
- Podaj strukturę testową, która może zweryfikować, że twój program jest właściwie nieskazitelny, ponieważ będzie wiele możliwych programów (liczba bajtów * 8), lub też pełny dowód nieskazitelności.
- Należy upewnić się, że program jest prawidłowy, przed wysłaniem go.
- Dane wyjściowe muszą być zgodne z prawdą / falseyem (obie strony są w porządku), albo dwie wyraźne wartości bez błędów
- Błędy mogą dotyczyć środowiska wykonawczego, kompilatora, interpretera itp.
+1
s niż większość moich ostatnich rozwiązań! : \Odpowiedzi:
Python 2 , 35 bajtów
Wypróbuj online!
Używa testu potęgi dwóch
n&-n==n
, eliminującn==0
fałszywie dodatni.Dla porównania są to pary jednoznakowych operatorów binarnych, które są nieco od siebie oddalone, co czyni je trudnymi w użyciu:
Na szczęście,
&
i^
nie należą do nich.Zauważ też, że
==
może stać się<=
i+
może stać się postacią komentarza#
.Python 2 , 41 bajtów
Wypróbuj online!
Biorąc TFeld
lambda a,b:bin(a^b).count('1')==1
i czyniąc go nieskazitelnym, zmieniając 1 na+True
i==
nais
. Dzięki Jo King za 1 bajt.źródło
Python 2 ,
726750 bajtówWypróbuj online!
-5 bajtów, dzięki Jo King
Zwraca
True
/False
za truey / falsey.Program jest w zasadzie taki sam jak
lambda a,b:bin(a^b).count('1')==1
, ale bez liczb i innych znaków, które działają po odwróceniu bitów.Działa, upewniając się, że prawie wszystko jest nazwaną funkcją (wszystkie są całkiem nieskazitelne)
Nieskazitelny test na końcu przerzuca jeden bit (za każdy bit) i wypróbowuje funkcję na wejściu. Jeśli to działa (poprawne lub nie), ta odmiana jest drukowana. Brak drukowanych programów = nieskazitelna funkcja.
źródło
Java 8,
68615645 bajtów-11 bajty dzięki @EmbodimentOfIgnorance , zastępując stałą
java.awt.Font.BOLD
z-~(a^a)
.Wypróbuj online.
Wyjaśnienie:
Najkrótszą funkcją podstawową byłoby:
Wypróbuj online.
Jest to modyfikowane, więc nie ma cyfry
=
ani jednego z+/*
operandów do obliczeń numerycznych (więc+
przypadku konkatenacji ciągów jest w porządku):+""
I.equals
są przez porównanieString.equals(String)
zamiastint==int
.UWAGA:
Integer.equals(int)
może być użyte tutaj, ale byłoby więcej bajtów, ponieważ zarówno.bitCount
ijava.awt.Font.BOLD
są prymitywneint
zamiastInteger
-obiektów, więc koniecznenew Integer(...)
byłoby dodatkowe przekształcenie jednego z dwóch naInteger
-obiekt, zanim będziemy mogli użyć.equals
.źródło
java.awt.Font.BOLD
, ale TwójObjects.equals
golf jest fajny, dzięki!Objects
jest częściąjava.util.
importu, więc obawiam się, że muszę dodać to do liczby bajtów, dzięki czemu 69 bajtów .. :(-~(a^a)
działałoby za 1?C (gcc) , 56 bajtów
Wypróbuj online!
Zwraca,
0
jeśli para różni się o 1, w przeciwnym razie niezerowa. Nieco niezwykłe dla C, chyba że uważasz, że powróciEXIT_SUCCESS
jeśli para różni się o 1, w przeciwnym razie inna wartość.Używa
sizeof((char)d))
do uzyskania stałej1
w nieskazitelny sposób, jednocześnie zmuszając nazwę funkcji do nieskazitelności.Następnie XORs to 1 z liczbą popartą XOR argumentów. Na szczęście
^
symbol jest łatwy do utrzymania w czystości, podobnie jak bardzo długi identyfikator__builtin_popcount
.Tymczasem oto skrypt używany do testowania rozwiązania:
Który korzysta z
./flipbit
narzędzia, które napisałem, którego źródłem jest po prostu:Trudne fragmenty to:
=
nie działa dobrze, ponieważ może być porównaniem w każdym przypadku, w którym mogłoby się pojawić. Podobnie-
nie działa dobrze. A zatem^
służy do zapewnienia równości z 1.źródło
^
nieskazitelność operatora? Jeśli bity na tym zostały zmienione, co powstrzyma go przed przekształceniem się w innego operatora? To nadal się kompiluje, ale po prostu daje złą odpowiedź. Czy coś tu nie rozumiem co do znaczenia słowa „dziewiczy”?^
można go zmienić tylko na dowolny_\ZVN~Þ
znak lub na niedrukowalny znak w punkcie kodowym 30.~
jest jedynym z nich, który jest operatorem, ale jest tylko operatorem jednoargumentowym.__LINE__
zamiastsizeof(char)
. Myślę, że można założyć, że twoja funkcja będzie w pierwszej linii pliku .c. Lub nawetunix
jest zdefiniowany na 1 w TIO i prawdopodobnie w większości innych Linuksa.d
upieczenie do źródła w jak najmniejszej liczbie bajtów. W przeciwnym razied
(lub jakkolwiek nazwiesz funkcję) można po prostu zmienić i kod nadal będzie działał. Nawet(__LINE__)
jeślid();
nie zadziała, ponieważd();
można go zmienić na dowolną inną literę i nadal będzie się kompilować, ponieważ funkcja nigdy nie musi być wywoływana, dlatego nie jest połączona.R ,
3837 bajtów-1 bajt dzięki Nickowi Kennedy'emu.
Wypróbuj online! (Podziękowania dla Giuseppe za prawidłowe skonfigurowanie TIO.)
Dowód, że jest nieskazitelny (przy użyciu kontrolera Nicka Kennedy'ego ).
Wykazuje 0 dla falsey i dodatnią wartość dla prawdy, co rozumiem, jest dopuszczalne, ponieważ R zinterpretuje je jako False i True.
Objaśnienie:
bitwXor(a,b)
podaje (jako liczbę całkowitą) bitowy XOR międzya
ib
. Aby sprawdzić, czy jest to potęga 2, sprawdź, czy jego log w bazie 2 jest liczbą całkowitą. Funkcjadpois
podaje funkcję gęstości prawdopodobieństwa rozkładu Poissona: jej wartość wynosi 0 dla wartości niecałkowitych i coś dodatniego dla nieujemnych liczb całkowitych.T
Jest tam, ponieważdpois
wymaga drugiego argumentu (żadnych pozytywnych prawdziwe dzieła iT
jest interpretowane jako 1).Jeśli nalegamy na wyprowadzanie różnych wartości, następująca wersja wyśle FAŁSZ lub PRAWDA w 42 bajtach (dzięki Giuseppe za -8 bajtów):
i jest również nieskazitelny . Wypróbuj online!
źródło
pi
zT
zapisać bajt (wciąż nietknięty). Twoje TIO nie odpowiada w tej chwili twojej odpowiedzi.scan()
; Masz pomysł? (Kod działa dobrze na komputerze.)F
zamiast tego używaćexp(-Inf)
, podobnie jak NickT
:-)R , 83 bajty
Wypróbuj online!
Dowód, że jest to nieskazitelne
Praca wokół faktu, że
as.integer
,as.double
itd. Są tylko nieco z dala odis.integer
,is.double
itd. Był najtrudniejszy kawałek. Ostatecznie najlepszym rozwiązaniem było użyciesum(T^el(.[-T])
jako sposobu zarówno wygenerowania jednego, jak i sprawdzenia,as.double
czy zwrócił wektor długości> 1. Opakowaniet
ma poradzić sobie z faktem, że inaczejidentical
może się staćide~tical
.źródło
Julia 0,7 , 20 bajtów
Wypróbuj online!
Oto nieskazitelny walidator, który próbuje uruchomić każdą zmodyfikowaną anonimową funkcję dla niektórych danych wejściowych i żadna z nich nie powiedzie się. Zauważ, że kod ma wielobajtowy znak Unicode, a niektóre możliwe dane wyjściowe z odwracania bitów nie są nawet uwzględnione, ponieważ generują one niepoprawne ciągi UTF-8.
źródło
x
iy
są trochę oddzielone, więc uważam, że to kontrprzykład.y
ix
również przy nieco 19
i6
odpowiednio.C # (interaktywny kompilator Visual C #) , 37 bajtów
a=>b=>
Część nie może być zmieniony, albo funkcja jest nieprawidłowy.W
a!=b
The=
nie mogą być zmienione, ponieważint
nie można przekształcićbool
.Wypróbuj online!
źródło
C # (interaktywny kompilator Visual C #) ,
12810177706174 bajtów-27 bajtów dzięki Ascii-Only
Wypróbuj online!
Musisz być dość kreatywny, aby uzyskać liczby w C # bez literałów. Używa tylko operatora ^. Zmienne a, b są od siebie oddalone o więcej niż 1 bit, a wszystko inne jest słowem kluczowym / nazwą.
źródło
+/*=
do operacji matematycznych lub sprawdzania poprawności. ;)+
JavaScript (ES6 w trybie ścisłym), 61 bajtów
Wypróbuj online! lub Upewnij się, że wszystkie zmodyfikowane programy są nieprawidłowe
źródło
Groovy ,
4736 bajtówWypróbuj online!
Dostosowana wersja odpowiedzi Java Kevina Cruijssena .
źródło
MATLAB, 37 bajtów
Przepraszamy, brak linku do TIO, ponieważ nie mogę zmusić pakietu testowego do pracy pod Octave. Dzięki @ExpiredData za pomocne komentarze.
Zestaw testowy:
źródło
numel
Zamiast tego wybrałem MATLAB , ponieważ mój zestaw testów nie działa w Octave.eye
!Perl 6 ,
7743 bajtówDzięki Jo King za -33 bajty.
Jest to równoważne z
1
został przepisany jakoelems([""])
.2
został przepisany jakosum(elems([""]),elems([""]))
;elems(["",""])
może wydawać się działać, aleelems([""-""])
jest również poprawny i wydaje się, że zawiesza tester.Wypróbuj online!
źródło
JavaScript (Node.js) , 20 bajtów
Wypróbuj online!
walidator Arnaulda, zmodyfikowany (nie należy stosować ściśle)
źródło