Bitte entschuldigen Sie den Punny-Titel.
Diese Frage ist von A Curious Property von 82000 inspiriert . Darin weist der Autor darauf hin, dass die Zahl 82000 in Basis 2, 3, 4 und 5 binär ist. Der Beitrag wirft dann die Frage auf, ob es eine Zahl gibt, die in Basis 2, 3, 4, 5 und 6 binär ist "? (Für Neugierige habe ich Werte bis zu 10 ^ 1,000,000 überprüft und bisher lautet die Antwort nein.)
Das brachte mich zum Nachdenken: In welchen Basen ist es bei einer gegebenen Zahl binär?
Unsere merkwürdige Zahl 82000 ist eigentlich binär in sechs Basen:
Base 2 = 10100000001010000
Base 3 = 11011111001
Base 4 = 110001100
Base 5 = 10111000
Base 81999 = 11
Base 82000 = 10
Nicht alle Zahlen haben binäre Basen, die sequentiell sind. Betrachten Sie die Zahl 83521. Sie ist in den Basen 2, 17, 289, 83520 und 83521 binär.
Ihre Herausforderung besteht darin, zu bestimmen und anzuzeigen, auf welcher Basis eine Zahl binär ist.
Regeln
- Eine Zahl wird in einer gegebenen Basis als "binär" betrachtet, wenn ihre Darstellung in dieser Basis nur aus Nullen und Einsen besteht.
110110
ist ein binärer Wert, während12345
nicht ist,A380F
ist definitiv nicht. - Ihre Nummer wird in der Standardeingabe angegeben. Es wird ein ganzzahliger Wert zwischen 2 und 2 ^ 32-1 einschließlich sein und wird im Basis-10-Format bereitgestellt.
- Zeigen Sie in aufsteigender Reihenfolge jede Basis an, die größer als eine ist, in der die Zahl binär ist. Jede Basis sollte in einer eigenen Zeile stehen. Wenn Sie den Binärwert in diese Basis einbeziehen (siehe Bonusbewertung unten), trennen Sie die Basis und den Binärwert durch ein Leerzeichen. Es wird nur die Ausgabe auf Standard-Out bewertet, Standardfehler und andere Quellen werden ignoriert.
Wertung
Ihre Punktzahl entspricht der Größe Ihres Programms in Byte. Je niedriger die Punktzahl, desto besser.
Bonus :
Wenn Ihr Programm auch die Binärwerte in den gefundenen Basen ausgibt, multiplizieren Sie Ihre Punktzahl mit 0,75.
Ihr angezeigter Binärwert sollte keine zusätzliche Interpunktion, keine fremden Nullen, keinen Dezimalpunkt, nur Nullen und Einsen enthalten.
Beispiele
Eingang:
82000
Output (erhält Bonus):
2 10100000001010000
3 11011111001
4 110001100
5 10111000
81999 11
82000 10
Eingang:
1234321
Output (kein Bonus):
2
1111
1234320
1234321
quelle
n
ist immer zumindest in binären Basen1
(nicht gezählt),2
,n-1
, undn
.[1, 0, 1, 1, 0]
besonders ok, oder müssen die Nummern gerne zusammengefügt werden10110
?Antworten:
Pyth,
1413Vielen Dank an Jakube für den Hinweis auf die neue
S
Funktion.Probieren Sie es hier aus.
Die Online-Version ist zu langsam
1234321
. Dies konvertiert einfach die Eingabe zu jeder Basis von 2 in sich selbst und verwirft die Ergebnisse, die andere Werte als 0 und 1 enthalten.Erläuterung:
Darüber hinaus ist dies ein (
nicht gut golfedjetzt gut golfed, wieder dank Jakube) Bonus - Version (20 * .75 = 15):Probieren Sie es hier aus
quelle
VQI!-JjQK+2NU2pdKjkJ
Manchmal ist funktionale Programmierung nicht der beste Ansatz.Julia,
72-70BytesEs ist eigentlich länger mit dem Bonus, also kein Bonus hier.
Dies liest eine Zeile aus STDIN, konvertiert sie in eine Ganzzahl und gibt das Ergebnis aus. Obwohl es sich um eine Brute-Force-Methode handelt, dauerte die Eingabe 1234321 für mich weniger als 1 Sekunde.
Ungolfed + Erklärung:
Beispiele:
HINWEIS : Wenn die Eingabe nicht von STDIN, sondern von einem Funktionsargument übernommen werden kann (bis zur Bestätigung durch das OP), beträgt die Lösung 55 Byte.
quelle
CJam, 20 Bytes (oder 27 Bytes * 0,75 = 20,25)
Hier ist die No Bonus Version, 20 Bytes:
Versuchen Sie dies hier.
Nur zum Spaß, hier ist die Bonusversion, 27 Bytes:
Probieren Sie es hier online aus
quelle
ri_,f{2+S@2$bN}4/{2=2,-!},
(19,5 Byte)Mathematica, 59 Bytes
Pfui...
IntegerDigits
D:Es gibt nicht wirklich viel zu erklären über den Code ... 12 Bytes werden durch die Anforderung zur Verwendung von STDIN und STDOUT verschwendet.
Ich glaube nicht, dass ich den Bonus beanspruchen kann. Das Beste, was ich habe, sind 84 Bytes (was eine Punktzahl über 60 ergibt):
quelle
Python 2,
88 8680Ziemlich einfach, kein Bonus. Python ist nett und nachsichtig mit globalen Variablen.
Das beste, was ich für den Bonus bekommen habe, ist 118 * .75 = 87.75 :
quelle
g(N)
statt zu tunn=N
.g(N,b)
dass das Komma die beiden gleich machte), aber was meinst du damit, dass ich keine Variable für N brauche?g(n/b)
auf "(g(n/b)+'n%b')
Wo steht ein Backtick" umsteigen?Python 2, 90 * 0,75 = 67,5
Ziemlich einfacher iterativer Ansatz.
Ohne den Bonus sind dies 73 Bytes:
quelle
SQL (PostgreSQL),
247,5255230,25 (307 * .75)Da SQL für diese Art von Herausforderungen bekannt ist, dachte ich mir, ich sollte eine besser zusammenstellen :) Der Bonus hat sich für diese wirklich gelohnt.
Es sollte den Spezifikationen entsprechen, aber ich habe keine einfache Möglichkeit, COPY I FROM STDIN zu testen . Feste Reihenfolge
bearbeiten . Die Art und Weise, wie Spalte R behandelt wird, wurde geändert, um ein Array zu verwenden.
Als Test habe ich gerade Einsätze in die
I
Tabelle verwendet. Testlauf erweitert und kommentiert.quelle
order by
. Nun, um zu sehen, ob ich diese Charaktere zurückbekommeHaskell 109 * 0,75 = 81,75 Bytes
Anwendungsbeispiel (Anmerkung: Binärwerte sind LSB zuerst):
Ohne Ein- / Ausgabeeinschränkungen, dh Eingabe über Funktionsargument, Ausgabe im nativen Format über REPL):
Haskell, 67 × 0,75 = 50,25 Bytes
Gibt eine Liste von (Basis-, Wert-) Paaren zurück. Die Werte lauten zuerst lsb, z. B. (Zeilenumbrüche / Leerzeichen zur besseren Anzeige hinzugefügt):
quelle
R 111
Wahrscheinlich viel Raum, um dies im Moment zu verbessern
Läuft mit Warnungen
quelle
I%/%b
einer logischen Verknüpfung in derany()
Klausel verursacht werden. `Java,
181155,25 (207 * .75)151,5 (202 * .75) BytesMit Erklärung erweitert:
Original (ohne Bonus):
3,75 Bytes dank Ypnypn :)
quelle
R
948379Verwendung:
Der Kern der Funktion ist
!sapply(2:n,function(x){while(n&n%%x<2)n=n%/%x;n})
, dass für jede Basis x von 2 bis n der Quotient n / x beibehalten wird, solange der Rest entweder 0 oder 1 ist. Anschließend wird das Ergebnis ausgegeben (was 0 ist, wenn alle Reste entweder 1 oder 1 waren 0) und negiert es (0 negiert auf TRUE, alles andere negiert auf FALSE). Aufgrund des Funktionsumfangs muss für n keine Dummy-Variable erstellt werden. Der resultierende Vektor von Booleschen Werten wird dann zum Indizieren verwendet2:n
und gibt daher nur die Basen aus, für die er gearbeitet hat.quelle
TI-Basic, 45 Bytes
Erläuterung
Der komplizierte Teil
Die zweite Zeile funktioniert wie folgt:
Hinweis
Das Programm wird deutlich schneller ausgeführt, wenn
)
am Ende der zweiten Zeile eine schließende Klammer steht. Sehen Sie hier , um mehr über diese.quelle
TI-BASIC,
3129Dies ist wahrscheinlich optimal für TI-BASIC.
Erläuterung:
randIntNoRep(1,32)
Gibt eine zufällige Permutation der Zahlen von 1 bis 32 zurück. 32 Elemente reichen aus, da die kleinstmögliche Basis 2 und die größte Zahl 2 ^ 32-1 ist.B^randIntNoRep(1,31)
erhöht diese Liste auf die B-te Potenz, was dazu führt, dass die Liste alle von enthältB^1,B^2,...,B^32
(in einer bestimmten Reihenfolge) enthält.Dann wird die Eingabe (in der
Ans
wer-Variablen, die in das Formular eingegeben wird[number]:[program name]
) durch diese Zahl geteilt. Wenn Ihre Eingabe 42 ist und die Basis 2 ist, ist das Ergebnis die Liste21,10.5,5.25,...,42/32,42/64,[lots of numbers less than 1/2]
, wiederum in einer bestimmten Reihenfolge.Wenn Sie den Bruchteil nehmen und die Zahl mit Ihrer Basis multiplizieren, erhalten Sie die Ziffer an dieser Position in der Basis-b-Darstellung. Wenn alle Ziffern kleiner als 2 sind, ist die größte Ziffer kleiner als 2.
Wie Ypnypn sagte, eine schließende Klammer auf dem
For
Anweisung aufgrund eines Parser-Fehlers beschleunigt.31-> 31: Ein Byte gespeichert, aber Rundungsfehler behoben, durch die das Byte erneut hinzugefügt wurde.
31-> 29: Zwei Bytes mit
RandIntNoRep()
anstelle von gespeichertcumSum(binomcdf())
.quelle
seq(expression, variable, start, end[, step])
. Wenn kein Schritt angegeben wird, wird standardmäßig der Wert 1 verwendet. Der WertcumSum(binomcdf(31,0
beträgt jedoch 8 Byte, während derseq(X,X,1,32
Wert 9 Byte beträgt.Gelee , 9 Bytes
Probieren Sie es online!
Erledigt neben Caird Coinheringaahing im Chat .
Wie es funktioniert
quelle
Javascript, ES6,
118 * .75 = 88,5110 * .75 = 82,5Vorherige Version:
Prüfen:
quelle
JavaScript ( ES6 ) 65
68 Byte für eine Funktion mit Parameter- und Konsolenausgabe.
65 Bytes mit E / A über Popup
Inanspruchnahme des Bonus: 88 * 0,75 => 66
quelle
Mathematica, 76 · 0,75 = 57
Anfangs vergaß ich die Eingabeanforderungen ... Glücklicherweise fügten diese nicht zu viel Extra hinzu.
quelle
Ruby , 44 Bytes
Probieren Sie es online!
quelle
Perl 5 , 63 Bytes
Probieren Sie es online!
Kein Bonus dafür, da er mit dem Bonus etwas besser abschneidet als meine Version:
Perl 5 , 85 Bytes * 0,75 = 63,75
Probieren Sie es online!
quelle