0x Nazwy użytkowników
Tak wielu ludzi korzysta z usługi przesyłania wiadomości, że zabrakło miejsca na przechowywanie wszystkich nazw użytkowników! Aby to naprawić, zaczną przechowywać nazwy użytkowników w systemie szesnastkowym, o ile to możliwe.
Jeśli nazwa użytkownika składa się tylko z znaków 0123456789ABCDEF
(bez rozróżniania wielkości liter), można ją przekonwertować na postać szesnastkową i zapisać jako liczbę całkowitą. Na przykład nazwa użytkownika ba5eba11
może być interpretowana jako 0xBA5EBA11
liczba szesnastkowa.
Ale co z tym 05AB1E
? To ma wiodące zero, które zostałoby utracone. Tak więc, za każdym razem, gdy konwertujemy nazwę użytkownika, upewniamy się, że poprzedzamy ją znakiem 1
przed odczytaniem jej jako liczby całkowitej.
Wyzwanie
Twoim zadaniem jest napisanie programu lub funkcji, która, biorąc pod uwagę niepustą nazwę użytkownika jako ciąg, „hexa-kompresuje” nazwę użytkownika:
- Jeśli można go interpretować jako liczbę szesnastkową, należy poprzedzić 1, interpretować jako wartość szesnastkową, a następnie wydrukować wynik jako podstawę 10.
- W przeciwnym razie po prostu zwróć ciąg niezmodyfikowany.
To jest golf golfowy , więc wygrywa najkrótsze rozwiązanie (w bajtach)! Wbudowane podstawowe funkcje konwersji są dozwolone.
Przypadki testowe
Możesz założyć, że wszelkie wynikowe liczby całkowite mieszczą się w standardowym zakresie liczb całkowitych twojego języka.
Podobnie jak w przypadku nazw użytkowników w większości systemów przesyłania komunikatów, łańcuchy wejściowe będą zawierać tylko znaki alfanumeryczne i znaki podkreślenia.
Pamiętaj, że zawsze musisz dodać wiodącą 1
przed konwersją!
"ba5eba11" -> 7421737489
"05AB1E" -> 17148702
"dec0de" -> 31375582
"Beef" -> 114415
"da7aba5e" -> 7960443486
"500" -> 5376
"DENNIS" -> "DENNIS"
"Garth" -> "Garth"
"A_B_C" -> "A_B_C"
"0x000" -> "0x000"
Dla porównania, oto implementacja Pythona 3, której użyłem dla przypadków testowych (nie golfowych):
import re
def convert_name(name):
if re.fullmatch('^[0-9A-Fa-f]+$', name):
return int('1' + name.upper(), base = 16)
else:
return name
Odpowiedzi:
05AB1E , 4 bajty
Wyjaśnienie
Jeśli dane wejściowe zawierają nieprawidłowe znaki szesnastkowe,
H
niczego nie wypchną, więc ostatnia wartość na stosie będzie zduplikowanym wejściem, dlatego program wypisuje dane wejściowe w przypadku nieprawidłowych danych wejściowych.Wypróbuj online!
źródło
05AB1E
jest prawidłową nazwą użytkownika.JavaScript (ES6), 15 bajtów
Jak to działa
'0x1'+s
konwertuje dane wejściowe na dosłowny ciąg szesnastkowy z poprzedzającym1
, np0x105ab1e
. Następnie-0
rzutuje wynik na liczbę. JavaScript widzi0x
na początku i niejawnie próbuje przekonwertować z systemu szesnastkowego; jeślis
zawiera dowolne nieszesnastkowe znaki, zwraca toNaN
. Ponieważ jest to fałsz (i0
nigdy nie można podać danych wyjściowych z powodu wcześniejszego1
), możemy użyć funkcji||s
return,s
jeśli konwersja szesnastkowa się nie powiedzie.Testowy fragment kodu
źródło
Python 2 , 44 bajty
Pobiera dane wejściowe jako ciąg cytowany. -2 bajty dzięki Rod!
Ponieważ gwarantujemy, że dane wejściowe będą zawierały tylko znaki alfanumeryczne i znaki podkreślenia, nie ma sposobu na utworzenie poprawnego języka Python
0x1
poza ciągiem szesnastkowym. Jeśli dane wejściowe to cokolwiek innego, błąd jest ignorowany i drukowanie jest takie, jak było.Nie mogłem sprawić, by dopasowanie wyrażenia regularnego było krótsze niż
try/except
. W rzeczywistości wyrażenie regularne okazało się bardzo gadatliwe:źródło
a=int('1'+a,16)
zexec'a=0x1'+a
(prawdopodobnie trzeba przetestować)"+input()"
.()
nainput()
Perl 6 , 19 bajtów
Sprawdź to
Rozszerzony:
źródło
Perl, 27 bajtów
-1 bajt dzięki @ardnew .
26 bajtów kodu +
-p
flaga.Podaj dane wejściowe bez końcowej nowej linii. Z
echo -n
na przykład:Objaśnienie
Jest to dość proste:
/[^0-9a-f]/i
jest prawdziwe, jeśli dane wejściowe zawierają znak inny niż dozwolony w liczbach szesnastkowych. Jeśli jest fałszem$_
(który zawiera dane wejściowe), jest on ustawiany na przekonwertowaną wartość (konwersja jest wykonywana przez wbudowanehex
).I
$_
jest domyślnie drukowane dzięki-p
flagom.źródło
$_=hex"1$_"if!/[^0-9a-f]/i
Pyth - 9 bajtów
Ten sam pomysł, co odpowiedź Fliptacka . Spróbuj konwersji szesnastkowo-dziesiętnej, w przeciwnym razie wyprowadzić dane wejściowe.
Wypróbuj tutaj!
źródło
Partia, 33 bajty
Jak to działa
Łańcuch jest przekazywany jako argument, 1 jest do niego poprzedzany, a łańcuch jest domyślnie konwertowany na dziesiętny i drukowany. Jeśli ciąg nie jest prawidłowy w systemie szesnastkowym, jest po prostu wyświetlany.
Należy zauważyć, że ponieważ matematyka wsadowa używa 32-bitowych liczb całkowitych ze znakiem, największa dozwolona nazwa użytkownika to
FFFFFFF
.cmd /c
przyjmuje następne polecenie, uruchamia je w nowym terminalu i kończy działanie.set /a
wykonuje matematykę i domyślnie wyświetla wynik w postaci dziesiętnej, gdy nie jest przechowywany w zmiennej.0x1%1
mówi setowi, aby wstawił 1 do pierwszego argumentu (jest to łatwe, ponieważ wszystkie zmienne wsadowe są łańcuchami) i wskazuje, że ciąg powinien być traktowany jako szesnastkowy.2>nul
wycisza wszelkie błędy wynikające z nieprawidłowej liczby szesnastkowej||
jest logiczną operacją OR i wykonuje polecenie po prawej stronie, jeśli polecenie po lewej stronie nie powiedzie się. Nawiasy tworzą wszystko do tego momentu jedno polecenie.echo %1
po prostu wyświetla pierwszy argument.źródło
Common Lisp, 71
Testy
Zdefiniuj funkcję
Podaj listę oczekiwanych danych wejściowych, zgodnie z pytaniem:
Analizuj i zbieraj wyniki
Sprawdź, czy oczekiwane wyniki są zgodne z rzeczywistymi:
źródło
C, 108 bajtów
Jest to funkcja, która bierze ciąg jako argument i wypisuje wynik do STDOUT.
źródło
int
:)JavaScript:
4641 bajtówźródło
/[^0-9a-f]/i
0-9
przez\d
, 3 bajty dodając flagę wielkości liter (dzięki @GilZ) i 2 przez usunięcie więcej bajtówF=
, co nie jest potrzebne. Dzieki za sugestie.PHP, 42 bajty
hex2bin () zwraca false, jeśli dane wejściowe nie są prawidłowym łańcuchem szesnastkowym. Jest to krótsze niż użycie wyrażenia regularnego do szukania cyfr innych niż szesnastkowe, ale potrzebujemy operatora @, ponieważ nie jest cichy, gdy zawiedzie.
źródło
hex2bin
zawodzi w przypadku ciągów o nierównej długości. Nadal dwa bajty krótsze niż zpreg_match
:<?=@hex2bin($s=$argv[1])|@hex2bin($s.a)?hexdec("1$s"):$s;
dla 57 bajtów.bash,
463531 bajtówZapisz jako skrypt i przekaż nazwę użytkownika jako argument.
źródło
Python 2 -
63,52,50, 46 bajtówTo używa Pythona,
int()
który konwertuje dowolny ciąg z odpowiednią bazą na bazę 10. W tym przypadku ciąg jest liczbą 1 dołączoną do wejścia. Jeśli dane wejściowe są niepoprawne (ma znaki inne niż0123456789ABCDEF
(bez rozróżniania wielkości liter), zwracaValueError
:Wypróbuj tutaj!
Dzięki @FlipTack za oszczędność 15 bajtów!
źródło
Ruby,
47 lat44 bajtówI może usunąć 3 bajty zmieniającputs
zap
, ale czuję się jak wyjście byłoby uznane za błędne, ponieważ ma nowego wiersza na końcu.Edycja: Zmieniono
puts
nap
jako końcowe znaki nowej linii są zwykle akceptowane, dzięki @Mego.źródło
Japt , 11 bajtów
Wypróbuj online!
Ogromne podziękowania dla ETHproductions!
źródło
Dyalog APL , 37 bajtów
Nie używa wbudowanej walidacji ani konwersji hex-dec. Wymaga
⎕IO←0
ustawienia domyślnego w wielu systemach.Nie golfowany:
d ← ⎕D , 6 ↑ ⎕A
d otrzymuje D igits, a następnie pierwsze 6 elementów alfabetu A.u ← 1 (819⌶) ⍵
u dostaje duże litery (≈ 819 "Big") Argument∧/ u ∊ d:
jeżeli wszystkie elementy u są członkami d , a następnie:16 ⊥ 1 , d ⍳ u
znaleźć indeksy u w d i przedrostek 1, i ocenić jako podstawy 16⍵
else: zwróć argument (niezmodyfikowany)TryAPL online:
Ustaw
⎕IO
na zero, zdefiniuj zamiennik⌶
(zabroniony na TryAPL ze względów bezpieczeństwa) i ustaw⎕PP
( P rint P recision) na 10 dla dużych wynikówWypróbuj wszystkie przypadki testowe
źródło
REXX,
4948 bajtówsignal on syntax
Opowiada tłumacza skok do etykietysyntax
, gdy wystąpi błąd składni. Program próbuje ponownie przypisaća
wersję konwertowaną szesnastkowo na dziesiętną z wiodącym 1, alesyntax
jeśli to się nie powiedzie , przeskakuje do etykiety. Jeśli konwersja się powiedzie, po prostu ignoruje etykietę i wyświetla ponownie przypisaną zmienną.źródło
PowerShell , 35 bajtów
Wypróbuj online! lub Uruchom wszystkie przypadki testowe!
Wyjaśnienie
$v
)0
) jest wynikiem ciągu zawierającego0x1$v
potok doInvoke-Expression
(iex
), jednocześnie przypisując tę wartość do$h
. Jeśli konwersja się nie powiedzie,$h
pozostanie$null
.-not
wartości logicznej$h
. Cokolwiek$h
zostanie niejawnie przekonwertowane na[bool]
($null
w przypadku niepoprawnej konwersji, stanie się$false
dodatnią liczbą całkowitą w przypadku pomyślnej konwersji$true
), zanim zostanie zanegowane, a następnie zostanie domyślnie przekonwertowane[int]
przez indeksator macierzy[]
($true
będzie1
,$false
będzie0
), co powoduje, że pierwszy element tablicy (wynik konwersji) zostanie wybrany, jeśli konwersja się powiedzie, a drugi element wybrany, jeśli konwersja się nie powiedzie.źródło
Scala, 40 bajtów
Stosowanie:
Wyjaśnienie:
źródło
C #, 58 bajtów
Niegolfowany z przypadkami testowymi:
Wypróbuj online
źródło
Dart, 51 bajtów
Wypróbuj tutaj
Większość kosztów ogólnych pochodzi od nazwanych parametrów ... No cóż!
Przynajmniej Dart pozwala na dynamiczne pisanie, jeśli chcesz: D
źródło