Herausforderung
Wenn Sie eine Binärzahl als Eingabe verwenden, "vereinfachen" Sie die Zahl mit einem vollständigen Programm oder einer Funktion.
Eingang
[binary]
binary
ist eine binäre Zahl, die über 0 liegt.
Ausgabe
Nehmen Sie die Eingabe, konvertieren Sie sie zur Basis 10 ohne Verwendung einer eingebauten Zahl. Wenn diese Zahl nur Einsen und Nullen enthält, konvertieren Sie sie in eine Zahl zur Basis 10, als wäre sie eine andere Binärzahl. Wiederholen Sie den Vorgang, bis die Zahl nicht mehr binär gelesen werden kann, und geben Sie diese Zahl aus.
Andere Informationen
Wenn der Eingang 1 ist, einfach ausgeben
1
. Ihr Programm sollte nicht unendlich weiter vereinfachen 1.Dies ist Codegolf, daher gewinnt die kürzeste Antwort in Bytes bis Dienstag (17. November).
Wenn etwas verwirrend ist, hinterlassen Sie einen Kommentar, in dem Sie angeben, was zu klären ist, und ich werde ihn entsprechend bearbeiten.
Builtins für die Basiskonvertierung sind nicht erlaubt.
Beispiele
Input | Output
1 | 1
1010 | 2
1011 | 3
1100100 | 4
1100101 | 5
1111110011 | 3
quelle
Antworten:
Pyth,
2016 Bytes4 Bytes dank Jakube
Die Hälfte des Codes (
u+yNsTG0
) ist einfach der Basisumwandlungscode.Test Suite
Die Eingabe
1
wird von der Tatsache behandelt, dassu
festgestellt wird , dass sich der Wert nicht mehr ändert.quelle
CJam,
2423 BytesProbieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
quelle
"10"
Zeichenfolgelength-1
mal wiederholen , oder können Sie die Dekrementierung überspringen?"10"
zu,""
wenn die Ganzzahl eine einzelne Ziffer hat. Dies stellt sicher, dass der Code nicht in eine Endlosschleife gerät.Pip,
2827 BytesÜbernimmt die Eingabe als Befehlszeilenargument. Wir wollen eine Schleife machen bis
a=1
odera
einige Zeichen neben 0 und 1 enthalten. Diese letztere Bedingung wird getestet, indemRM
alle Zeichen int
=10
from eingegeben werdena
. Wenn noch etwas übrig ist, ist die Bedingung wahr.Innerhalb der Schleife funktioniert die Konvertierung wie folgt:
Wenn Sie
a
das Ende beenden, wird es automatisch gedruckt.Eine rekursive Lösung in 28 Bytes:
quelle
Python 2, 52
Es ist einfacher, sich dies als zwei rekursive Funktionen vorzustellen:
Die Funktion
g
wandelt einen Dezimalwert auf binär, und die Funktionf
giltg
wiederholt lang ist als Argument von Ziffern besteht 0 und 1 ('2'>max(`n`)
) und ist nicht1
. Der Golf Code reduziert sie in eine einzige Funktion, indem er die Definition vong(n)
for einfügtf(n)
und den rekursiven Aufruf von tog
durch ersetztf
. Der Basisfall vonn=0
vong
wird von der Prüfung automatisch behandeltn>1
.quelle
L
vonrepr
...Prolog,
220212 BytesErklärung
p ist die Hauptfunktion und führt die folgenden Schritte aus (mit Hilfe von b, x, y):
Bearbeiten: 8 Bytes durch Vereinheitlichen der p-Sätze mit OR gespeichert.
quelle
Mathematica
107106Mit einem von DLosc gespeicherten Byte.
Teilen Sie die Eingabe in Ziffern auf. Wenn der Eingang 1 ist, wird 1 ausgegeben.
Wenn die Eingabe eine Zahl ist, die aus Nullen und Einsen besteht, konvertieren Sie diese in eine Dezimalzahl und führen Sie sie erneut aus.
Andernfalls geben Sie die Eingabe zurück.
Der erste Schritt ergibt 1011, was wiederum 3 ergibt.
Hier testen wir ab 1011.
quelle
Javascript,
132, 123 BytesNun, es ist nicht die beste Antwort, aber ..
Zu Ihrer Information, wenn eine ungültige Eingabe angegeben wird, wird diese dem Benutzer angezeigt.
quelle
for
while
{}
;
i
c=x=>{for(r=0;x&&!/[2-9]/.test(x);x=r)for(i=0;x>0;r+=x%10*Math.pow(2,i++),x=parseInt(x/10));alert(x)};c(prompt())
function c(x){while(x^0&&!/[2-9]/.test(x)){for(i=r=0;x;i++)r+=x%10*Math.pow(2,i),x=0|x/10;x=r}alert(x)}c(prompt())
c=x=>
am anfang nicht verstanden , funktionierte nicht auf chrome oder firefox konsole . :( @ ן nןuɟ ן oן, konnte meinen Kopf nicht um die XOR-Bedingung wickeln undx=0|x/10
stattdessenparseInt
habe ich den Rest der Änderungen übernommen. Danke ..c=x=>{for(r=0;x!=0&&!/[2-9]/.test(x);x=r)for(i=r=0;x;)r+=x%10*Math.pow(2,i++),x=parseInt(x/10);alert(x)};c(prompt())
. Es läuft definitiv in Firefox 42, probieren Sie diese Geige . Beachten Sie, dass diese Golf-Version und auch Ihr Originalcode nicht funktionieren1
und in eine Endlosschleife geraten.c=x=>
ist wiefunction c(x){}
siehe " Pfeilfunktionen ".JavaScript ES6, 52
Als eine Funktion. Das Funktionsargument muss entweder eine Folge von Binärziffern oder eine Zahl sein, deren Dezimalrepräsentation nur 1 und 0 enthält.
Testen Sie die Ausführung des folgenden Snippets in einem EcmaScript 6-kompatiblen Browser - Implementierung von Pfeilfunktionen, Vorlagenzeichenfolgen und Spread-Operator (ich verwende Firefox)
quelle
n+=+c+n
die binäre Konvertierung wirklich . So elegant ...Mathematica,
62595548 Bytes7 Bytes gespart dank Martin Büttner.
quelle
Javascript (ES7)
8780787774 BytesSnippet-Demo zur Unterstützung von Browsern (derzeit unterstützt nur Firefox den Exponentialoperator in der Nacht)
Javascript (ES6) 81 Bytes
Snippet-Demo zur Unterstützung von Browsern
quelle
37 Zeichen / 54 Bytes
Try it here (Firefox only).
Ich bin mir nicht sicher, ob der
+
Operator für die Binärkonvertierung als eingebaut gilt.quelle
Perl 6 , 67 Bytes
quelle
PHP,
210204 BytesEs ist das erste Mal, dass ich hier etwas schreibe, also hoffe es wird euch gefallen! Auch wenn es offensichtlich nicht die beste Art ist, es zu schreiben, bin ich trotzdem froh, es hier zu zeigen!
Der Code
Ich habe eine rekursive Funktion "j" erstellt, die zuerst überprüft, ob die Eingabe gleich 1 ist. Wenn dies der Fall ist, gibt die Funktion wie erwartet 1 zurück, andernfalls wird die Zahl in einem Array aufgeteilt, um den Dezimalwert zu berechnen, aber nur wenn die Zahl eine binäre ist. Ist dies nicht der Fall, wird die Nummer unverändert zurückgegeben.
Ungolfed Code
Ich habe eine "foreach" -Anweisung anstelle meiner anfänglichen "for" -Anweisung verwendet, was mir einen Gewinn von 6 Bytes ermöglicht, aber ich bin mir ziemlich sicher, dass noch viel mehr zu tun ist.
quelle
PHP,
114112 Bytesfunktioniert auch für
0
. Laufen Sie mit-r
.count_chars($s,3)
Gibt eine Zeichenfolge zurück, die alle Zeichen der Zeichenfolge enthält (wiearray_unique
bei Arrays). Für Binärzahlen, wird dies sein0
,1
oder01
. Bei anderen Zahlen enthält dies eine Ziffer, die größer als ist1
, sodass<2
nur bei Binärzahlen true zurückgegeben wird.&$s>1
wird für den Sonderfall benötigt1
.Der Rest ist unkompliziert: Durchlaufen Sie die Bits, indem Sie den Wert verschieben und das aktuelle Bit hinzufügen, und kopieren Sie schließlich die Zahl (in Zeichenfolge umgewandelt) für den Test der äußeren Schleife nach $ s.
quelle
CoffeeScript,
9289 BytesJavaScript (ES6),
10510190 ByteDemo
Funktioniert nur in ES6-kompatiblen Browsern wie Firefox und Microsoft Edge
quelle
1
. weil es nicht in die SchleifeScala, 128 Bytes
quelle
Matlab (115)
bin2dec
)quelle