Herausforderung
Ich habe mich vor kurzem mit 8-Bit-Computern beschäftigt und bin fasziniert von deren und anderen Funktionen. Ziel dieses Codegolfs ist es daher, einen Teil des Woz-Monitors zu kopieren, der von Steve Wozniak für den Apple I entworfen wurde.
Sie müssen ein Array mit 22 hexadezimalen Werten mit einer Breite von zwei Bytes (min. Wert $ 10 , max. Wert $ FF ) speichern und anschließend eine n- Anzahl von Eingaben eingeben. (Normalerweise zwei; Sprachen wie Brainfuck könnten es schwer haben).
Die Eingaben beziehen sich auf die Position im Array, von der aus der Druckvorgang gestartet werden soll, und auf die Position, an der angehalten werden soll. Bei einer Eingabe mit definiertem Verhalten ist der Startwert kleiner oder gleich dem Endwert. Ihr Programm muss dann in der Lage sein, jeden Hexadezimalwert zwischen und einschließlich der eingegebenen Hexadezimalwerte zu drucken.
Ein Beispiel dafür:
Array
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15
Values
FF F4 B6 D7 40 00 00 A4 F0 00 FF 0D 9C 21 65 C4 02 28 90 E7 D6 A5
input first num:
04
input second num:
14
40 00 00 A4 F0 00 FF 0D 9C 21 65 C4 02 28 90 E7 D6
Der interessante Teil dieser Übung besteht nun darin, dass Sie nach Belieben die Grenzen der Benutzereingaben überprüfen können. Personeneingaben hello
und Ihr Programm hat undefiniertes Verhalten? Es wird ohne Vorankündigung beendet? Sie sind beide gültig.
Die einzigen Regeln sind:
1. Sie müssen die Werte der 22 Hexadezimalwerte als Teil Ihres Programms angeben, bevor es gestartet wird (der Benutzer kann keine Eingaben anfordern).
2. Die Ausgabe der Hexadezimalwerte muss genau dem Format entsprechen:
00 FF 00 FF 00
Nachgestellte Leerzeichen, Tabulatoren oder Zeilen sind in Ordnung. Charaktere sind nicht.
3. Das Programm muss nicht mit einer Meldung nach den Eingaben fragen. Lassen Sie die "Nachricht" leer, wenn Sie möchten. Der Benutzer muss jedoch die Hex-Grenzen eingeben.
4. Wie bei den Werten der 22 Hexadezimalzahlen zu entscheiden ist, müssen Sie ein Programm erstellen, das die Werte tatsächlich aus dem Speicher abruft, anstatt ein Programm durch einfaches Drucken von Werten nachzuahmen . (wie eine Liste von $ 00 ).
5. n-Anzahl der Eingaben bezieht sich auf die Anzahl der Eingaben, die für die Sprache Ihrer Wahl erforderlich sind, um ein Hexadezimal mit einer Breite von zwei Bytes zu erkennen. z.B. (Brainfuck benötigt zwei Eingänge pro Hex, also vier für die beiden).
Fühlen Sie sich frei zu kommentieren, wenn Sie Klarstellung benötigen.
Dies ist Codegolf, daher ist die kürzeste Antwort in der Anzahl der Bytes der Gewinner.
Bestenliste
Hier ist eine Rangliste mit freundlicher Genehmigung von Martin Ender .
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
quelle
n
da Brainfuck keine 2-Zeichen-Zeichenfolge aufnehmen kann, müssten Sie das erste Byte, dann das zweite für den ersten Wert und dann das zweite für den zweiten Wert erneut eingeben, insgesamt 4 Eingaben. Sie können beliebig viele sein.Antworten:
Jelly ,
2421 BytesGewählte Werte:
[00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 1F 10 11 12 13 14 15]
TryItOnline
Wenn der zweite Eingang kleiner als der erste ist, wird die umgekehrte Reihenfolge ausgegeben.
Out-of-bounds-Verhalten ist undefiniert (z. B. "foo", "14" gibt 38 Werte zurück, von denen sich die meisten nicht einmal im Array befinden und viele nicht die Länge 2 haben)
Wie?
quelle
1F
), was bedeutet, dass ich die Hex-Eingaben nicht "richtig" interpretieren oder 16 addieren musste, um mir zwei Hex-Ziffern für die Rückkonvertierung zu geben.JavaScript (ES6),
1181151121028281 ByteDank ETHproductions 1 Byte gespart
Gewählte Werte:
0x04
/0x0f
).0x00
(Mindestwert) interpretiert .0x15
(Maximalwert) interpretiert .Vorherige Version (97 Bytes)
Generieren einer Pseudozufallsliste mit "wahren" Hexadezimalwerten:
Reihenfolge:
quelle
[a,b]=prompt().split(' ')
in der Kommandozeile nicht beschwert . Wie auch immer, meine aktualisierte Antwort sollte das beheben.JavaScript (ES6),
107 152137 BytesCode-Snippet anzeigen
Gewählte Werte:
Eingänge:
0x14
InternalError: too much recursion
NaN
für außerhalb der Grenzen gedruckt .Bisherige Lösungen:
152 Byte:
107 Bytes, ungültige Lösung (Eingaben fehlen):
quelle
console.log(...)
. ;)var
und die letzten;
sind nicht Teil der Antwort. Es ist nur für das Snippet, deshalb habe ich Zeilenumbruch hinzugefügt. Ich werde die Antwort bearbeiten.Python,
888786 Bytes1 Byte speichern dank @JonathanAllan
1 Byte speichern wieder zu @JonathanAllan
Auch die Basis des Codes geändert, jetzt viel schöner.
Gewählte Werte:
00
für alles.Gleiche Idee wie meine C-Antwort. Dieses Mal nimmt der Code jedoch eine einzelne Eingabe vom Benutzer entgegen, wobei ein Leerzeichen zwischen beiden Werten erforderlich ist. Teilen Sie diese auf, wandeln Sie sie in hexadezimale Werte um und drucken Sie jedes hexadezimale Zeichen im
l
Array, einschließlich und zwischen den beiden eingegebenen Werten. Da Python über ein hervorragendes System zum Auffinden von Fehlern verfügt, sind keine Pufferüberläufe vorhanden und der Code ist daher viel sicherer. Das Programm ist vor undefiniertem Verhalten in dem Sinne sicher, dass es nicht ausgeführt wird, wenn ein höherer Wert vor einem niedrigeren Wert übergeben wird.Dies sollte auf Python 2.x und 3.x funktionieren. Bitte korrigieren Sie mich, wenn ich falsch liege, da ich nicht auf beide Dolmetscher zugreifen kann, da mein System beide nicht unterstützt.
quelle
C ++,
989593 BytesMeine gewählten Werte sind alle Nullen
quelle
04
und06
nur zwei Werte zurückbekommen habe. Ich vermute, das sind die05
und06
Werte. Sie müssen alle Werte zwischen und einschließlich der eingegebenen Werte angeben.Perl,
794541 Bytes"min value $ 10" - das Beispiel hat mindestens $ 00 - ist das ein Tippfehler?
Hier ist eine ziemlich langweilige Perl-Antwort in 41 Bytes. Nimmt Eingaben in zwei Zeilen vor.
Die Daten sind eine Liste 04..1A
Vorher war ich zu schlau beim Packen und Auspacken. Die eingegebenen Bytes werden sofort zusammengefasst, z. B. "020E" gibt die 2.-14. Einträge aus
Könnte versuchen, es mehr mit allen Nullen zu spielen
substr
, undprintf'%*vX'
... nein, das macht meine Antwort länger. 48 Zeichen (unter Verwendung einer Zeichenfolge von ASCII '7', Hex 37 als Daten)quelle
CJam, 22 Bytes
Gewählte Werte:
Probieren Sie es online aus
quelle
Scala, 45 Bytes
Ungolfed:
Anwendungen
00
zuFF
als Werte, sondern Werke bis zu 2147483647.quelle
error: ')' expected but string literal found.
ata.to(b).map(
C,
176175161 Bytes1 Byte sparen dank @JonathanAllan
Massive Hilfe dank @Downvoter für das Speichern von 14 Byte!
Probieren Sie es online!
Gewählte Werte:
00
für alles.Antwort ohne Golf:
Der Trick dabei ist, zwei Eingaben aufzunehmen und zu versuchen, sie in hexadezimale Zeichenfolgen umzuwandeln und dann in Ganzzahlen umzuwandeln. Da es keine Fehlerprüfung oder ähnliches gibt, wirft undefiniertes Verhalten einfach Fehler und bricht das Programm ab. Der Benutzer muss zwei Eingaben eingeben, mein Eclipse CDT-Compiler scheint jedoch zuzulassen, dass ich beide in derselben Zeile mit einem Leerzeichen dazwischen eingebe.
Sie müssen in der richtigen Reihenfolge vorliegen, da das Anfordern eines größeren Werts, bevor ein kleinerer Wert die
while
-loop überhaupt nicht ausführt.Die Sache ist, dass es auch keinen Pufferüberlaufschutz gibt, so dass ich einfach etwas Absurdes wie einen Bereich von $ 0 bis $ FFFF anfordern kann und von Beginn der Speicherzuweisung für das
a[44]
Array an alles in den Speicher meines Computers bekomme bis zu 65536 Werten später.quelle
%x
direkt verwenden?char s[2]
statt desmalloc
Zeugs benutzen ?malloc
Der Rückgabewert von Casting ist in C sowieso nicht erforderlich.printf("%d%d ", ...)
Teil sprechen , indem Sie die Formatierung durch einfach%x
nur0
"s" anstelle von00
"s" ersetzen und diese nicht ausräumen .scanf
.GNU sed, 209 + 1 (r Flag) = 210 Bytes
Probieren Sie es online!Ein führendes Leerzeichen ist in der Ausgabe vorhanden, ich hoffe, es ist zulässig.
Beispiele ausführen:
Erläuterung: Die 22 gespeicherten Hexadezimalwerte stimmen mit denen aus dem OP-Beispiel überein
Der Start- und der Endindex werden in separaten Zeilen gelesen. Die Ausgabe ist eine einzelne Zeile mit den Tabellenwerten in diesem Indexbereich (einschließlich). Nicht definierte Eingaben schreiben mehrere Zeilen mit ungültiger Ausgabe.
quelle
PHP,
106 105 10496 + 2 Bytesoder
Laufen mit
php -nr '<code>' <lowindex> <highindex>
; Entfliehen Sie den einfachen Anführungszeichen im Code.... oder online testen .
dechex
interpretiert Eingaben als hexadezimale Zeichenfolgen, sofern es sich bei den Zeichen um Hexadezimalziffern handelt,0
sofern es sich bei den sofern die Eingabe mit etwas anderem beginnt.Gibt nichts aus, wenn der erste Wert größer als der zweite ist.
gewählte Werte:
(die ersten 22 ASCII-Codes des ausgeführten Codes)
oder
mit diesen Werten:
quelle
<?php
Block?-r
. Und wenn ich es in einer Datei speichern muss, verwende ich das kurze offene Tag<?
.a
,z
undProgramingPuzles_CGolf
sind undefiniert. Woher kamenProgramingPuzles_CGolf
sie überhaupt? : /stderr
zu,/dev/null
wenn Sie sie nicht mögen. PHP wertet die undefinierten Konstanten zu Strings aus.Apple II 6502-Assembly, 75 Byte
Byte-Code:
Demontage:
Es bildet ein Array im Speicher, das der Ausgabe ähnelt. Die gewählten Werte sind:
Der Benutzer drückt vier Tasten, um die Eingaben festzulegen.
quelle