In dieser Herausforderung erhalten Sie eine Eingabe, wandeln sie in Hexadezimalwerte um, nehmen einige Änderungen vor und geben das Ergebnis aus.
Da es sich nur um 16 hexadezimale Zeichen handelt, muss Ihr Code so kurz wie möglich sein.
Beispiele
Beispiele werden durch eine Leerzeile getrennt. Die erste Zeile wird eingegeben, die zweite Zeile zeigt die Schritte, die dritte Zeile zeigt die Ausgabe
234589
234589 -> 3945D -> 39454 -> 9A1E -> 9115 -> 239B -> 2392 -> 958
958
435234
435234 -> 6A422 -> 61422 -> EFEE -> 5655 -> 1617
1617
153
153 -> 99 -> 99 -> 63
1617
Schritte
Die Eingabe ist immer eine positive Ganzzahl
Um die Ausgabe zu generieren, gehen Sie folgendermaßen vor:
- Konvertieren Sie die Eingabe in hexadezimal
- Ersetzen Sie alle Buchstaben mit ihrem Index im Alphabet (zB
a -> 1, b -> 2
) - Konvertieren Sie das Ergebnis zurück in hexadezimal
- Wenn das Ergebnis Buchstaben enthält, fahren Sie mit Schritt 2 fort. Wenn nicht, geben Sie das Ergebnis aus
Das ist Code-Golf, also gewinnt der kürzeste Code in Bytes!
code-golf
math
number
base-conversion
hexadecimal
Downgoat
quelle
quelle
749699 -> B7083 -> 27083 -> 69CB -> 6932 -> 1B14 -> 1214 -> 4BE -> 425 -> 1A9 -> 119 -> 77
Antworten:
Jelly , 18 Bytes
Probieren Sie es online!
Die binäre 18-Byte-Version des Quellcodes enthält den xxd-Dump
und arbeitet mit dieser Version des Jelly-Interpreters .
Wie es funktioniert
Ḍ
(decimal-to-integer) hätte als Abkürzung für funktionieren sollenḅ⁵
, aber die neueste Version von Jelly zum Zeitpunkt dieses Beitrags hatte einen Fehler, der mich daran hinderte, sie zu verwenden.quelle
JavaScript ES6,
98926764 Bytes3 Bytes dank @Downgoat eingespart, 3 weitere dank @ user81655
Es wurde eine viel, viel kürzere Version gefunden, die die Schleife für die Rekursion überflüssig macht:
Der wahrscheinlich interessanteste Teil dieses Programms ist die
replace
Funktion:Testschnipsel
(von hier genommen )
quelle
.toString(16)
:x=>eval("for(x=(j=n=>n.toString(16))(x);/\\D/.test(x);)x=j(+x.replace(/\\D/g,z=>+('0x'+z)-9))")
. Es könnte auch ein paar Bytes mit Rekursion sparen.replace
vor dem Auswerten eine an der Saite ausprobiert , aber das stellte sich länger heraus.h=
CJam,
2119 BytesTeste es hier.
Erläuterung
Ein sehr seltener Fall von negativen Modulo-Ergebnissen ist hilfreich. :)
quelle
Rubin, 35 + 1 = 36
p
Führen Sie mit dem Befehlszeilenflag ausErläuterung:
Das Flag -p erstellt eine Schleife, in der die Eingabe und die eventuelle Ausgabe in der Variablen gespeichert werden
$_
.'%x'
hat die Hex - Konvertierung undtr!
hat die Ziffer Substitution und gibt einen Falsey Wert , wenn es nichts zu ändern war. Wiederholen beginnt von vorne mit dem neuen$_
.quelle
Julia,
7874 BytesDies ist eine rekursive Funktion, die eine Ganzzahl akzeptiert und eine Zeichenfolge zurückgibt.
Ungolfed:
quelle
MATL , 23
25BytesHaftungsausschluss
Während ich diese Antwort schrieb, bemerkte ich einen Fehler in der
dec2base
Funktion von MATL , korrigierte ihn und veröffentlichte eine neue Version mit der Korrektur (sowie ein paar andere akkumulierte, nicht verwandte Änderungen) .Da ich eine Version verwende, die später als diese Herausforderung ist, ist diese Antwort laut Meta-Konsens nicht gewinnberechtigt .
Code
Beispiel
Erläuterung
quelle
Dyalog APL,
373633 BytesDanke an Adám und ngn für die Vorschläge. Ich behalte
16⊥⍣¯1⊢⍵
stattdessen⍵⊤⍨⍴⍨16
- es ist ein zusätzliches Byte, aber erlaubt uns, mit Zahlen von beliebiger Größe anstatt 64-Bit zu arbeiten.quelle
{∧/9≥X←16⊥⍣¯1⊢⍵:10⊥X⋄∇10⊥10|X+9<X}
10⊥10|X+10≤X
->10(⊣⊥|+≤)X
(technisch nicht äquivalent, funktioniert aber für16⊥⍣¯1⊢⍵
->⍵⊤⍨⍴⍨16
Python,
118105 Bytesquelle
PHP,
14012612211411287 oder 84 Bytes (einschließlich-r
)Ich bin mir nicht ganz sicher, wie die Regeln dafür aussehen, da dies mein erster Codegolfversuch ist, aber der Code kann
php -r
ohne<?
und ausgeführt werden?>
Code
Formatiert
Alternativer Code (mit argv anstelle von stdin)
Formatiert
Anmerkungen
Edit 1: Ich habe einen Aufruf zum
intval()
Speichern von 14 Zeichen abgeschnitten, da PHP numerische Zeichenfolgen gerne als Zahlen behandelt.Bearbeiten 2: Ich habe
\n
die Ausgabe entfernt, die ich nach dem Testen vergessen habe, und die Anführungszeichen aus dem endgültigen Echo entfernt, um insgesamt 4 Zeichen zu speichern.Bearbeiten 3: Entfernt der letzte Aufruf
intval()
Bearbeiten 4: Saved 2 Bytes durch Anführungszeichen aus der regex Zeile entfernen
Edit 5: Geänderte
[a-f]
zu\D
3 Zeichen zu speichern, entferntstrval
Anruf vonpreg_replace
8 mehr; hinzugefügte Version, dieargv[]
anstelle von STDIN verwendet, hat den Schleifenabschluss in die while-Anweisung verschoben (oops!) und 11 weitere Zeichen gespart und den Dechex-Aufruf in densubject
Teil von verschobenpreg_replace
für weitere 3 ergibt sich eine Summe von 25; Außerdem wurde eine Nicht-Standard-Version als alternative Version hinzugefügt, die 3 Zeichen weniger verwendet. Danke für die Hilfe, @Blackholequelle
-r
Option). Aber ein Lead;
ist immer kürzer als ein Lead?>
, also vergiss es nicht. Hier ist übrigens ein kürzerer Code:for($a=$argv[1];$b!=$a;)$a=preg_replace('#\D#e','ord($0)-96',$b=dechex($a));echo$b;
(-29 Bytes).153
sollte geben63
, nicht99
. Ist-r
aber kostenlos. (siehe codegolf.meta.stackexchange.com/a/2428/55735 )R ,
106103102 Bytes-3 Bytes mit
if
anstelle vonwhile
-1 Byte dank Giuseppe mit
as.double
anstelle vonas.integer
Probieren Sie es online!
Fügen Sie einfach
a(your_integer_here)
den TIO hinzu, um das Ergebnis zu sehen.Ich habe die Funktion mithilfe der Rekursion erneut auf jede nachfolgende Iteration angewendet, unter der Bedingung, dass keiner der Buchstaben 'abcdef' in der Zeichenfolge gefunden wird. Wenn diese Bedingung "False" ist, wird das Ergebnis als Zeichenfolge ausgegeben. Der beste Teil war meine Entdeckung der
chartr
Funktion, die es mir ermöglicht, Elemente mit entsprechenden Elementen in einem String zu tauschen. Diese Zeichenfolge stammt von der Funktion, die das Hexadezimal in ein Zeichenfolgenformat umwandelt.Bearbeiten: Ich habe versucht,
sprint("%x",y)
anstelle von zu verwendenas.hexmode(as.double(y))
, aber ich muss immer nochas.double
irgendwo im Code verwenden, der21 Byte länger war.quelle
as.double
ist kürzer alsas.integer
05AB1E , 12 Bytes
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
ÐþQ
könnte alternativD.ï
(D
: Duplicate.ï
;: is_int?) für die gleiche Byteanzahl sein.quelle
[hÐþQ#Au₂L‡
funktioniert leider nicht immer. Die Aufforderung lautet, zuerst und dann in jeder Iteration in Hex umzuwandeln. Wenn ich Ihren Code in meine Testsuite einfüge, sind die ersten drei Testfälle korrekt, aber die letzten beiden schlagen fehl.C # (Visual C # Interactive Compiler) , 92 Byte
Probieren Sie es online!
Weniger Golf Code:
quelle
Mathematica, 107 Bytes
Ich kann mir keine weiteren Möglichkeiten zum Golfen vorstellen ...
quelle
Mathematica, 80 Bytes
Dies verwendet einen ordentlichen Trick für while-Schleifen, die ich aus Alephalpha gelernt habe. Das
//.
ist "Wende diese Substitutionsregel so oft wie möglich an". Dann verwenden wir ein Muster,l_/;Max@l>9
das nur dann zutrifft, wenn die hexadezimale Ziffernliste noch Ziffern enthält, die größer als 9 sind.quelle
Japt,
45 bis40 BytesBasierend auf meiner Antwort von JS:
Ziemlich erbärmlich für eine Golfsprache, oder? Es scheint eine Menge Leute zu geben, die bei dieser Herausforderung bemerken, dass ihre Dolmetscher Fehler haben, und ich gehöre jetzt dazu. Dies sollte in 30 Bytes oder weniger möglich sein, aber ein Fehler macht dies unmöglich.
Dadurch wird eine Funktion erstellt
H
, die folgendermaßen aufgerufen werden kann:Alternativ ist hier ein vollständiges Programm, das Eingaben von STDIN entgegennimmt:
Probieren Sie es online!
quelle
GNU Sed (mit eval extension), 44
Ich wünschte, ich
sed
würde erlaubeny/A-F/1-6/
. Aber das tut es nicht.quelle
Python 3,
10189 BytesInsgesamt ist dies der Lösung von Boomerang ziemlich ähnlich , es werden jedoch einige unterschiedliche Ansätze für verschiedene Aspekte verwendet.
Dies ist die erweiterte Version meines Originalcodes:
Dank @pacholik wurden 11 Bytes verloren (wobei die Innereien der
join
durch eine einzige Operation ersetzt wurden, die sowohl für Ziffern als auch für Buchstaben funktionierte). Ein weiteres Byte wurde abgeschnitten, indem dasjoin
durch einen Trick zum Schneiden von Strings ersetzt wurde, der mich in einem Moment der Glühbirne getroffen hat (der aber bereits in den Python-Golftipps vorhanden ist , wenn auch unter einer Überschrift, die Python 2 angibt).quelle
join
kann bis gekürzt werdenstr(ord(c)%12)for c in n
.Java, 201 Bytes
quelle
Japt , 21 Bytes
Probieren Sie es online!
Eine signifikante Verbesserung gegenüber der bestehenden Japt-Antwort. Es geht nicht um den
153 -> 63
in einem Kommentar vorgeschlagenen Fall, aber keine der anderen Antworten scheint es auch zu geben.Die Ausgabe als Liste mit Dezimalstellen kann dahingehend geändert werden, dass eine Dezimalzahl für 1 Byte ausgegeben wird
Erläuterung:
quelle
APL (NARS) 104 Zeichen, 208 Byte
Prüfung:
Ich weiß nicht, ob es in Ordnung ist ... Möglicherweise reicht es nicht für die Standardqualitätsantwort ...
quelle
Im Ernst, 42 Bytes
Hex Dump:
Probieren Sie es online aus
Es muss einen kürzeren Weg als diesen geben, aber das ist, was ich bekommen habe ... (Hier möchte ich
W
tatsächlich auftauchen, da es kürzer ist, ein;
Rechts vor dem letzten zu setzen, wenn Sie es NICHT wollen als um einX
nach JEDEM zu setzenW
. HierW
würde es drei Bytes sparen , wenn man Pop anstelle von Peek hat.)quelle
Japt, 18 Bytes
Versuch es
quelle
PHP, 71 Bytes
Laufen Sie als Pipe mit
-nR
oder probieren Sie es online aus .Gibt eine Warnung für einige Eingaben in PHP 7.1 und höher aus. ersetzen
-
mit!=
zu reparieren.Gibt eine weitere Warnung in PHP 7.2 aus; setzen
abcdef
in Anführungszeichen zu beheben.quelle