In dieser Herausforderung werden Sie aufgefordert, eine beliebige Funktion (oder ein vollständiges Programm) zu implementieren, die zwei Eigenschaften erfüllt. Diese Eigenschaften sind:
Ihre Funktion muss eine injektive (umkehrbare) Funktion sein, die von den Polynomen mit nicht negativen Ganzzahlkoeffizienten bis zu den nicht negativen Ganzzahlen reicht. Dies bedeutet, dass keine zwei ungleichen Eingaben einer gleichen Ausgabe zugeordnet werden können.
Ihre Funktion muss die Gesamtzahl der "Ein-Bits" von der Eingabe bis zur Ausgabe beibehalten. Das heißt, wenn Sie die 1 Bits jedes Koeffizienten des Polynoms zählen, sollte deren Summe der Anzahl der 1 Bits in der Binärdarstellung des Ausgangs entsprechen. Zum Beispiel
9
ist es1001
binär, also hat es 21
Bits.
IO
Ein nicht negatives ganzzahliges Polynom ist dasselbe wie eine unendliche Liste nicht negativer Ganzzahlen, sodass nach einem bestimmten Punkt alle Ganzzahlen Null sind. Somit können Polynome entweder durch unendliche Listen (obwohl dies wahrscheinlich unerwünscht ist) oder durch endliche Listen mit impliziten Nullen nach dem Ende der Liste dargestellt werden.
Der Hauptunterschied zwischen Polynomen und endlichen Listen besteht darin, dass das Hinzufügen einer Null am Ende einer Liste die Liste ändert:
Das Hinzufügen einer Null am Ende eines Polynoms ändert seinen Wert nicht:
Wenn Ihre Funktion also eine endliche Liste als Eingabe verwendet, die ein Polynom darstellt, darf das Hinzufügen einer Null das Ergebnis nicht ändern.
Bei der Darstellung von Polynomen als Listen können Sie diese entweder mit dem ersten oder dem letzten Eintrag darstellen, der den konstanten Term darstellt. Beispielsweise könnten Sie eine der folgenden Möglichkeiten haben:
Im ersten Fall sollte das Hinzufügen von Nullen am Ende der Liste das Ergebnis nicht ändern. Im zweiten Fall sollte das Hinzufügen von Nullen am Anfang der Liste das Ergebnis nicht ändern.
Wenn Ihre Sprache Polynome unterstützt, können Sie diese natürlich als Eingabe verwenden.
Die Ausgabe sollte über alle Standardmethoden eine nicht negative Ganzzahl sein.
Dies ist Codegolf, daher werden die Antworten in Bytes gewertet, wobei weniger Bytes besser sind.
[]
oder[0]
eine gültige Eingabe?Antworten:
Gelee , 8 Bytes
Probieren Sie es online!
Links umgekehrt, 5 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Wolfram Language (Mathematica) ,
3620 BytesProbieren Sie es online!
Nimmt ein Polynom f (x) als Eingabe. Wertet y * f (y) aus, wobei y = 2 ^ (f (2)!). Leider bedeutet dies, dass die Ausgänge ziemlich groß werden.
Bei der Auswertung von y * f (y) bleibt die Anzahl der 1-Bits erhalten, wenn y eine Potenz von 2 ist, die größer als ein Koeffizient ist, was für den oben ausgewählten Wert zutrifft. Wir wählen y = 2 ^ (f (2)!), Um das Ergebnis injektiv zu machen:
quelle
Wolfram Language (Mathematica) , 61 Bytes
Probieren Sie es online!
Zwei positive Ganzzahlen können einer einzigen positiven Ganzzahl zugeordnet werden. Sei
a, b
zwei positive ganze Zahlen. Danna, b -> (2a - 1) 2^(b-1)
ist eine Bijektion von NxN nach N.Diese Funktion ermittelt die Position aller
1
Bits in der Eingabe (ab der Einerstelle) und wendet auf jede Position eine Nur-Injektions-Variante der obigen Zuordnung an. Dann wird jede resultierende Zahl zur Potenz von zwei erhöht, und alle Zahlen werden addiert (was in Ordnung ist, da wir eine injektive NxN -> N-Abbildung angewendet haben).Beispielsweise:
Inverse Funktion (124 Bytes)
Hier ist eine inverse Funktion zum Testen der Injektivität.
Probieren Sie es online!
quelle
Python 2 ,
118117114103100 Bytes100 Bytes von Jonathan Frech:
Probieren Sie es online!
103 Bytes mit einer Golfmöglichkeit 1
Probieren Sie es online!
-15 Bytes dank Jonathan Frech
Es wird eine Zahl erstellt, die zuerst die "Ein-Bits" und dann die unäre Darstellung des Arrays enthält, die als trinäre Zahl interpretiert wird.
Die Binärzahl wird erstellt, indem die Zahlen in binäre Zeichenfolgen (
0bNNN
) konvertiert und dann durch ersetztb
werden2
.1 Ich hätte 14 Bytes einsparen können, indem ich sie stattdessen in eine Zahl zur Basis 12 konvertierte, aber TIO verfügte nicht über genügend Speicher, sodass ich mich entschied, diese zu verwenden.
quelle
05AB1E , 14 Bytes
Probieren Sie es online!
Ergibt die gleichen Ergebnisse wie Dennis 'Jelly-Lösung, jedoch ist die Technik etwas anders.
Wie?
Versuchen wir die Eingabe
[1, 2, 3]
:quelle
Python 2 , 74 Bytes
Probieren Sie es online!
quelle
JavaScript 6,
9683 Bytesgibt einen binären Ausdruck aus
quelle
replace(/0|2/g,0)
scheint auch zu funktionieren, aber schwieriger zu dekodierenx=>(t=x.map(k=>(x[0]+=k)&&2+k.toString(2)).join``).replace(/2/g,'0'.repeat(t))
. Fühle mich okay, kann aber nicht beweisen