Schreiben Sie ein Programm / eine Funktion, die zwei Ganzzahlen im Bereich von bis einschließlich akzeptiert und zurückgibt, ob die Binärformen der Zahlen genau ein Bit unterschiedlich sind.
Beispielsweise haben und Binärformen 00000001
und 00000000
, die ein Bit voneinander entfernt sind. In ähnlicher Weise und sind 010011000
und 000011000
, so sie wahr zurück.
Allerdings müssen SieCode sein pristine , so dasswenn jemand etwas in Ihrem Programm gekippt wird, sollte es einen Fehler aus. Wenn Ihr Programm beispielsweise das einzelne Bytea
(01100001
) ist, dann sind alle 8 möglichen geänderten Programme:
á ! A q i e c `
muss einen Fehler werfen. Vergewissern Sie sich, dass Sie eine Änderung nach Bytes vornehmen (z. B. á
repräsentiert das obere Byte tatsächlich das Byte und nicht das tatsächliche Zwei-Byte-Zeichen á
).
Testfälle:
0,1 => Truthy
1,0 => Truthy
152,24 => Truthy
10,10 => Falsey
10,11 => Truthy
11,12 => Falsey
255,0 => Falsey
Regeln:
- Stellen Sie ein Testframework bereit, mit dem Sie überprüfen können, ob Ihr Programm einwandfrei ist, da es eine Vielzahl möglicher Programme gibt (Anzahl der Bytes * 8) oder einen vollständigen Beweis der Unverfälschtheit.
- Bitte stellen Sie sicher, dass Ihr Programm gültig ist, bevor Sie es veröffentlichen.
- Die Ausgabe muss entweder wahrheitsgetreu / falsch sein (beides ist in Ordnung), oder es müssen zwei unterschiedliche fehlerfreie Werte angegeben werden
- Fehler können Laufzeit, Compiler, Interpreter etc. sein.
+1
als die meisten meiner jüngsten Lösungen! : \Antworten:
Python 2 , 35 Bytes
Probieren Sie es online!
Verwendet die Zweierpotenzprüfung
n&-n==n
, um dasn==0
falsche Positiv zu eliminieren .Als Referenz sind dies die Paare von Ein-Zeichen-Binäroperatoren, die ein Bit voneinander entfernt sind, was ihre Verwendung schwierig macht:
Zum Glück
&
und^
gehören nicht dazu.Beachten Sie auch , dass
==
werden kann<=
, und+
kann das Kommentarzeichen geworden#
.Python 2 , 41 Bytes
Probieren Sie es online!
Unter TFeld ist
lambda a,b:bin(a^b).count('1')==1
und macht es unberührten durch die 1'en an sich ändernde+True
und==
zuis
. Danke an Jo King für 1 Byte.quelle
Python 2 ,
726750 BytesProbieren Sie es online!
-5 Bytes, danke an Jo King
Returns
True
/False
for für Wahrhaftige / Falsche.Das Programm ist im Grunde dasselbe wie
lambda a,b:bin(a^b).count('1')==1
, jedoch ohne Zahlen und andere Zeichen, die beim Bit-Flippen funktionieren.Stellt sicher, dass fast alles eine benannte Funktion ist (die alle recht makellos sind)
Der makellose Test am Ende kippt ein einzelnes Bit (für jedes Bit) und probiert die Funktion an einem Eingang aus. Ob das funktioniert (richtig oder nicht), wird diese Variante gedruckt. Keine gedruckten Programme = makellose Funktion.
quelle
Java 8,
68615645 Bytes-11 Bytes dank @EmbodimentOfIgnorance , Ersetzen der Konstante
java.awt.Font.BOLD
durch-~(a^a)
.Probieren Sie es online aus.
Erläuterung:
Die kürzeste Basisfunktion wäre:
Probieren Sie es online aus.
Dies wurde so geändert, dass weder eine Ziffer
=
noch eine der Ziffern vorhanden ist+/*
Operanden für numerische Berechnungen gibt (also die+
Zeichenfolgenverkettung in Ordnung):Die
+""
und.equals
sind zu vergleichen durchString.equals(String)
stattint==int
.ANMERKUNG:
Integer.equals(int)
könnte hier verwendet werden, wäre aber mehr Bytes, da sowohl das.bitCount
alsjava.awt.Font.BOLD
auch primitivint
anstelle vonInteger
-Objekten sind, so dass ein zusätzlichesnew Integer(...)
erforderlich wäre, um eines der beiden in einInteger
-Objekt zu transformieren , bevor wir das verwenden könnten.equals
.quelle
java.awt.Font.BOLD
, aber deineObjects.equals
ist ein schöner Golf, danke!Objects
Teil desjava.util.
Imports, also muss ich das zu der Anzahl der Bytes hinzufügen, die ich fürchte, so dass es 69 Bytes sind .. :(-~(a^a)
für 1 arbeiten?C (gcc) , 56 Bytes
Probieren Sie es online!
Gibt zurück,
0
wenn sich das Paar um 1 unterscheidet, andernfalls ungleich Null. Etwas ungewöhnlich für C, es sei denn, Sie betrachten es als wiederkehrendEXIT_SUCCESS
wenn sich das Paar um 1 unterscheidet, oder einen anderen Wert.Wird verwendet
sizeof((char)d))
, um die Konstante1
auf makellose Weise zu erzeugen , während gleichzeitig der Funktionsname auf makellose Weise erzwungen wird.Es wird dann das 1 mit dem Popcount des XOR der Argumente XORs. Glücklicherweise ist das
^
Symbol einfach makellos zu halten, ebenso wie der sehr lange Bezeichner__builtin_popcount
.In der Zwischenzeit wird das folgende Skript zum Testen der Lösung verwendet:
Welches verwendet das
./flipbit
Tool, das ich geschrieben habe, dessen Quelle einfach ist:Die kniffligen Teile waren:
=
funktioniert nicht gut, da es sich in jedem Fall um einen Vergleich handeln kann. Ebenso-
funktioniert das nicht gut. Somit^
is used to assert equality with 1.quelle
^
Bediener sauber? Wenn die Bits darauf geändert wurden, was hindert es daran, ein anderer Operator zu werden? Dies würde immer noch kompilieren, aber nur die falsche Antwort geben. Missverstehe ich hier etwas über die Bedeutung des Wortes "makellos"?^
können_\ZVN~Þ
Sie am Codepunkt 30~
nur eines oder das nicht druckbare Zeichen ändern. Dies ist der einzige Operator, bei dem es sich jedoch nur um einen unären Operator handelt.__LINE__
instead ofsizeof(char)
. I think its fine to assume that your function will be on line 1 of your .c file. Or evenunix
is defined to 1 on TIO, and probably most other Linux.d
baked into the source in the fewest bytes possible. Otherwised
(or whatever you name the function) can just be changed and the code will still work. Even(__LINE__)
withd();
wont work becaused();
can be changed to any other letter and it will still compile since the function never has to be called, thus isn't linked.R,
3837 bytes-1 byte thanks to Nick Kennedy.
Try it online! (Thanks to Giuseppe for setting up the TIO properly.)
Proof that it is pristine (using Nick Kennedy's checker).
Outputs 0 for falsey, and a positive value for truthy, which I understand is acceptable since R will interpret these as False and True.
Explanation:
bitwXor(a,b)
gives (as an integer) the bitwise XOR betweena
andb
. To check whether it is a power of 2, check whether its log in base 2 is an integer. The functiondpois
gives the probability density function of the Poisson distribution: its value is 0 for non-integer values, and something positive for non-negative integers. TheT
is there becausedpois
requires a second argument (any positive real works, andT
is interpreted as 1).If we insist on outputting to distinct values, the following version outputs FALSE or TRUE in 42 bytes (thanks to Giuseppe for -8 bytes):
and is also pristine. Try it online!
quelle
pi
withT
to save a byte (still pristine). Also your TIO doesn’t correspond to your answer at the moment.scan()
; do you have an idea? (The code works fine on a computer.)F
instead ofexp(-Inf)
, along the same lines as Nick'sT
:-)R, 83 bytes
Try it online!
Proof that this is pristine
Working around the fact that
as.integer
,as.double
etc. are only a bit away fromis.integer
,is.double
etc. was the hardest bit. In the end, usingsum(T^el(.[-T])
as a way of both generating a one and checking thatas.double
has returned a >1 length vector was the best I could do. The wrappingt
is to handle the fact that otherwiseidentical
can becomeide~tical
.quelle
Julia 0.7, 20 bytes
Try it online!
Here is a pristine validator that tries running each modified anonymous function against some input, and neither passes successfully. Note that the code has a multi-byte unicode character, and some possible outputs from bit flipping are not even included, as those produce invalid UTF-8 strings.
quelle
x
andy
are one bit apart, so I believe this is a counter example.y
andx
are also 1 bit off9
and6
respectively.C# (Visual C# Interactive Compiler), 37 bytes
The
a=>b=>
part cannot be changed, or else the function is invalid.In
a!=b
, the=
cannot be changed sinceint
cannot be converted tobool
.Try it online!
quelle
C# (Visual C# Interactive Compiler),
12810177706174 bytes-27 bytes thanks to Ascii-Only
Try it online!
You have to be quite creative to get numbers in C# without using literals. Only uses ^ operator. Variables a,b are all more than 1 bit away from each other and everything else is a keyword/name.
quelle
+/*=
for mathematical or validating operations. ;)+
JavaScript (ES6 in strict mode), 61 bytes
Try it online! or Make sure that all modified programs are wrong
quelle
Groovy,
4736 bytesTry it online!
Adapted version of Kevin Cruijssen's Java answer.
quelle
MATLAB, 37 bytes
Sorry, no TIO link, because I can't get the test suite to work under Octave. Thanks @ExpiredData for some helpful comments.
Test suite:
quelle
numel
instead, because my test suite does not seem to be working in Octave.eye
!Perl 6,
7743 bytesThanks to Jo King for -33 bytes.
This is equivalent to
1
was rewritten aselems([""])
.2
was rewritten assum(elems([""]),elems([""]))
;elems(["",""])
might seem to work butelems([""-""])
is also valid and seems to hang the tester.Try it online!
quelle
JavaScript (Node.js), 20 bytes
Try it online!
validator by Arnauld, modified (not use strict)
quelle