Es ist nicht so einfach, die als Ovale und Sticks gedruckten Binärwerte zu betrachten ... Um dies zu unterstützen, müssen Sie eine Funktion (oder ein Programm) schreiben, die Zahlen in einer benutzerdefinierten Binärdarstellung druckt.
Ich möchte also eine Zahl, z. B. 3 ( 00000011
), nehmen und die Bits in einem benutzerdefinierten Format ausgeben, beispielsweise mit durch Leerzeichen getrennten Paaren:
00 00 00 11
oder beispielsweise in umgekehrter Reihenfolge und mit einigen Dekorateuren, z.
11_00_00_00
Darüber hinaus muss es möglich sein, '0' und '1' als benutzerdefinierte Zeichen anzuzeigen, um sie besser unterscheiden zu können, z.
XX oo oo oo
Die Herausforderung besteht also darin, den Code zu schreiben, der dies alles innerhalb der folgenden Spezifikation tut.
Spezifikation
Die Funktion nimmt folgende Eingabe vor: f (A, Maske, Nullen, Einsen)
Parameter:
A - Eingangsnummer - eine beliebige (vorzeichenlose) Ganzzahl im Bereich von 0 bis 255.
mask - Ein String-Parameter, der den Aufbau der Ausgabe definiert.
Nullen - Eine Zeichenfolge mit derselben Länge definiert 'Null'-Glyphen für jeden Ausgangssteckplatz.
one - Eine Zeichenfolge mit der gleichen Länge definiert 'eine' Glyphe für jeden Ausgabeschlitz.
Regeln für die Ausgabekonstruktion:
Schauen Sie sich dieses Bild mit einem Beispiel genau an, um zu verstehen, wie die Ausgabe generiert wird:
Es werden also nur die einzelnen Ziffern in der Maske analysiert und durch entsprechende Bits von A ersetzt. Andere Zeichen bleiben unverändert . Wenn der Wert des aufgenommenen Bits 1 ist, wird es in der endgültigen Ausgabe als "X" angezeigt, und wenn es 0 ist, wird es als "o" angezeigt. Im obigen Beispiel sind alle vier genommenen Bits "1", so dass wir "X" in allen Slots sehen.
Wenn die Eingabenummer 128 wäre, wäre die Ausgabe logischerweise X foo bar ooo
. Zeichen in den Parametern "Nullen" und "Einsen": Bei allen druckbaren ASCII-Zeichen wird davon ausgegangen, dass sie immer an der Maske ausgerichtet sind.
Anmerkungen :
- Bits sind 0-indiziert: Das 0. Bit ist das MSB.
- Angenommen, die Ziffern 8,9 sind in der Maskenzeichenfolge nicht zulässig.
- Die Eingabezeichenfolgen enthalten alle druckbaren ASCII-Zeichen.
- 'Nullen' und 'Einsen' sind auf die Maske ausgerichtet.
- Für Sonderzeichen / Modifikatoren in Ihrer Sprache: Wir können davon ausgehen, dass sie nicht in der Eingabezeichenfolge angezeigt werden.
Weitere Informationen finden Sie in der Übersicht.
Eingabe -> Ausgabebeispiele
Geben Sie alle 8 Bits in gemeinsamer Reihenfolge mit einem Leerzeichen in gemeinsamer Oval-and-Stick-Notation aus:
mask = "0123 4567"
zeros = "0000 0000"
ones = "1111 1111"
A=1 -> 0000 0001
Ausgabe in umgekehrter Reihenfolge, in Strich-und-Glyphe-Notation:
mask = "| 7654 3210 |"
zeros= " ---- ---- "
ones = " ssss ssss "
A=1 -> | s--- ---- |
A=3 -> | ss-- ---- |
A=128-> | ---- ---s |
Verschiedene Notationen in einer Ausgabe, zB für gepackte Daten:
mask = "0 | 123 4567"
zeros= " --- ----"
ones = "X kkk ssss"
A= 15 -> | --- ssss
A= 16 -> | --k ----
A= 32 -> | -k- ----
A= 128 -> X | --- ----
A= 255 -> X | kkk ssss
Wiederholte Muster:
mask = "| 7 66 555 4444 |"
zeros= " . .. ... .... "
ones = " 0 00 000 0000 "
A= 0 -> | . .. ... .... |
A= 1 -> | 0 .. ... .... |
A= 2 -> | . 00 ... .... |
A= 3 -> | 0 00 ... .... |
A= 4 -> | . .. 000 .... |
Aktualisieren
Die Regeln wurden leicht vereinfacht - das Programm darf nur eine Nummer drucken (nicht Array / Liste von Nummern, wie es ursprünglich vorgeschlagen wurde).
A
tut, da es in allen Testfällen gleich istAntworten:
JavaScript (ES6), 57 Byte
Code-Snippet anzeigen
quelle
Ruby , 48 Bytes
Die Parameter Nullen und Einsen werden als Array (
*b
) behandelt und mit dem Parameter Nullenb[0]
und dem Parameter Einsen gespeichertb[1]
.Beim Maskenparameter
f
wird jede Ziffer (/\d/
) durch ein Zeichen aus dem entsprechenden Array ersetzt. Die spezielle Variable$`
, die den Text enthält, der zur aktuellen Übereinstimmung führt, wird hier (ab) verwendet, um die Position zu verfolgen.Rubys Bitindizierung ruft 0 das niedrigstwertige Bit auf, aber die Herausforderung nennt 0 das höchstwertige Bit. Die ASCII-Subtraktion von 55 (das Zeichen '7') ergibt einen verwendbaren Ruby-Bitindex.
Probieren Sie es online aus!
quelle
Perl 6 , 60 Bytes
quelle
Python, 97 Bytes
quelle
Mathematica, 131 Bytes
quelle
Length[x]
kann seinLength@x
und{#2,#3,#4}
kann sein{##2}
.StringJoin@@
kann nur seinStringJoin@
und#1
ist nur#
q / kdb +,
8664 BytesLösung:
Beispiele:
Erläuterung:
Ziehen Sie Indizes heraus, bei denen die Eingabemaske
M
eine Ziffer ist, und nennen Sie siem
hier. Hier werden wir die Eingabemaske ändern. Nehmen Sie die Ziffern aus der Zeichenfolge, wandeln Sie sie in Ganzzahlen um und indizieren Sie sie dann in unser 8-Bit-Array, um die richtige Reihenfolge zu erhalten. Verwenden Sie dieses 8-Bit-Array, um entwederO
(wenn 1 festgelegt ist) oderZ
(wenn 0 festgelegt ist) zu indizieren und dann an den durch angegebenen Indizes in diese Listen zu indizierenm
. Wenden Sie (:
) schließlich diese neue Liste auf die ursprüngliche Maske bei Indizes anm
.Anmerkungen:
Könnte weitere 14 Bytes sparen, wenn wir die Argumente in der folgenden Form angeben könnten:
[A;M;(Z;O)]
als q für 3 Argumente ermöglicht , ohne explizit genannt zu werden zu einer Funktion gegeben werden (sie sind
x
,y
undz
jeweils):quelle