Normalerweise zerlegen wir eine Zahl in Binärziffern, indem wir sie mit Zweierpotenzen mit einem Koeffizienten von
0
oder1
für jeden Term zuweisen :
25 = 1*16 + 1*8 + 0*4 + 0*2 + 1*1
Die Wahl von
0
und1
ist ... nicht sehr binär. Wir werden die wahre binäre Expansion durchführen, indem wir mit Potenzen von 2 expandieren, aber mit einem Koeffizienten von1
oder-1
stattdessen:
25 = 1*16 + 1*8 + 1*4 - 1*2 - 1*1
Das sieht jetzt binär aus.
Bei jeder positiven Zahl sollte es trivial sein, Folgendes zu sehen:
- Jede ungerade Zahl hat unendlich viele echte binäre Erweiterungen
- Jede gerade Zahl hat keine echten binären Erweiterungen
Damit eine echte binäre Erweiterung genau definiert werden kann, muss die Erweiterung am geringsten sein , dh mit der kürzesten Länge.
Geben Sie bei jeder positiven, ungeraden Ganzzahl n
ihre wahre binäre Erweiterung von der höchstwertigen Ziffer zur niedrigstwertigen Ziffer (oder in umgekehrter Reihenfolge) zurück.
Regeln:
- Da dies Code-Golf ist , sollten Sie versuchen, dies in kürzester Zeit zu tun . Builtins sind erlaubt.
- Jede Ausgabe, die die Koeffizienten darstellen und auflisten kann, ist akzeptabel: ein Array, eine Folge von Koeffizienten mit Trennzeichen usw.
- Es gelten Standard-Golfschlupflöcher.
- Ihr Programm sollte für Werte innerhalb der Standardgröße Ihrer Sprache arbeiten.
Testfälle
25 -> [1,1,1,-1,-1]
47 -> [1,1,-1,1,1,1]
1 -> [1]
3 -> [1,1]
1234567 -> [1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1]
0
anstelle des-1
Niederspannungszustands drucken . Der Anrufer, der die Bits empfängt, weiß, was sie bedeuten. (Es ist immer noch eine nicht triviale Bitmanipulationsübung, da ein Rechtsdrehen nur funktioniert, wenn es 32 signifikante Bits hat. Beispielsweise benötigt eine 5-Bit-Zahl eine Drehbreite von 5.)111-1-1
eine gültige Ausgabe für25
?Antworten:
Japt , 6 Bytes
Probieren Sie es online aus!
Erläuterung:
quelle
Pyth ,
1211 BytesProbieren Sie es hier aus!
Wie?
Zunächst stellen wir fest, dass die Aufgabe nur darin besteht, "das
0
s in der binären Schrift durch-1
s zu ersetzen und um 1 Stelle nach rechts zu verschieben". - Genau das sollten wir tun! Die binäre Konvertierung gibt uns eine Liste von0
s und1
s. Alles , was wir hier tun sollten , ist eine Golfy Weg zu konvertieren finden0
zu-1
. Der bitweise Operator|
(bitweises ODER) ist unser Freund. Die Karte über der binären Darstellung verschob sich mit|
und-1
. Wenn die aktuelle Nummer lautet0
, wird sie in konvertiert-1
.quelle
Perl 6
String-Version, 31 Bytes
Probieren Sie es online aus!
Listenversion, 36 Bytes
Probieren Sie es online aus!
quelle
JavaScript (ES6),
3534 ByteTestschnipsel
Code-Snippet anzeigen
quelle
Perl 6 , 72 Bytes
Es gibt sicherlich einen besseren Weg, aber das habe ich ...
Probieren Sie es online aus!
Erläuterung : Diese Funktion benötigt ein Argument (
->$a
). Wir erhalten zuerst die Anzahl der benötigten Koeffizienten ($a.base(2).chars
= Anzahl der Zeichen in der Darstellung der Basis 2) und dann ein kartesisches Produkt (X
) aus so vielen Paaren(1,-1)
. (Das[X]
bedeutet: Reduzieren Sie die folgende Liste mitX
.) So erhalten wir eine Liste aller möglichen Kombinationen von 1s und -1s. Dann filtern wir (grep
) nur die Listen, die die angegebene Nummer codieren$a
. Es gibt nur eine, daher erhalten wir eine Liste mit einer Liste mit den Koeffizienten.Der grep-Block tut dies: Er nimmt sein Argument als list (
@^a
), kehrt es um und komprimiert es mit einer unendlichen Liste unter0,1,2,...
Verwendung des Operators "left bit shift"+<
. Das Zippen stoppt, sobald die kürzere Liste aufgebraucht ist (gut für uns!). Wir summieren dann alle Ergebnisse und vergleichen sie mit der angegebenen Zahl. Wir mussten verwenden,.reverse
weil das OP verlangt, dass die Koeffizienten in der Reihenfolge von höchstwertig bis niedrigstwertig sind.quelle
Gelee , 5 Bytes
Probieren Sie es online aus!
quelle
05AB1E ,
65 BytesProbieren Sie es online aus!
quelle
D<
kann sein®
(®
ist Standard-1
).J, 11 Bytes
Probieren Sie es online aus!
Vielen Dank an @JosiahWinslow für den Algorithmus.
Irgendwelche Gedanken darüber, die Konvertierung zu verkürzen? Meine Gedanken sind die Verwendung von
!.
-fit (nvm, es ändert nur die Toleranz der Konvertierung).Die Verwendung von
{
-take ist um 1 Zeichen länger.quelle
Java 8, 101 Bytes
Port von @Olivers Japt-Antwort mit ein paar weiteren Bytes ..;)
Kann definitiv mit einem mathematischen Ansatz anstelle dieses String-Ansatzes gespielt werden.
Erläuterung:
Probieren Sie es hier aus.
quelle
R ,
908846 BytesProbieren Sie es online aus!
Implementiert Olivers Algorithmus , gibt jedoch die Ziffern in umgekehrter Reihenfolge zurück. Da wir garantiert haben, dass dies
n
niemals gerade ist, ist das niedrigstwertige Bit (das erste) immer1
, also entfernen wir es und fügen ein1
an das Ende an, um die Rotation in R zu simulieren. Vielen Dank an Shaggy , der mich dazu gebracht hat, meine Mathematik zu korrigieren .Durch einfaches Umschreiben
rev( )
der Funktionsaufrufe in der Fußzeile sollten die Werte in derselben Reihenfolge zurückgegeben werden.ursprüngliche Antwort, 88 Bytes:
Anonyme Funktion; Gibt die Werte in umgekehrter Reihenfolge mit angehängten Spaltennamen zurück.
Probieren Sie es online aus!
Erläuterung:
quelle
from the most significant digit to the least significant digit (or in reversed order).
daher sollte dies durchaus akzeptabel sein.25
wäre beispielsweise[1,1,1,-1,-1]
oder[-1,-1,1,1,1]
.2*bits - 1
statt sein1-2*bits
. Vielen Dank.Perl 5 , 30 Bytes
29 Byte Code, 1 Byte für
-p
Switch.Probieren Sie es online aus!
quelle
CJam, 12 Bytes
Ein Port meiner Golfscript-Antwort.
quelle
Ruby ,
44 37 3332 BytesProbieren Sie es online aus!
quelle
Golfscript,
141314 Bytes-1 Byte, weil ich vergessen habe,
%
existiert. +1 Byte, weil ich auch vergessen habe, dass die Eingabe eine Zeichenfolge ist.quelle
{}
, um ihn zu einem Block zu machen. Vollständige Programme können nur als Zeichenfolgen eingegeben werden.{2base{.+(}%\}
für 15 Bytes. Ebenso Ihre CJam-Antwort.~
.