Hinweis: Die erste Hälfte dieser Herausforderung stammt von Martin Enders vorheriger Herausforderung, Visualize Bit Weaving .
Die esoterische Programmiersprache evil hat eine interessante Operation für Bytewerte, die sie "Weben" nennt.
Es ist im Wesentlichen eine Permutation der acht Bits des Bytes (es spielt keine Rolle, von welchem Ende aus wir zu zählen beginnen, da das Muster symmetrisch ist):
- Bit 0 wird nach Bit 2 verschoben
- Bit 1 wird nach Bit 0 verschoben
- Bit 2 wird nach Bit 4 verschoben
- Bit 3 wird nach Bit 1 verschoben
- Bit 4 wird nach Bit 6 verschoben
- Bit 5 wird nach Bit 3 verschoben
- Bit 6 wird nach Bit 7 verschoben
- Bit 7 wird nach Bit 5 verschoben
Der Einfachheit halber sind hier drei weitere Darstellungen der Permutation. Als Zyklus:
(02467531)
Als Zuordnung:
57361402 -> 76543210 -> 64725031
Und als Liste von Paaren des Mappings:
[[0,2], [1,0], [2,4], [3,1], [4,6], [5,3], [6,7], [7,5]]
Nach dem 8
Weben wird das Byte im Wesentlichen zurückgesetzt.
Zum Beispiel wird das Weben der Zahl 10011101
(die sich 157
in der Basis 10 befindet) ergeben 01110110
(die sich 118
in der Basis 10 befindet).
Eingang
Es gibt nur 256
gültige Eingaben, nämlich alle ganzen Zahlen zwischen 0
und255
einschließlich. Dies kann in jeder Basis angenommen werden, muss aber konsistent sein und Sie müssen es angeben, wenn die von Ihnen gewählte Basis nicht die Basis zehn ist.
Sie dürfen Ihre Eingaben nicht auf Null setzen.
Ausgabe
Sie sollten das Ergebnis des Bitwebens in einer beliebigen Basis ausgeben, die auch konsistent sein und angegeben werden muss, wenn nicht die Basis zehn.
Sie können Ihre Ausgänge auf null setzen.
Siehe auch: Visualize Bit Weaving
quelle
Antworten:
Python 2.7,
44-> 36 Bytesquelle
|
anstelle von+
und mask nach dem Verschieben verwenden, können Sie 8 Bytes durch Entfernen von Klammern rasieren.<strike></strike>
Ihres alten Bytewertes den Fortschritt anzeigen können :-)Böse, 3 Zeichen
Probieren Sie es online!
Die Eingabe erfolgt in der Basis 256 (z. B. ASCII). Um z. B. die Ziffer 63 einzugeben, geben Sie ASCII 63 ein
?
.Erläuterung:
Das fühlt sich so an, als würde man betrügen.
quelle
CJam,
1512 BytesVielen Dank an FryAmTheEggman für die Einsparung von 3 Bytes.
Eingabe in Basis 2. Ausgabe auch in Basis 2, mit Nullen auf 8 Bit aufgefüllt.
Teste es hier.
Erläuterung
quelle
MATL , 14 Bytes
Die Eingabe erfolgt dezimal. Die Ausgabe ist binär mit Nullen aufgefüllt.
Probieren Sie es online!
Erläuterung
quelle
Jelly, 11 Bytes
Übersetzung von Martins CJam-Antwort. Probieren Sie es hier aus.
quelle
JavaScript (ES6), 30 Byte
quelle
J, 12 Bytes
Verwendet das eingebaute Permut
A.
mit dem Permutationsindex,6532
der der Bitweboperation entspricht.Verwendung
Die Eingabe ist eine Liste von Binärziffern. Die Ausgabe ist eine mit Nullen aufgefüllte Liste mit 8 Binärziffern.
Erläuterung
quelle
Retina , 39 Bytes
Eingabe und Ausgabe in Basis 2, Ausgabe wird links aufgefüllt.
Probieren Sie es online!
Erläuterung
Dies füllt die Eingabe nur links mit Nullen auf. Das
+
zeigt an, dass diese Phase wiederholt wird, bis sich die Zeichenfolge nicht mehr ändert. Es stimmt mit dem Anfang der Zeichenfolge überein, solange weniger als 8 Zeichen enthalten sind, und fügt ein0
an dieser Position ein ein.Nun zur eigentlichen Permutation. Die einfache Lösung lautet wie folgt:
Das ist jedoch schmerzhaft lang und überflüssig. Ich habe eine andere Formulierung der Permutation gefunden, die in Retina viel einfacher zu implementieren ist (
X
repräsentiert einen Austausch benachbarter Bits):Das ist jetzt viel einfacher zu implementieren:
Dies vergleicht einfach zwei Zeichen und tauscht sie aus. Da sich Übereinstimmungen nicht überlappen, werden alle vier Paare getauscht.
Jetzt wollen wir dasselbe noch einmal machen, aber wir wollen das erste Zeichen überspringen. Am einfachsten ist es, wenn Sie festlegen, dass die Übereinstimmung nicht an einer Wortgrenze mit beginnt
\B
.quelle
x86-Maschinencode, 20 Byte
In hex:
Es ist eine Prozedur, die Eingaben vornimmt und Ergebnisse über das AL-Register zurückgibt
Demontage
quelle
C (unsicheres Makro), 39 Bytes
C (Funktion), 41 Bytes
C (volles Programm), 59 Bytes
(Rückgabe über Exit-Code, also mit aufrufen
echo "157" | ./weave;echo $?
)C (normenkonformes Vollprogramm), 86 Byte
C (normenkonformes Vollprogramm ohne Compiler-Warnungen), 95 Byte
C (normenkonformes Vollprogramm ohne Compiler-Warnungen, die aus Argumenten oder stdin gelesen werden können und Fehler- / Bereichsprüfung enthalten), 262 Byte
Nervenzusammenbruch
So ziemlich das Gleiche wie bei vielen vorhandenen Antworten: Verschieben Sie alle Bits mit
<<2
(*4
),<<1
(*2
),>>1
(/2
) und>>2
(/4
) an die richtige Stelle|
alles zusammen.Der Rest ist nichts anderes als verschiedene Geschmacksrichtungen der Kesselplatte.
quelle
Mathematica, 34 Bytes
Anonyme Funktion. Nimmt eine Liste von Binärziffern und gibt eine gepolsterte Liste von 8 Binärziffern aus.
quelle
PowerShell v2 +, 34 Byte
Übersetzung der Antwort von @ LegionMammal978 . Volles Programm. Übernimmt die Eingabe über das Befehlszeilenargument als Binärzahl, gibt sie als binäres Array aus und wird mit Nullen aufgefüllt.
Der
"{0:D8}"-f
Teil verwendet Zeichenfolgen im numerischen Standardformat ,0
um der Eingabe voran zu stellen$args
. Da der-f
Operator die Verwendung eines Arrays als Eingabe unterstützt und wir ausdrücklich die Verwendung des ersten Elements angegeben haben{0:
, müssen wir nicht das Übliche tun$args[0]
. Wir kapseln diesen String in Parens und indizieren ihn dann[1,3,0,5,2,7,4,6]
mit dem Weben. Das resultierende Array verbleibt in der Pipeline und die Ausgabe ist implizit.Beispiele
(Die Standardeinstellung
.ToString()
für ein Array hat das Trennzeichen als`n
. Deshalb wird die Ausgabe hier durch Zeilenumbrüche getrennt.)quelle
Matlab,
494844 BytesÜbernimmt die Eingabe als Zeichenfolge von Binärwerten. Ausgabe gepolstert. 4 Bytes gespart dank @Luis Mendo.
Erläuterung:
quelle
V , 17 Bytes
Probieren Sie es online!
Dies nimmt die Ein- und Ausgabe in Binärform vor. Der größte Teil der Byteanzahl stammt aus dem Auffüllen mit Nullen. Wenn das Auffüllen der Eingabe erlaubt wäre, könnten wir einfach Folgendes tun:
Dank Martins Lösung für das Austauschen von Zeichen, zB:
Erläuterung:
quelle
05AB1E,
1412 BytesErläuterung
Die Eingabe erfolgt in Basis 10.
Ausgabe erfolgt in Basis 2.
Leiht den Permutationstrick aus MartinEnders CJam-Antwort
Probieren Sie es online aus
quelle
Pyth, 19 Zeichen
Eingang und Ausgang sind Basis 2.
Weit entfernt von einem Pyth-Experten, aber da noch niemand anders geantwortet hat, habe ich es ausprobiert.
Erläuterung:
quelle
Labyrinth ,
2726 BytesEin- und Ausgabe in Basis 2. Die Ausgabe ist gepolstert.
Probieren Sie es online!
quelle
UGL , 50 Bytes
Probieren Sie es online!
Div-Mod wiederholt durch 2, und dann
%
tauschen und@
rollen, um sie in der richtigen Reihenfolge zu erhalten.Eingabe in Basis zehn, Ausgabe in Basis zwei.
quelle
vi, 27 Bytes
Wo
<ESC>
steht das Escape-Zeichen? E / A ist binär, Ausgang ist gepolstert. 24 Bytes in vim:quelle
<ESC>
braucht Backticks um ihn herum. Ich würde bearbeiten, aber ich kann nicht herausfinden, 4 weitere Bytes zu ändern ...Eigentlich 27 Bytes
Probieren Sie es online!
Dieses Programm führt die Ein- und Ausgabe als Binärzeichenfolge durch (die Ausgabe ist auf 8 Bit aufgefüllt).
Erläuterung:
quelle
JavaScript, 98 Bytes
Die Eingabe erfolgt in der Basis 2 als Zeichenfolge, die Ausgabe erfolgt ebenfalls in der Basis 2 als Zeichenfolge
quelle