0xUsernames
Es gibt so viele Leute, die einen Nachrichtendienst nutzen, dass ihnen der Speicherplatz ausgeht, um alle Benutzernamen zu speichern! Um dies zu beheben, werden die Benutzernamen nach Möglichkeit hexadezimal gespeichert.
Wenn ein Benutzername nur aus Zeichen besteht 0123456789ABCDEF
(ohne Berücksichtigung der Groß- und Kleinschreibung), kann er in ein Hexadezimalzeichen konvertiert und als Ganzzahl gespeichert werden. Beispielsweise kann der Benutzername ba5eba11
als 0xBA5EBA11
hexadezimale Ganzzahl interpretiert werden .
Aber was ist mit 05AB1E
? Das hat eine führende Null, die verloren gehen würde. Wenn wir also einen Benutzernamen konvertieren, müssen wir a voranstellen, 1
bevor wir ihn als Ganzzahl lesen.
Die Herausforderung
Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die bei einem nicht leeren Benutzernamen als Zeichenfolge den Benutzernamen hexadezimal komprimiert:
- Wenn es als hexadezimale Ganzzahl interpretiert werden kann, stellen Sie eine 1 voran, interpretieren Sie es als hexadezimal und geben Sie das Ergebnis als Basis 10 aus.
- Andernfalls geben Sie einfach die Zeichenfolge unverändert zurück.
Das ist Code-Golf , also gewinnt die kürzeste Lösung (in Bytes)! Eingebaute Basisumwandlungsfunktionen sind zulässig.
Testfälle
Sie können davon ausgehen, dass sich alle resultierenden Ganzzahlen innerhalb des Standard-Ganzzahlbereichs Ihrer Sprache befinden.
Wie bei Benutzernamen auf den meisten Nachrichtensystemen enthalten die Eingabezeichenfolgen nur alphanumerische Zeichen und Unterstriche.
Denken Sie daran, dass Sie 1
vor der Konvertierung immer einen Lead hinzufügen müssen !
"ba5eba11" -> 7421737489
"05AB1E" -> 17148702
"dec0de" -> 31375582
"Beef" -> 114415
"da7aba5e" -> 7960443486
"500" -> 5376
"DENNIS" -> "DENNIS"
"Garth" -> "Garth"
"A_B_C" -> "A_B_C"
"0x000" -> "0x000"
Als Referenz ist hier eine Python 3-Implementierung, die ich für die Testfälle verwendet habe (ungolfed):
import re
def convert_name(name):
if re.fullmatch('^[0-9A-Fa-f]+$', name):
return int('1' + name.upper(), base = 16)
else:
return name
Antworten:
05AB1E , 4 Bytes
Erläuterung
Wenn die Eingabe ungültige hexadezimale Zeichen enthält,
H
wird nichts übertragen, sodass der letzte Wert auf dem Stapel die duplizierte Eingabe ist. Aus diesem Grund druckt das Programm die Eingabe bei ungültiger Eingabe.Probieren Sie es online!
quelle
05AB1E
ist ein gültiger Benutzername.JavaScript (ES6), 15 Byte
Wie es funktioniert
'0x1'+s
konvertiert die Eingabe in eine Literal-Hexadezimalzeichenfolge mit vorangestelltem1
, z0x105ab1e
. Dann-0
wandelt das Ergebnis in einer Reihe. JavaScript sieht das0x
am Anfang und versucht implizit, von hexadezimal zu konvertieren. Wenns
keine hexadezimalen Zeichen enthalten sind, wird dies zurückgegebenNaN
. Da dies falsch ist (und die Ausgabe0
aufgrund des vorangestellten Werts niemals möglich ist1
), können wir die||s
Rückgabe verwenden,s
wenn die Hex-Konvertierung fehlgeschlagen ist.Testschnipsel
quelle
Python 2 , 44 Bytes
Nimmt Eingaben in Anführungszeichen. -2 Bytes dank Rod!
Da wir garantieren, dass die Eingabe nur alphanumerische Zeichen und Unterstriche enthält, gibt es keine
0x1
andere Möglichkeit, gültiges Python zu erstellen, als eine hexadezimale Zeichenfolge. Wenn es sich bei der Eingabe um etwas anderes handelt, wird der Fehler ignoriert und so gedruckt, wie er ursprünglich war.Ich konnte ein Regex-Match nicht kürzer machen als
try/except
. In der Tat stellte sich heraus, dass Regex furchtbar wortreich war:quelle
a=int('1'+a,16)
durchexec'a=0x1'+a
(wahrscheinlich müssen testen)"+input()"
.()
uminput()
Perl 6 , 19 Bytes
Probier es aus
Erweitert:
quelle
Perl, 27 Bytes
-1 Byte dank @ardnew .
26 Byte Code +
-p
Flag.Geben Sie den Eingang ohne letzte Zeile ein. Mit
echo -n
zum Beispiel:Erläuterung
Dies ist ziemlich einfach: Es
/[^0-9a-f]/i
ist wahr, wenn die Eingabe ein anderes Zeichen enthält als das, das in hexadezimalen Zahlen zulässig ist. Wenn es falsch ist$_
(was die Eingabe enthält), wird es auf den konvertierten Wert gesetzt (die Konvertierung wird vom eingebauten System durchgeführthex
).Und
$_
wird dank-p
Flagge implizit gedruckt .quelle
$_=hex"1$_"if!/[^0-9a-f]/i
Pyth - 9 Bytes
Gleiche Idee wie die Antwort von Fliptack . Versuchen Sie eine Hexadezimal-Dezimal-Konvertierung, andernfalls wird die Eingabe ausgegeben.
Probieren Sie es hier aus!
quelle
Batch, 33 Bytes
Wie es funktioniert
Eine Zeichenfolge wird als Argument übergeben, ihr wird eine 1 vorangestellt, und die Zeichenfolge wird implizit in eine Dezimalzahl konvertiert und gedruckt. Wenn die Zeichenfolge nicht hexadezimal gültig ist, wird sie einfach angezeigt.
Da die Batch-Mathematik vorzeichenbehaftete 32-Bit-Ganzzahlen verwendet, ist der größte zulässige Benutzername
FFFFFFF
.cmd /c
Nimmt den nächsten Befehl entgegen, führt ihn in einem neuen Terminal aus und beendet ihn.set /a
Führt eine Berechnung durch und zeigt das Ergebnis implizit als Dezimalzahl an, wenn es nicht in einer Variablen gespeichert ist.0x1%1
Tellset stellt dem ersten Argument eine 1 voran (dies ist einfach, da alle Stapelvariablen Zeichenfolgen sind) und gibt an, dass die Zeichenfolge als hexadezimal behandelt werden soll.2>nul
entfernt alle Fehler, die aus einer ungültigen Hexadezimalzahl resultieren||
ist ein logisches ODER und führt den Befehl auf der rechten Seite aus, wenn der Befehl auf der linken Seite nicht erfolgreich ist. Die Klammern machen alles bis zu diesem Punkt zu einem Befehl.echo %1
zeigt einfach das erste Argument an.quelle
Common Lisp, 71
Tests
Funktion definieren
Zitieren Sie eine Liste der erwarteten Eingaben, wie in der Frage angegeben:
Analysiere es und sammle Ergebnisse
Überprüfen Sie, ob die erwarteten Ausgaben mit den tatsächlichen übereinstimmen:
quelle
C 108 Bytes
Dies ist eine Funktion, die die Zeichenfolge als Argument verwendet und das Ergebnis an STDOUT ausgibt.
quelle
int
:)JavaScript:
4641 Bytesquelle
/[^0-9a-f]/i
0-9
indem ich durch ersetzt habe\d
, 3 Byte durch Hinzufügen des Flags ohne Berücksichtigung der Groß- / Kleinschreibung (danke @GilZ) und 2 weitere Byte durch EntfernenF=
, was nicht benötigt wird. Danke für den Vorschlag.PHP, 42 Bytes
hex2bin () gibt false zurück, wenn die Eingabe keine gültige Hex-Zeichenfolge ist. Dies ist kürzer als die Verwendung von Regex, um nach nicht hexadezimalen Ziffern zu suchen, aber wir benötigen den @ -Operator, da er nicht stumm ist, wenn er fehlschlägt.
quelle
hex2bin
schlägt fehl für Saiten mit ungeraden Längen. Noch zwei Bytes kürzer als beipreg_match
obwohl:<?=@hex2bin($s=$argv[1])|@hex2bin($s.a)?hexdec("1$s"):$s;
für 57 Bytes.Bash,
463531 BytesSpeichern Sie als Skript und übergeben Sie den Benutzernamen als Argument.
quelle
Python 2 -
63,52,5046 BytesDies verwendet Python's
int()
, das jeden String mit der entsprechenden Basis in Basis 10 konvertiert. In diesem Fall ist der String die Nummer 1, die an die Eingabe angehängt ist. Wenn die Eingabe ungültig ist (andere Zeichen als0123456789ABCDEF
(ohne Berücksichtigung der Groß- / Kleinschreibung)), wird Folgendes zurückgegebenValueError
:Probieren Sie es hier aus!
Vielen Dank an @FlipTack für die Einsparung von 15 Bytes!
quelle
Ruby,
4744 BytesIch könnte 3 Bytes entfernen, indem ichputs
fürp
ändere, aber ich glaube, dass die Ausgabe als falsch betrachtet würde, da sie am Ende eine neue Zeile hat.Edit: Changed
puts
fürp
schlepp newlines typischerweise akzeptiert werden, dank @Mego.quelle
Japt , 11 Bytes
Probieren Sie es online!
Ein grosses Dankeschön an ETHproductions!
quelle
Dyalog APL , 37 Bytes
Verwendet keine eingebaute Validierung oder Hex-Dec-Konvertierung. Benötigt,
⎕IO←0
was auf vielen Systemen Standard ist.Ungolfed:
d ← ⎕D , 6 ↑ ⎕A
d wird D durch die ersten 6 Elemente des gefolgt igits A lphabetu ← 1 (819⌶) ⍵
u wird groß geschrieben (819 ≈ "Big")∧/ u ∊ d:
Wenn alle Elemente von u Mitglieder von d sind , dann:16 ⊥ 1 , d ⍳ u
Finde die Indizes von u in d , stelle eine 1 voran und bewerte sie als Basis 16⍵
sonst: gibt das (unveränderte) Argument zurückTryAPL online:
Setzen Sie
⎕IO
den⌶
Wert auf Null, definieren Sie einen Ersatz für (aus Sicherheitsgründen in TryAPL nicht zulässig) und setzen Sie den Wert⎕PP
( P rint P recision) bis 10 für die großen ErgebnisseProbieren Sie alle Testfälle aus
quelle
REXX,
4948 BytesDas
signal on syntax
weist den Interpreter an, beisyntax
jedem Syntaxfehler zum Label zu springen . Das Programm versucht,a
eine hexadezimal zu dezimal konvertierte Version mit einer führenden 1 neu zuzuweisen, springt jedoch zumsyntax
Label, wenn dies fehlschlägt. Wenn die Konvertierung erfolgreich ist, ignoriert sie einfach die Beschriftung und gibt die neu zugewiesene Variable aus.quelle
PowerShell , 35 Byte
Probieren Sie es online! oder Führen Sie alle Testfälle aus!
Erläuterung
$v
)0
) das Ergebnis einer Zeichenfolge ist, die0x1$v
piped intoInvoke-Expression
(iex
) enthält, während Sie gleichzeitig diesen Wert zuweisen$h
. Wenn die Konvertierung fehlschlägt,$h
wird bleiben$null
.-not
Wert von$h
. Was$h
auch immer implizit konvertiert wird[bool]
($null
im Falle einer ungültigen Konvertierung wird$false
eine positive Ganzzahl im Falle einer erfolgreichen Konvertierung$true
), bevor es negiert wird, in das[int]
der Array-Indexer implizit konvertiert[]
($true
wird1
,$false
wird)0
), was dazu führt, dass das erste Element des Arrays (das Konvertierungsergebnis) ausgewählt wird, wenn die Konvertierung erfolgreich war, und das zweite Element ausgewählt wird, wenn die Konvertierung nicht erfolgreich war.quelle
Scala, 40 Bytes
Verwendung:
Erläuterung:
quelle
C #, 58 Bytes
Ungolfed mit Testfällen:
Versuchen Sie es online
quelle
Dart, 51 Bytes
Probieren Sie es hier aus
Der größte Teil des Overheads stammt von benannten Parametern ... Na ja!
Zumindest mit Dart können Sie dynamisch tippen, wenn Sie Folgendes möchten: D
quelle