To jest wersja kodu golfowego podobnego pytania, które zadałem wcześniej na stosie ale pomyślałem, że będzie to interesująca łamigłówka.
Biorąc pod uwagę ciąg o długości 10, który reprezentuje podstawową liczbę 36, zwiększ go o jeden i zwróć wynikowy ciąg.
Oznacza to, że ciągi będą zawierać tylko cyfry od 0
do 9
i litery od a
do z
.
Baza 36 działa w następujący sposób:
Prawa najbardziej cyfra jest zwiększana, najpierw za pomocą 0
do9
0000000000> 9 iteracji> 0000000009
i po tej a
Do z
stosuje się:
000000000a> 25 iteracji> 000000000z
Jeśli z
trzeba zwiększyć, pętla wraca do zera, a cyfra po lewej stronie jest zwiększana:
000000010
Dalsze zasady:
- Możesz używać wielkich lub małych liter.
- Ty może nie spaść zera. Zarówno wejście, jak i wyjście są ciągami o długości 10.
- Nie musisz obsługiwać
zzzzzzzzzz
danych wejściowych.
Przypadki testowe:
"0000000000" -> "0000000001"
"0000000009" -> "000000000a"
"000000000z" -> "0000000010"
"123456zzzz" -> "1234570000"
"00codegolf" -> "00codegolg"
code-golf
string
base-conversion
Jack Hales
źródło
źródło
"0zzzzzzzzz"
(zmodyfikuj najbardziej znaczącą cyfrę) jako przypadku testowego. Zadziałało moje rozwiązanie C z powodu błędu „jeden po drugim”.Odpowiedzi:
05AB1E , 10 bajtów
Dane wejściowe są pisane wielkimi literami .
Kod
Wyjaśnienie
Wykorzystuje kodowanie 05AB1E . Wypróbuj online! lub Zweryfikuj wszystkie przypadki testowe .
źródło
Japt , 13 bajtów
Wypróbuj online! i Zweryfikuj przypadki testowe
Pobiera dane wejściowe jako ciąg
Wyjaśnienie
źródło
JavaScript (ES6), 45 bajtów
Zaoszczędź 4 bajty dzięki @OOBalance
Wypróbuj online!
źródło
Haskell , 58 bajtów
Wypróbuj online!
Strategia bardzo brutalnej siły: generuj wszystkie ciągi długości -10-base-36 w kolejności i znajdź ten, który pojawia się po danych wejściowych na liście. Poświęć bardzo dużo czasu na ciągi znaków daleko od początku listy.
Haskell , 60 bajtów
Wypróbuj online!
Czyta ciąg znaków od lewej do prawej, aż do znaku, po którym następuje sufiks wszystkich liter Z, które mogą być puste. Zwiększa ten znak i zastępuje Z na 0.
źródło
Stax , 7 bajtów
Uruchom i debuguj
Wyjaśnienie:
źródło
C (gcc) ,
5048 bajtówWyraźna flaga przeniesienia nie była konieczna po zrestrukturyzowaniu pętli do końca, gdy tylko przeniesienie się nie zdarzy. Regulacja 9-> odbywa się podczas sprawdzania pętli.
Dzięki pułapkowi cat za sugestię.
Wypróbuj online!
Wersja oryginalna:
7157 bajtówTa wersja używa flagi carry do rozpowszechniania aktualizacji: ustawiłem ją na true, aby rozpocząć przyrost. Ciąg jest modyfikowany w miejscu i akceptuje tylko 0-9, AZ. Najtrudniejsze było upewnienie się, że 9-> A zostało poprawnie obsłużone na noszach.
Edycja: Zmieniłem przeznaczenie wskaźnika wejściowego jako flagę przenoszenia.
Wypróbuj online!
źródło
C,
82815350 bajtówBezpośrednio modyfikuje ciąg wejściowy; dane wejściowe i wyjściowe są pisane wielkimi literami. Wypróbuj online tutaj . Dzięki Arnaulda do golfa 24 bajtów i do ceilingcat do golfa 3 więcej bajtów.
Nie golfowany:
źródło
ZZZZZZZZZZ
. Odpowiedź ErikF robi to samo, ale jeszcze krócej: codegolf.stackexchange.com/a/169468/79343Online Turing Machine Simulator , 745 bajtów
Tłumacz online
źródło
Perl 6 ,
34 3230 bajtówDzięki nwellnhof za -2 bajty dzięki użyciu
o
operatora do łączenia funkcjiWypróbuj online!
Funkcja, która konwertuje argument na bazę 36, dodaje 1, konwertuje z powrotem, a następnie formatuje go. Teraz stosuje tę samą taktykę jak odpowiedź Adnana, aby zachować wiodące zera.
źródło
{S/.//}o{base :36(1~$_)+1: 36}
przez 30 bajtów.o
podczas gry w golfa, ale widzę, gdzie może być przydatny!.succ
(przyrost o jeden) nie działaMATL , 12 bajtów
Wypróbuj online!
źródło
Haskell , 63 bajty
Wypróbuj online! Odwraca ciąg i sprawdza pierwszy znak:
9
zostaje zastąpione przeza
.z
jest zastępowane przez a,0
a rekurencyjnie sprawdzany jest następny znak.succ
funkcji następcy, której można używać na znakach, ponieważ są one instancją klasy Enum .Ostatecznie powstały ciąg znaków jest ponownie odwracany.
źródło
Procedura kodu maszynowego 6502 (NMOS *) , 26 bajtów
*) używa „nielegalnego” kodu operacyjnego
ISB
/0xF3
, działa na wszystkich oryginalnych układach NMOS 6502, a nie na późniejszych wariantach CMOS.Oczekuje wskaźnika do ciągu 10 znaków w
$fb
/$fc
który ma być liczbą podstawową 36. Zwiększa tę liczbę w miejscu.Nie robi nic sensownego na nieprawidłowych danych wejściowych (jak np. Krótszy łańcuch) - uchwyty
ZZZZZZZZZZ
przez przypadek „poprawnie”;)Skomentowano demontaż
Przykładowy program asemblerowy C64 wykorzystujący procedurę:
Demo online
Kod w składni ca65 :
źródło
Retina 0.8.2 , 12 bajtów
Wypróbuj online! Objaśnienie:
dl
Część miejsca docelowego zamiany rozwija się,0-9a-z
podczas gdyo
kopie kopiują ją do źródła, co powodujez0-9a-z
(chociaż drugaz
zostaje zignorowana, ponieważ nigdy nie może się dopasować). Zwiększa to dopasowane cyfry..z*$
Część wzoru mecze ostatniej nieprzestrzeganiaz
cyfrę plusa wszystkie spływuz
s, a więc manipulowania carry z ich przyrostem do0
.źródło
Rubinowy , 40 bajtów
Wypróbuj online!
0
s"zzzzzzzzzz"
zwraca łańcuch o długości 11źródło
pieprzenie mózgu , 109 bajtów
Wypróbuj online!
źródło
Apl (Dyalog Unicode) ,
302824 bajtówDzięki ngn za podpowiedź, aby zaoszczędzić trochę bajtów.
Wypróbuj online!
Wymaga ⎕IO równego 0
Używa wielkich liter
źródło
'1',
udziałf
? wtedy1↓
stanie się częścią jego odwrotności(⎕D,⎕A)⍳'1',
->1,(⎕D,⎕A)⍳
(f⍣¯1)1+f←36⊥1,(⎕D,⎕A)⍳⊢
PHP,
6964 bajtówkiepska wersja :
Uruchom jako potok z
-R
. Wielkość liter nie ma znaczenia, małe litery wyjściowe.pierwsze podejście, 69 bajtów:
Uruchom jako potok z
-F
wersja zapętlona, również 69 bajtów :
młodsze PHP wyświetla ostrzeżenia o niezdefiniowanych stałych.
Y
i naA
małe litery, aby wprowadzić małe litery.Uruchom jako potok z
-nR
... lub wypróbuj je online .
źródło
-R
i nazwać go również 66 bajtami.printf('%010s',($b=base_convert)(1+$b($argn,36,10),10,36));
- 59 bajtów($b=base_convert)(a,b,c)
. Uczę się od ciebie dużo.Python 2 , 88 bajtów
Wypróbuj online!
Zwiększa ciąg „ręcznie”.
źródło
Węgiel drzewny , 14 bajtów
Wypróbuj online!Link jest do pełnej wersji kodu. Wyjaśnienie:
Drukuj 9
0
s. Służy to uzupełnieniu wyniku.Konwertuj dane wejściowe z bazy 36, zwiększaj je, a następnie konwertuj z powrotem na bazę 36. Następnie odwróć wynik i wydrukuj go w lewo.
źródło
Java 8,
907656 bajtówAkceptuje zarówno duże, jak i małe litery do wprowadzania. Dane wyjściowe są zawsze pisane małymi literami.
Dzięki Okx za w golfa 18 bajtów.
Wypróbuj online tutaj .
Nie golfowany:
źródło
"".format("%10s",t).replace(' ','0')
1
na początku, a następnie jego usunięciu:s->Long.toString(Long.valueOf("1"+s,36)+1,36).substring(1)
"1"+s
1+s
JavaScript (ES6), 89 bajtów
Ten nie jest tak efektywny bajtowo jak drugi wpis JavaScript , ale zrobiłem to, nie zauważając tej reguły:
To nie jest poważny wpis - dla zabawy! Działa z ciągami o ogólnej długości, takimi jak
0abc
, i wstawia,1
gdy pierwsza cyfra toz
, np.zzz
->1000
. Dane wejściowe muszą być pisane małymi literami.Wyjaśnienie
Ekspresja
(A, B, C)
faktycznie oznacza „zrób A, następnie zrób B, a następnie zwróć C”, którego używam do deklarowania niektórych zmiennych, których ponownie używam w kodzie.s
oznacza „ciąg”,l
oznacza „ostatni”,r
oznacza „odpoczynek”.To jest funkcja rekurencyjna. W przypadku typowego ciągu znaków
aza
zwiększy on tylko ostatni znak (patrz wiersz 6) -azb
. Ale dla łańcucha, który kończy się naz
, na przykładh0gz
, będzie działać na wszystkim aż do ostatniego znaku (thez
) i zastąpi go0
zamiast niego (patrz wiersz 5) -f(h0gz)
=f(h0g) + 0
=h0h0
.W
||'0'
wierszu 5 funkcja działa, gdy jest wywoływana na łańcuch o długości 1 (tj. Łańcuch'z'
). Bez niegof('')
nazywa się (ponieważ'z'.slice(0, -1)
jest''
), który ma niezdefiniowane zachowanie (dosłownie - spróbuj sam), a to nie jest dobre. Oczekiwany wynikf('z')
to'10'
, z czego otrzymujemyf('0') + 0
, więc wykorzystujemy||'0'
. (||'0'
jest szczególnie użyteczny, ponieważ nie przeszkadza w zwykłym przypadku -r
ma co najmniej 1 długość (s
co najmniej 2 długości) - ponieważ łańcuchy są falsey tylko, gdy mają długość 0).Metoda inkrementacji łańcucha jest taka sama, jak stosowana w drugim wpisie JS: przekonwertuj „liczbę” base-36 na liczbę rzeczywistą, dodaj 1, a następnie przekonwertuj ją z powrotem na base-36. Nie musimy się martwić o
1
zwiększenie wartości „z” ('z'
->'10'
), ponieważ tak naprawdę nigdy nie inkrementujemy „z” (patrz linie 4 i 6: ostatni znak jest zwiększany tylko wtedy, gdy nie jest „z”).Ponadto nigdy nie ryzykujemy odrzucenia wiodących zer, ponieważ tak naprawdę nigdy nie manipulujemy więcej niż jednym znakiem naraz - tylko ostatnim znakiem w ciągu. Reszta znaków jest czysto odcinana, gdy kroisz dowolny ciąg i poprzedzające go posłowie.
źródło
Czysty ,
8984 bajtówWypróbuj online!
Krótsze rozwiązanie dzięki Laikoni .
Czysty , 115 bajtów
Uwielbiam to, kiedy mogę użyć
limit(iterate...
Wypróbuj online!
Daje odpowiedź bez konwersji baz przy użyciu dopasowywania list.
? :: [Char] -> [Char]
wykonuje przewóz do przodu.@ :: Char -> Char
przyrosty o jeden, uwzględniając różnicę między'9'
i'z'
.$ :: [Char] -> [Char]
zwiększa ostatni znak i obowiązuje,?
dopóki wartość nie ustabilizuje się.źródło
R ,
152123 bajtyWypróbuj online!
Zupełnie inne podejście. Zdobądź punkty kodowe ASCII i rekurencyjnie „zwiększaj” najbardziej prawy punkt kodowy (sprawiając, że
0
(57) skacze doa
(97) iz
(122) wraca do0
(48)), aż zabraknie ciz
. Konwertuj z powrotem na ciąg.Stara wersja
Wypróbuj online!
To wszystko manipulowanie tekstem, które nie idzie w parze z golfem w kodzie R.
Zamień wszystko
z
na końcu ciągów na0
. Znajdź lokalizację ostatniego elementu przed nowo wybitymi końcowymi0
s. Znajdź następną bazę 36 cyfr. Dokonać zmiany. Ciesz się, że ledwo pokonałeś rozwiązanie Online Turing Machine Simulator.źródło
strtoi
na początek; jest jeszcze kilka sztuczek golfowych, aby obniżyć wynik do 72.strtoi
jest ograniczony do raczej małych liczb? Zrezygnowałem z tego jakiś czas temu.int
ograniczenie było tak problematyczne. Bummer! Dla potomnych było to moje nieudane rozwiązanie: wypróbuj online!Gwiaździsta , 325 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
Wolfram Language (Mathematica) , 39 bajtów
Wypróbuj online!
źródło
Python 3.6+ i gmpy2 , 62 bajty
Wypróbuj online!
(Uwaga: gmpy2 nie jest częścią standardowej biblioteki Pythona i wymaga oddzielnej instalacji)
źródło
f=
. Funkcje anonimowe są zwykle uważane za znalezione w kodzie golfowym.Pyke , 11 bajtów
Wypróbuj tutaj!
Może być o 2 bajty krótszy z następującą zmianą języka: Jeśli używany jest tryb szesnastkowy, zmień wszystkie zastosowania base_36 i base_10 na base_92 (które w rzeczywistości w tym kontekście nie są tak naprawdę base 92)
źródło
sed , 94 bajty
Wypróbuj online!
Sed bardzo cierpi z powodu konieczności zmiany postaci poprzez wyszukiwanie.
źródło
Zsh ,
4136 bajtówWypróbuj online!
źródło
Galaretka , 21 bajtów
Wypróbuj online!
Używa wielkich liter. Łącze TIO pozwala również na małe / mieszane przypadki.
źródło