W tym wyzwaniu otrzymasz dane wejściowe, przekonwertujesz je na szesnastkowy, wprowadzisz kilka zmian i wyprowadzisz wynik.
Ponieważ mają one tylko 16 znaków w systemie szesnastkowym, kod musi być możliwie jak najkrótszy.
Przykłady
Przykłady są oddzielone pustą linią. Pierwszy wiersz jest wprowadzany, drugi wiersz pokazuje kroki, trzeci wiersz pokazuje wynik
234589
234589 -> 3945D -> 39454 -> 9A1E -> 9115 -> 239B -> 2392 -> 958
958
435234
435234 -> 6A422 -> 61422 -> EFEE -> 5655 -> 1617
1617
153
153 -> 99 -> 99 -> 63
1617
Kroki
Dane wejściowe zawsze będą dodatnią liczbą całkowitą
Aby wygenerować dane wyjściowe, wykonaj następujące kroki:
- Przekształć dane wejściowe na szesnastkowe
- Zastąp dowolne litery ich indeksem w alfabecie (np.
a -> 1, b -> 2
) - Konwertuj wynik z powrotem na szesnastkowy
- Jeśli wynik zawiera litery, przejdź do kroku 2. Jeśli nie, wyślij wynik
To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach!
code-golf
math
number
base-conversion
hexadecimal
Downgoat
źródło
źródło
749699 -> B7083 -> 27083 -> 69CB -> 6932 -> 1B14 -> 1214 -> 4BE -> 425 -> 1A9 -> 119 -> 77
Odpowiedzi:
Galaretka , 18 bajtów
Wypróbuj online!
Binarna, 18-bajtowa wersja kodu źródłowego ma zrzut xxd
i współpracuje z tą wersją interpretera Jelly .
Jak to działa
Ḍ
(liczba dziesiętna do liczby całkowitej) powinien był być skrótem odḅ⁵
, ale najnowsza wersja Jelly w momencie tego postu zawierała błąd, który uniemożliwił mi korzystanie z niego.źródło
JavaScript ES6,
98926764 bajtówZaoszczędź 3 bajty dzięki @Downgoat, 3 więcej dzięki @ user81655
Znaleziono dużo, znacznie krótszą wersję, porzucającą pętlę rekurencji:
Prawdopodobnie najciekawszą częścią tego programu jest
replace
funkcja:Testowy fragment kodu
(wzięty stąd )
źródło
.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))")
. Może także zaoszczędzić kilka bajtów przy użyciu rekurencji.replace
na sznurku przed oceną, ale okazało się to dłużej.h=
CJam,
2119 bajtówSprawdź to tutaj.
Wyjaśnienie
Bardzo rzadki przypadek ujemnym wynikiem modulo jest pomocne. :)
źródło
Rubin, 35 + 1 = 36
Z flagą wiersza polecenia
p
uruchomWyjaśnienie:
Flaga -p tworzy pętlę, przechowując dane wejściowe i dane wyjściowe w zmiennej
$_
.'%x'
dokonuje konwersji szesnastkowej,tr!
zastępuje cyfrę i zwraca wartość falsey, jeśli nie było nic do zmiany. Ponów zaczyna od nowa$_
.źródło
Julia,
7874 bajtówJest to funkcja rekurencyjna, która przyjmuje liczbę całkowitą i zwraca ciąg znaków.
Nie golfowany:
źródło
MATL , 23
25bajtówZrzeczenie się
Pisząc tę odpowiedź zauważyłem błąd w
dec2base
funkcji MATL-a , poprawiłem go i wydałem nową wersję z poprawką (a także kilka innych nagromadzonych, niepowiązanych zmian) .Ponieważ używam wersji późniejszej niż to wyzwanie, zgodnie z konsensusem w sprawie Meta, ta odpowiedź nie kwalifikuje się do wygrania .
Kod
Przykład
Wyjaśnienie
źródło
Dyalog APL,
373633 bajtówDzięki Adám i ngn za sugestie. Trzymam
16⊥⍣¯1⊢⍵
zamiast⍵⊤⍨⍴⍨16
- to dodatkowy bajt, ale pozwala nam operować liczbami o dowolnym rozmiarze, a nie 64-bitowym.źródło
{∧/9≥X←16⊥⍣¯1⊢⍵:10⊥X⋄∇10⊥10|X+9<X}
10⊥10|X+10≤X
->10(⊣⊥|+≤)X
(technicznie nie równoważny, ale działa na cyfry szesnastkowe)16⊥⍣¯1⊢⍵
->⍵⊤⍨⍴⍨16
Python,
118105 bajtówźródło
PHP,
14012612211411287 lub 84 bajtów (w tym-r
)Nie jestem do końca pewien, w jaki sposób reguły wokół tego, ponieważ jest to moja pierwsza próba kodegolfa, ale kod można uruchomić
php -r
bez potrzeby<?
i?>
Kod
Sformatowany
Kod alternatywny (używając argv zamiast standardowego wejścia)
Sformatowany
Notatki
Edycja 1: Wyłączyłem wezwanie do
intval()
zapisania 14 znaków, ponieważ PHP z przyjemnością będzie traktować ciągi liczbowe jako liczby.Edycja 2: Usunąłem
\n
z wyjścia, którego zapomniałem usunąć po testowaniu, i usunąłem cudzysłowy z ostatniego echa, aby zapisać łącznie 4 znaki.Edycja 3: Usunięto ostatnie połączenie z
intval()
Edycją 4: Zapisano 2 bajty, usuwając znaki cudzysłowu z wiersza wyrażenia regularnego
Edytuj 5: Zmieniono
[a-f]
na,\D
aby zapisać 3 znaki, usuniętostrval
połączenie zpreg_replace
8 kolejnych; dodano wersję, która używaargv[]
zamiast STDIN, przeniosła terminator pętli do instrukcji while (oops!), zapisując 11 dodatkowych znaków, i przeniosła wywołanie dechex dosubject
częścipreg_replace
dla kolejnych 3, co daje w sumie 25; dodano także wersję inną niż standardowa jako alternatywną wersję, która używa 3 znaków mniej. Dzięki za pomoc, @Blackholeźródło
-r
opcji). Ale prowadzenie;
jest zawsze krótsze niż prowadzenie?>
, więc nie zapominaj o tym. Nawiasem mówiąc, oto krótszy kod:for($a=$argv[1];$b!=$a;)$a=preg_replace('#\D#e','ord($0)-96',$b=dechex($a));echo$b;
(-29 bajtów).153
powinien dać63
, a nie99
. Ale-r
jest darmowy. (patrz codegolf.meta.stackexchange.com/a/2428/55735 )R ,
106103102 bajtów-3 bajty przy użyciu
if
zamiastwhile
-1 bajt dzięki użyciu Giuseppe
as.double
zamiastas.integer
Wypróbuj online!
Wystarczy dodać
a(your_integer_here)
do TIO, aby zobaczyć wynik.Użyłem rekurencji, aby ponownie zastosować funkcję do każdej kolejnej iteracji, pod warunkiem, że nie znajdzie ona żadnej z liter „abcdef” w ciągu, gdy ten warunek ma wartość False, wynik jest wyświetlany jako ciąg. Najlepsze było moje odkrycie
chartr
funkcji, która pozwala mi zamieniać elementy z odpowiednimi elementami w ciągu. Ciąg ten pochodzi z funkcji wymuszającej zapis szesnastkowy na format ciągu.Edycja: Próbowałem użyć
sprint("%x",y)
zamiastas.hexmode(as.double(y))
, ale wciąż muszę użyćas.double
gdzieś w kodzie, który był o21 bajt dłuższy.źródło
as.double
jest krótszy niżas.integer
05AB1E , 12 bajtów
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
ÐþQ
alternatywnie może byćD.ï
(D
: Duplikat.ï
;: is_int?) dla tej samej liczby bajtów.źródło
[hÐþQ#Au₂L‡
nie zawsze działa niestety. Wyzwanie polega na tym, aby najpierw przekonwertować na hex, a następnie w każdej iteracji. Jeśli wkleję kod w moim pakiecie testowym, pierwsze trzy przypadki testowe są poprawne, ale dwa ostatnie kończą się niepowodzeniem.C # (interaktywny kompilator Visual C #) , 92 bajty
Wypróbuj online!
Kod mniej golfowy:
źródło
Mathematica, 107 bajtów
Nie mogę wymyślić żadnych innych sposobów gry w golfa ...
źródło
Mathematica, 80 bajtów
Wykorzystuje to fajną sztuczkę w przypadku pętli while, których nauczyłem się od alephalpha. Jest
//.
to „stosuj tę zasadę podstawiania tak często, jak to możliwe”. Następnie używamy wzorca,l_/;Max@l>9
który pasuje tylko wtedy, gdy lista cyfr szesnastkowych nadal zawiera cyfry większe niż 9.źródło
Japt,
4540 bajtówNa podstawie mojej odpowiedzi JS:
Całkiem żałosne jak na golfa, co? Wydaje się, że wielu ludzi zdaje sobie sprawę z tego, że ich tłumacze mają błędy, a teraz jestem wśród nich. To powinno być w stanie to zrobić w 30 bajtów lub mniej, ale to błąd sprawia, że to niemożliwe.
Tworzy to funkcję,
H
którą można wywołać w następujący sposób:Alternatywnie, oto pełny program, pobierający dane wejściowe ze STDIN:
Wypróbuj online!
źródło
GNU Sed (z rozszerzeniem eval), 44
Chciałbym na
sed
to pozwolićy/A-F/1-6/
. Ale tak nie jest.źródło
Python 3,
10189 bajtówOgólnie rzecz biorąc, jest to dość podobne do rozwiązania Boomerang , ale wymaga kilku różnych podejść do różnych aspektów.
To jest rozszerzona wersja mojego oryginalnego kodu:
11 bajtów zostało zrzuconych dzięki @pacholik (zastępując wewnętrzne
join
z pojedynczą operacją, która działała zarówno dla cyfr, jak i liter). Kolejny bajt został przycięty przez zastąpieniejoin
sztuczki polegającej na przecinaniu sznurka, która uderzyła mnie w chwilę (ale już istnieje we wskazówkach golfowych Pythona , aczkolwiek pod nagłówkiem określającym Python 2).źródło
join
Może zostać skrócony dostr(ord(c)%12)for c in n
.Java, 201 bajtów
źródło
Japt , 21 bajtów
Wypróbuj online!
Znacząca poprawa w stosunku do istniejącej odpowiedzi Japt. Nie obsługuje
153 -> 63
przypadku zaproponowanego w komentarzu, ale wydaje się, że żadna z pozostałych odpowiedzi też tak nie jest, więc zostawię to, chyba że OP wyjaśni.Dane wyjściowe jako listę cyfr dziesiętnych można zmienić na wypisywanie liczby dziesiętnej dla 1 bajtu
Wyjaśnienie:
źródło
APL (NARS) 104 znaki, 208 bajtów
test:
Nie wiem, czy jest w porządku ... Możliwe, że nie wystarczy dla standardowej odpowiedzi jakości ...
źródło
Poważnie, 42 bajty
Hex Dump:
Wypróbuj online
Musi być krótsza droga, ale to jest to, co dostałem ... (To jest miejsce, w którym chciałbym
W
naprawdę wyskoczyć, ponieważ krótsze jest wstawienie;
prawa przed ostatnim, gdy nie chcesz tego niż wstawićX
po KAŻDYMW
. Tutaj, mającW
pop zamiast peek, zaoszczędzisz trzy bajty.)źródło
Japt, 18 bajtów
Spróbuj
źródło
PHP, 71 bajtów
Uruchom jako potok z
-nR
lub spróbuj online .Wyświetla ostrzeżenie dla niektórych danych wejściowych w PHP 7.1 i nowszych; zastąpić
-
z!=
do naprawienia.Daje kolejne ostrzeżenie w PHP 7.2; wstaw
abcdef
cytaty, aby to naprawić.źródło