Inspirowany najnowszym artykułem Daily WTF ...
Napisz program lub funkcję, która pobiera GUID (ciąg znaków w formacie XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
, w którym każdy X reprezentuje cyfrę szesnastkową), i wyświetla GUID z przyrostem o jeden.
Przykłady
>>> increment_guid('7f128bd4-b0ba-4597-8f35-3a2f2756dfbb')
'7f128bd4-b0ba-4597-8f35-3a2f2756dfbc'
>>> increment_guid('06b86883-f3e7-4f9d-87c5-a047e89a19fa')
'06b86883-f3e7-4f9d-87c5-a047e89a19fb'
>>> increment_guid('89f25f2f-2f7b-4aa6-b9d7-46a98e3cb2cf')
'89f25f2f-2f7b-4aa6-b9d7-46a98e3cb2d0'
>>> increment_guid('89f25f2f-2f7b-4aa6-b9d7-46a98e3cb29f')
'89f25f2f-2f7b-4aa6-b9d7-46a98e3cb2a0'
>>> increment_guid('8e0f9835-4086-406b-b7a4-532da46963ff')
'8e0f9835-4086-406b-b7a4-532da4696400'
>>> increment_guid('7f128bd4-b0ba-4597-ffff-ffffffffffff')
'7f128bd4-b0ba-4598-0000-000000000000'
Uwagi
- W przeciwieństwie do artykułu z linkiem, zwiększenie identyfikatora GUID kończącego się na F musi „przenosić” do poprzedniej cyfry szesnastkowej. Zobacz przykłady powyżej.
- Możesz założyć, że dane wejściowe nie będą
ffffffff-ffff-ffff-ffff-ffffffffffff
. - W przypadku cyfr szesnastkowych powyżej 9 możesz użyć dużej (AF) lub małej (af) wielkości liter.
- Tak, identyfikatory GUID mogą zaczynać się od
0
. - Dane wyjściowe muszą składać się z dokładnie 32 cyfr szesnastkowych i 4 łączników w oczekiwanym formacie, w tym wszelkich niezbędnych początkowych znaków
0
. - Nie musisz zachowywać numeru wersji ani innych ustalonych bitów identyfikatora GUID. Załóżmy, że jest to tylko 128-bitowa liczba całkowita, w której żaden z bitów nie ma żadnego specjalnego znaczenia. Podobnie zakłada się, że identyfikatory GUID są sortowane w prostej kolejności leksykograficznej, a nie w kolejności binarnej
GUID
struktury systemu Windows . - Jeśli pisanie funkcji, wejście może być dowolnej sekwencji z eksploatacji
char
typu danych:string
,char[]
,List<char>
, itd.
GUID
struktury systemu Windows .89f25f2f-2f7b-4aa6-b9d7-46a98e3cb29f
aby upewnić się, że odpowiedzi mogą dokonać przejścia9 -> a
.foreach (char ch in theInput)
.Odpowiedzi:
05AB1E ,
171518 bajtówZaoszczędzono 2 bajty dzięki Kevinowi Cruijssenowi
Wypróbuj online! lub jako pakiet testowy
Wyjaśnienie
źródło
žKÃ
zamiast'-K
. Przy okazji możesz zapisać 2 bajty, zmieniając•É]•S3+
naŽ¦˜S·
.Ž
to już coś takiego ...Python 2 , 50
Wypróbuj online!
źródło
JavaScript (ES6), 85 bajtów
Łańcuch wyjściowy jest pisany małymi literami.
Wypróbuj online!
Skomentował
źródło
Python 2 , 82 bajty
Wypróbuj online!
Brak importu lub konwersji heksadecymalnej.
To skanuje od tyłu sznurka, przesuwając każdą postać w całym cyklu
0123456789abcdef
,-
do samego siebie. Po trafieniu w symbol inny niżf
lub-
przestaje skanować w lewo i po prostu zwraca pozostałą część bez zmian. To rozwiązanie nie jest specyficzne dla formatu UUID - działałaby dowolna liczba bloków o dowolnej liczbie liter szesnastkowych.Podstawowy przypadek
[str,f][s[-1]in'f-'](s[:-1])
to sztuczka, której wcześniej nie widziałem w golfie. To kończy rekurencję bezif
,and
,or
lub innego jednoznacznego przepływu sterowania.W zależności
[s[-1]in'f-']
od stanu ostatniego znaku kod albo zwraca,f(s[:-1])
albo po prostus[:-1]
pozostaje niezmieniony. Ponieważstr
jest to tożsamość na ciągach, możemy wybrać jedną z funkcji[str,f]
i zastosować jąs[:-1]
. Zauważ, że wywołanie rekurencyjnef
nie jest wykonywane, jeśli nie zostanie wybrane, omijając typowy problem, który Python chętnie ocenia nieużywane opcje, co prowadzi do nieskończonego regresji w rekurencjach.źródło
APL (Dyalog Unicode) , 46 bajtów SBCS
Anonimowa ukryta funkcja prefiksu.
Wypróbuj online!
⎕CY'dfns'
c op y bibliotekę „dfns” (aby uzyskaćhex
idec
)(
…)
⊢
Argument≠
różni się od'-'
myślnika(
…)@
w podzbiorze składającym się z miejsc, w których spełnione jest powyższe kryterium, zastosuj:dec¨
przekonwertuj każdy znak szesnastkowy na liczbę dziesiętną…
@32
w pozycji 32 (ostatnia cyfra), zastosuj:1+
przyrost16(
…)⍣≡
stosuj wielokrotnie lewy argument 16 do stabilnego:=
porównaj (daje maskę, gdzie cyfry szesnastkowe wynoszą 16)1⌽
cyklicznie obracaj jeden krok w lewo (jest to bit przenoszący)|+
do tego, dodaj resztę podziału po podzieleniu (przez szesnaście, dzięki czemu wszystkie 16 na 0) obróć cyfry w reprezentacji znaków szesnastkowych o długości jeden ϵ nlist (spłaszczony)1hex
∊
źródło
Java 11,
152149111108 bajtów-38 bajtów dzięki @ OlivierGrégoire .
-3 bajty dzięki tylko @ ASCII .
Wypróbuj online.
Wyjaśnienie:
Stara 149 bajtów odpowiedź:
Wypróbuj online.
Wyjaśnienie:
źródło
Rubin
-pl
,625755 bajtówWypróbuj online!
źródło
Python 3 , 50 bajtów
Wypróbuj online!
źródło
Python 2 ,
113112 bajtówWypróbuj online!
Bez importu
źródło
Retina 0.8.2 , 21 bajtów
Wypróbuj online! Link zawiera przypadki testowe.
9
staje sięa
. Objaśnienie: Wyrażenie regularne dopasowuje wszystkie końcowef
s oraz-
s plus jeden poprzedni znak. Transliteracja następnie cyklicznie zwiększa te znaki, jakby były cyframi szesnastkowymi. Alternatywne podejście, również 21 bajtów:Wypróbuj online! Link zawiera przypadki testowe. Działa poprzez obniżenie wejścia dla uproszczenia transliteracji. Byłby zatem 15 bajtów, gdyby miał obsługiwać tylko małe litery. Wypróbuj online! Link zawiera przypadki testowe.
źródło
MATLAB, 138 bajtów
Naprawiono błąd w przypadku, gdy fragment zawiera wszystkie zera. Grał też w golfa, nadużywając try / catch. Wynik netto: zapisano 0 bajtów.
Próba „oszukiwania” przy użyciu
java.util.UUID
nie powiodła się, ponieważlong
wartość zwrócona zjava.util.UUID.get[Most/Least]SignificantBits
jest konwertowana na wartość,double
która powoduje utratę precyzji. Zapraszam do obejrzenia tego stołu i bezgłośnego powiedzenia „... ale dlaczego? ”Wyjaśnienie
Do
hex2dec
funkcji wypluwadouble
, a więc nie może przetwarzać cały GUID jednocześnie w celu uniknięcia przekroczeniaflintmax
. Zamiast tego musimy przetworzyć fragment GUID metodą chunck, używającsplit
. Zmiennaa
sprawdza, czy musimy ją mieć, i oszukańczo jest to również początkowy przyrost, który dodajemy. Warunkiem przeniesienia jest to, czy długości oryginalnych i przyrostowych łańcuchów nie są już równe.Oryginalna wersja miała niecałe 160 bajtów, więc chciałbym pomyśleć, że nie powinno to być łatwe do outgolfa.
źródło
Python 2 , 99 bajtów
Wypróbuj online!
Bez
uuid.UUID
użycia.źródło
C # (interaktywny kompilator Visual C #) , 77 bajtów
Wypróbuj online!
-1 bajt dzięki @ASCIIOnly!
Anonimowa funkcja, która przyjmuje
char[]
dane wejściowe i wyjściowe poprzez modyfikację argumentu .Dane wejściowe są skanowane od prawej do lewej i zastępowane przy użyciu następujących reguł.
-
Znak jest ignorowany, a proces jest kontynuowanyF
Znak jest przekształcany0
i przetwarzanie jest kontynuowane9
Postaci przekształca sięA
i przetwarzanie zatrzymujeA-E
i0-8
są zwiększane o 1, a przetwarzanie zostaje zatrzymaneźródło
==70
->>69
PowerShell, 101 bajtów
Wypróbuj online!
Brak zewnętrznej biblioteki lub konwersji szesnastkowej. Dowolna długość łańcucha. Małe i duże litery są dozwolone. Wpisz ciąg pasujący do
^[f-]*$
Dopuszczalny jest również .Ten skrypt skanuje od tyłu łańcucha i inrementuje każdy znak o wartość z hashtable:
-
: przyrost = 1-19
: przyrost = 1 + 7, wynik =A
F
: przyrost = 1-23, wynik =0
f
: przyrost = 1-55, wynik =0
Następnie skrypt używa
$p
do ustalenia, czy należy zwiększyć bieżący znak.Skrypt testowy:
Wydajność:
źródło
Perl 6 , 65 bajtów
Sprawdź to
źródło
Galaretka , 20 bajtów
-2 (i poprawka błędu) dzięki Dennis!
Wypróbuj online!
źródło
PowerShell , 126 bajtów
Wypróbuj online!
Dość trywialna odpowiedź. Pomyślałem, że dodam do listy ukochanego PowerShella :)
źródło
JavaScript (Node.js) , 78 bajtów
Wypróbuj online!
źródło
Perl 5, 64 bajtów
Niezbędna liczba nawiasów powoduje, że jestem smutny, ale
->
wiąże się bardzo mocno, jak->as_hex
najszybszy sposób na uzyskanie danych wyjściowych w formacie szesnastkowym.Uruchom z
perl -Mbigint -p
. Zasadniczo po prostu konwertuje liczbę na duży szesnastkowy, dodaje jeden, a następnie podtytula cyfry wyniku z powrotem do pierwotnej wartości, nie zmieniając myślników.źródło
Rdza, 258 bajtów
tak, jest długi .. ale technicznie jest to jedyna linia z 1 wyrażeniem? i żadnych fantazyjnych bibliotek? i nie zawiesi się na wejściu Fuzz? Ungolf:
spróbuj na rdzawym placu zabaw
źródło
16/32/64-bitowy kod zestawu x86, 28 bajtów
bajty: 83C623FDAC3C2D74FB403C3A7502B0613C677502B03088460173E9C3
kod:
Zadzwoń z ESI wskazującym GUID. Zamień ESI na SI dla 16-bitów lub RSI dla 64-bitów (i +2 bajty).
źródło
C (brzęk) , 62 bajty
Wypróbuj online!
źródło
Common Lisp, 166 bajtów
Wypróbuj online!
źródło