Bestimmen Sie anhand einer gegebenen Zahl, ob es sich um eine Falznummer handelt.
Eine Falzzahl ist eine Zahl, bei der Sie, wenn Sie sie als Binärdarstellung betrachten und in zwei Hälften "falten", das Ergebnis einer XNOR-Multiplikation der ersten Hälfte der Zahl und der zweiten Hälfte mit umgekehrten Ziffern erhalten Null.
Wenn die Zahl eine ungerade Anzahl von Ziffern im Binärformat hat, muss die mittlere Ziffer 1 sein und wird beim Falten ignoriert.
Da dies etwas verwirrend sein könnte, möchte ich einige Beispiele nennen:
178
Die binäre Darstellung von 178 ist
10110010
Um dies zu falten, teilen wir es zuerst in zwei Hälften
1011 0010
Wir kehren die zweite Hälfte um
1011
0100
Und wir XNOR die beiden Hälften:
0000
Dies ist Null, das ist also eine Faltzahl.
1644
Die binäre Darstellung von 1644 ist
11001101100
Um dies zu falten, teilen wir es zuerst in zwei Hälften
11001 1 01100
Das mittlere Bit ist 1, also werfen wir es raus.
11001 01100
Wir kehren die zweite Hälfte um
11001
00110
Und wir XNOR die beiden Hälften:
00000
Dies ist Null, das ist also eine Faltzahl.
4254
Die binäre Darstellung von 4254 ist
1000010011110
Um dies zu falten, teilen wir es zuerst in zwei Hälften
100001 0 011110
Das mittlere Bit ist 0, dies ist also keine Falzzahl.
Aufgabe
Ihre Aufgabe ist es, eine positive Zahl aufzunehmen und eine Wahrheit zurückzugeben, wenn die Zahl richtig und falsch ist, wenn sie nicht richtig ist. Dies ist Codegolf, also versuchen Sie, den Byte-Countdown niedrig zu halten.
Testfälle
Hier sind die ersten 99 Klappnummern:
[1, 2, 6, 10, 12, 22, 28, 38, 42, 52, 56, 78, 90, 108, 120, 142, 150, 170, 178, 204, 212, 232, 240, 286, 310, 346, 370, 412, 436, 472, 496, 542, 558, 598, 614, 666, 682, 722, 738, 796, 812, 852, 868, 920, 936, 976, 992, 1086, 1134, 1206, 1254, 1338, 1386, 1458, 1506, 1596, 1644, 1716, 1764, 1848, 1896, 1968, 2016, 2110, 2142, 2222, 2254, 2358, 2390, 2470, 2502, 2618, 2650, 2730, 2762, 2866, 2898, 2978, 3010, 3132, 3164, 3244, 3276, 3380, 3412, 3492, 3524, 3640, 3672, 3752, 3784, 3888, 3920, 4000, 4032, 4222, 4318, 4462, 4558]
0
, also nein. (Es könnte sich jedoch lohnen, ein drittes Beispiel wie dieses zu haben.) Gleiches gilt für 18.Antworten:
Gelee , 9 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
05AB1E ,
1312 BytesCode:
Verwendet die CP-1252- Codierung. Probieren Sie es online!
Erläuterung:
Zuerst konvertieren wir die Zahl mit in binär
b
. 1644 wird 11001101100 . Wir teilen dies in zwei Teile mit2ä
. Beispielsweise würde 11001101100 :Bei einer ungeraden Anzahl von Bits erhält der erste Teil das zusätzliche Bit. Wir
R
kehren die letzte Zeichenfolge um und fügen mit eine Null an0¸«
. Der Grund dafür ist, nur dann wahrheitsgemäße Ergebnisse zu liefern, wenn das mittlere Bit eine 1 ist ( 1 XOR 0 = 1 und 0 XOR 0 = 0 ). Wenn es kein mittleres Bit gibt, ignoriert 05AB1E nur das letzte Bit (die angehängte Null):Das Letzte, was wir tun müssen, ist ein elementweises XOR durchzuführen und das Produkt des Ergebnisses zu nehmen. Wenn ein Element zu viele Elemente enthält, lässt das Programm das letzte Element einfach weg (
[1, 0, 0] XOR [0, 1] = [1, 1]
). Beispiel:Wird:
Und das Produkt davon ist 1 , was wahr ist.
quelle
s
erforderlich ist.bÐg;ô
Ich war so weit wie ich konnte, bevor ich mich erfrischte und sah, dass du es genagelt hast. Tolle Antwort, hilf mir zu lernen!Java 7,
152 145 142 138134 BytesDurchläuft die Zeichenfolge wie bei einem Palindrom und sucht nach Nullen. Behalten Sie den Überblick, indem Sie wiederholt multiplizieren. Sie müssen also nur überprüfen, ob es am Ende nicht Null ist.
Ohne Bildlaufleisten:
quelle
byte[]b=(a+"").getBytes();
ist kürzer als daschar[]b=a.toString(a,2).toCharArray();
und scheint trotzdem zu funktionieren (-12 bytes).getBytes
könnte immer noch über das Zeichen [] arbeiten. Danke :)z
als int zurückgeben (0
für falsch, für wahrheitsgemäße alle anderen) - Sie sparen ein paar Bytes.JavaScript (ES6),
615752 BytesBerechnet rekursiv:
wo
N
ist der Rang des höchsten gesetzten Bits in der Eingabe.Wenn der Eingang eine ungerade Anzahl von Bits hat, wird das mittlere Bit mit undefined (der von
pop()
einem leeren Array zurückgegebene Wert) XOR-verknüpft , wodurch es unverändert bleibt . Ein0
mittleres Bit löscht also die Ausgabe und ein1
mittleres Bit ändert das Ergebnis der anderen Operationen nicht - was mit der Herausforderungsdefinition einer Faltzahl konsistent ist.quelle
Python 2, 57 Bytes
Ausgabe über Exit-Code : Fehler bei Falsey und kein Fehler bei Truthy.
Wandelt die Eingabe in eine Binärdatei um. Überprüft, ob das erste und das letzte Zeichen ungleich sind, und wiederholt dies, nachdem diese Zeichen entfernt wurden.
Der Vergleich
s[-1]==s[0]<_
gibt einen Fehler aus, wenn das erste und das letzte Zeichen ungleich sind, indem versucht wird, die nicht zugewiesene Variable mit dem Namen auszuwerten_
. Wenn sie gleich sind, wird stattdessen die Kette der Ungleichungen kurzgeschlossen. Wenn wir zum mittleren Element von kommen1
, wird diewhile
Schleife beendet, um den Sonderfall als OK zu kennzeichnen.Ich vermute, dass ein rein arithmetischer Ansatz kürzer sein wird, wenn eine Rekursion
f=lambda n,r=0:...f(n/2,2*r+~n%2)...
Binärziffern von dem Ende abschneidet, das gespiegelt und umgekehrt ist, und erkennt, wannn
undr
gleich einem Zentrum ist1
. Es gibt jedoch Feinheiten mit führenden Nullen und der Mitte.quelle
Python 2,
94 79 7267 Bytes12 Bytes dank @xnor gespart
Definiert eine unbenannte Funktion in der zweiten Zeile.
Erklärung (mit etwas Leerzeichen):
Probieren Sie es hier aus!
quelle
s==''or s=='1'
can bes in'1'
and
kann arithmetisch sein*
. Auchf
darf unbenannt sein.Haskell,
898886 BytesArbeitet, indem bitweise die Bitdarstellung mit ihrer Rückseite summiert und das Produkt genommen wird. Wenn es 1 oder 2 ist, ist die Zahl eine faltende Zahl (1, wenn es gerade Bits gibt, die falten, 2, wenn es ungerade Bits gibt und eine Eins in der Mitte).
quelle
Python 2,
100999594 BytesDas fühlt sich ein bisschen lang an, aber ich werde weiter daran arbeiten :) Druckt ein,
1
wenn die Zahl gefaltet werden kann,0
ansonsten.Teste es hier!
danke an Wheat Wizard für die 1-Byte-Speicherung :)
Danke an Rod für die 5-Byte-Speicherung! :)
quelle
b-1
mit~b
[1,a[b]>'0'][len(a)%2]
mit(a[b]>=`len(a)%2`)
e=len(a)
, umb=e/2
`e%2
` zu ändern und 1 Byte zu sparen. Und dann werden beide Python-Antwort c:> <> , 37 + 3 = 40 Bytes
Es wird erwartet, dass die Eingabe beim Programmstart auf dem Stack vorhanden ist, also +3 Byte für das
-v
Flag.Probieren Sie es online!
quelle
Jelly , 13 Bytes
TryItOnline
Oder passende Begriffe bis zu 4558
Wie?
quelle
Perl, 46 Bytes
Beinhaltet +1 für
-p
Führen Sie mit der Nummer auf STDIN
folding.pl
:Ich halte es für einen Perl-Fehler, dass dies sogar funktioniert. Interne
$_
sollten keine Aktualisierungen der Übereinstimmungsposition erhalten, sobald sie geändert wurden. In diesem Programm springt die Matchposition tatsächlich über das Ende von hinaus$_
quelle
perl -pe '$_=sprintf("%b",$_)=~/^(.*)1?(??{reverse$^N=~y%01%10%r})$/'
Brachylog , 16 Bytes
Es funktioniert nicht ganz online ...
Übernimmt die Eingabe über die Eingabevariable und gibt sie über Erfolg oder Misserfolg aus. Es stützt sich stark auf
z₂
die Sprache, die seit dem 30. April verfügbar ist, aber wir haben vergessen zu fragen, ob TIO darauf zugegriffen werden soll. Derzeit funktioniert dies nur bei einer lokalen Installation der Sprache. So oder so ist es wahrscheinlich eine zu naive Herangehensweise.Brachylog (auf TIO), 19 Bytes
Probieren Sie es online!
lᵛ↖Lz
ist funktional äquivalent zuz₂
(wenn Sie die Variable L nirgendwo anders verwenden), aber es ist auch drei Bytes länger.quelle
Python 2,
76 7169 Bytes-5 Bytes dank @Dennis (
''
ist vorhanden in'1'
, also ersetzenin('','1')
durchin'1'
)-2 Bytes dank @xnor (verwenden Sie die Multiplikation
(...)*
anstelle vonand
)Ideone
Bei der rekursiven Funktion wird beim ersten Aufruf
n
eine Zahl als kleiner als die leere Zeichenfolge mit ausgewertetif n<''
, und die Funktion wird erneut aufgerufen, jedochn
in eine binäre Zeichenfolge umgewandelt. Das Ende ist entweder eine leere Zeichenfolge (gerade Bitlänge) oder das mittlere Bit, das true für empty oder a zurückgibt'1'
. Auf dem Weg nach unten prüft es die äußeren Bits auf Ungleichheit (entspricht XOR) und rekursiv auf die inneren Bitsn[1:-1]
.quelle
n in'1'
funktioniert.''
war anwesend'blah'
, aber ja, es ist :)and
kann arithmetisch sein*
.Python 2, 63 Bytes
Druckt
True
oderFalse
. Übernimmt die Binärdarstellung dess
ersten und letzten Zeichens und entfernt sie wiederholt, solange sie ungleich sind. Prüft, ob der leere String oder ein zentraler übrig bleibt1
. Dies erfolgt durch Konvertieren''
in'1'
und Überprüfen, ob das Ergebnis gleich ist'1'
, wodurch auch ein Indexfehler für die leere Zeichenfolge vermieden wird.quelle
PowerShell v2 +, 143 Byte
Zwei mögliche Ansätze, beide die gleiche Byteanzahl.
Methode 1:
Nimmt Eingaben vor
$n
, wenn dies der-eq
Fall ist1
(ein Sonderfall für diesen Algorithmus), erhöhen Sie ihn. Setzen Sie$o
utput auf1
(dh nehmen Sie an, dass es wahr ist), und führen Sie dann eine Schleife von0
bis zur Mitte der Eingabezahl durch, die[convert]
auf binär gesetzt wurde. Beachten Sie das-!($b%2)
, um Binärzahlen mit ungerader Länge zu berücksichtigen.Bei jeder Iteration vergleichen wir die aktuelle Ziffer
$n[$_]
mit der Ziffer, die vom Ende an die gleiche Länge hat$n[$b-$_]
, und multiplizieren das Boolesche Ergebnis mit$o
(im Grunde genommen führen wir ein-and
auf alle von ihnen aus). Sobald die Schleife beendet ist, müssen wir möglicherweise die mittlere Binärziffer berücksichtigen, das ist der Pseudoternär am Ende (Array indiziert über$b%2
). Das1
oder0
wird in der Pipeline belassen, und die Ausgabe ist implizit.Methode 2:
Übernimmt die Eingabe und führt den gleichen Vorgang aus, um
[convert]
die Zahl zu binären. Dann sind wir in einerfor
Schleife, solange die.length
von der binären Zeichenfolge-g
rößeret
han2
. Wenn wir in der Schleife sind, wenn die ersten$n[0]
und letzten$n[-1]
Ziffern sind-n
ote
qual, in Scheiben schneiden , diese beiden Ziffern weg von$n
und wieder speichern es in$n
. Ansonsten Ausgabe0
undexit
. Sobald wir die Schleife unterwegs sind, haben wir entweder (eine Reihe von1
,1,0
,0,1
,1,1
, oder0,0
) oder das binären Zeichenfolge für zwei10
oder 311
. Wir müssen also diese beiden Möglichkeiten testen. Zum einen bewerten wir-join
$n
gemeinsam mit+
und das Ergebnis und testen, dass es ist1
(Dies gilt für Arrays1
,1,0
und0,1
, aber$false
für Arrays0,0
und /1,1
oder Strings10
oder11
). Die andere Hälfte der-or
testet , ob$n
ist-eq
UAL zu10
(dh Eingang2
). Dieser Boolesche Wert verbleibt in der Pipeline, und die Ausgabe ist implizit.quelle
CJam , 13 Bytes
Probieren Sie es online! oder erstellen Sie eine Liste mit Falznummern bis zu einer bestimmten Nummer.
quelle
MATL , 16 Bytes
Wahrheit ist ein Array mit allen. Überprüfen Sie hier die Wahrheitskriterien .
Probieren Sie es online! Oder Überprüfen Sie die ersten 20 Testfälle .
Erläuterung
Verwenden wir
1644
als Beispiel die Eingabe .quelle
PHP, 101 Bytes
oder mit log
108 Bytes mit Array
Wahre Werte <10000
quelle
Julia , 66 Bytes
Mein erstes Golf! Funktioniert genauso wie die Python-Lösung von gleicher Länge, kleine sprachliche Unterschiede (ich habe es mir aber selbst ausgedacht ...).
Erläuterung:
quelle
C
223201189194178 BytesBrute-Force-Algorithmus. Mal sehen, wie weit es golfen kann.
Bessere Bugfixes für das Test-Setup ...
quelle
MATL , 13 Bytes
Wahrheit ist ein Array mit allen. Überprüfen Sie hier die Wahrheitskriterien .
Probieren Sie es online! Oder überprüfen Sie die ersten 20 Testfälle .
Erläuterung
Verwenden Sie die Eingabe
1644
als Beispiel:quelle
JavaScript, 71 Bytes
Definiert eine anonyme Funktion.
Diese Methode ist vielleicht nicht die kürzeste, aber meines Wissens ist sie einzigartig. Es addiert die Zahl in binärer Form in umgekehrter Reihenfolge zu sich selbst, behandelt sie als Dezimalzahl und prüft dann mithilfe eines regulären Ausdrucks, ob das Ergebnis gültig ist.
quelle
Netzhaut, 92 Bytes
Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.
Probieren Sie es online aus
In Unary konvertieren. Wandle das in eine Binärdatei um. Schneiden Sie die Zahl in zwei Hälften und entfernen Sie eine Mitte,
1
falls vorhanden. Kehren Sie die erste Hälfte um. Schalten Sie die Einsen und Nullen. Spiel, wenn beide Hälften gleich sind.quelle
Retina,
717060 BytesIch muss wahrscheinlich noch viel über Retina lernen (zB rekursiver regulärer Ausdruck?). Erläuterung: In Schritt 1 wird von dezimal nach unär konvertiert. Schritt 2 konvertiert von unär zu pseudobinär. In Schritt 3 werden Ziffern von beiden Enden entfernt, solange sie nicht übereinstimmen. Schritt vier entspricht bei Bedarf einer optionalen letzten zentralen 1. Bearbeiten: 1 Byte dank @ mbomb007 gespeichert. Sparte 10 Bytes, indem ich meine Konvertierung von unär nach binär verbesserte.
quelle
.*
oder sein.+
.Python 2,
6159 BytesSpeichern von zwei Bytes zum Konvertieren von Verschiebungen in Multiplikationen
Kehrt
0
für eine Falznummer und für alles andere für das Nicht-Falzen zurück. Verwendet den Bit-Twiddling-Ansatz.quelle
C
6563 BytesZwei Bytes zum Umwandeln von Verschiebungen in Multiplikationen
Whitespace ist bereits von bytecount ausgeschlossen, gibt 0 für eine Falzzahl und alles andere für ein Nicht-Falzen zurück. Verwendet den Bit-Twiddling-Ansatz.
quelle
k, 77 Bytes
zur Erklärung eine Übersetzung zu
q
quelle