Вдохновленный недавней статьей Daily WTF ...
Напишите программу или функцию, которая принимает GUID (строку в формате XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
, где каждый X представляет шестнадцатеричную цифру) и выводит GUID, увеличенный на единицу.
Примеры
>>> 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'
Заметки
- В отличие от связанной статьи, увеличение GUID, заканчивающееся на F, должно «переносить» к предыдущему шестнадцатеричному знаку. Смотрите примеры выше.
- Вы можете предположить, что ввода не будет
ffffffff-ffff-ffff-ffff-ffffffffffff
. - Для шестнадцатеричных цифр выше 9, вы можете использовать либо верхний (AF), либо нижний (af) регистр.
- Да, GUID может начинаться с
0
. - Ваш вывод должен состоять ровно из 32 шестнадцатеричных цифр и 4 дефисов в ожидаемом формате, включая любые необходимые начальные
0
s. - Вам не нужно сохранять номер версии или другие фиксированные биты GUID. Предположим, что это просто 128-битное целое число, где ни один из битов не имеет какого-либо особого значения. Точно так же предполагается, что GUID сортируются в прямом лексикографическом порядке, а не в двоичном порядке
GUID
структуры Windows . - Если написание функции, вход может быть любой последовательностью-of
char
типа данных:string
,char[]
,List<char>
и т.д.
GUID
структуры Windows .89f25f2f-2f7b-4aa6-b9d7-46a98e3cb29f
чтобы убедиться, что ответы могут сделать переход9 -> a
.foreach (char ch in theInput)
допустим эквивалент C # на вашем языке .Ответы:
05AB1E ,
171518 байтСохранено 2 байта благодаря Кевину Круйссену
Попробуйте онлайн! или как тестовый набор
объяснение
источник
žKÃ
вместо'-K
. Кстати, вы можете сохранить 2 байта, изменив•É]•S3+
наŽ¦˜S·
.Ž
это вещь сейчас ...Python 2 , 50
Попробуйте онлайн!
источник
JavaScript (ES6), 85 байт
Выходная строка в нижнем регистре.
Попробуйте онлайн!
комментарии
источник
Python 2 , 82 байта
Попробуйте онлайн!
Нет импорта или преобразования в гекс.
Это сканирует конец строки, перемещая каждый символ по циклу
0123456789abcdef
,-
переходя к самому себе. После попадания символа, отличного отf
или-
, он прекращает сканирование влево и просто возвращает остаток без изменений. Это решение не относится к формату UUID - любое количество блоков любого количества шестнадцатеричных букв будет работать.Базовый случай
[str,f][s[-1]in'f-'](s[:-1])
- трюк, который я раньше не видел в гольфе. Он прекращает рекурсию без какого - либоif
,and
,or
или другого явного потока управления.Исходя из условия
[s[-1]in'f-']
последнего символа, код либо возвращается,f(s[:-1])
либо просто неs[:-1]
изменяется. Посколькуstr
это тождество в строках, мы можем выбрать одну из функций[str,f]
и применить ее кs[:-1]
. Обратите внимание, что рекурсивный вызов withf
не выполняется, если он не выбран, что позволяет обойти общую проблему, заключающуюся в том, что Python с готовностью оценивает неиспользуемые опции, что приводит к бесконечному регрессу в рекурсиях.источник
APL (Dyalog Unicode) , 46 байтов SBCS
Функция анонимного молчаливого префикса.
Попробуйте онлайн!
⎕CY'dfns'
с оп у «dfns» библиотека (для полученияhex
иdec
)(
…)
⊢
Аргумент≠
отличается от'-'
тире(
…)@
в подмножестве, состоящем из мест, в которых приведенный выше критерий верен, применимо:dec¨
преобразовать каждый шестнадцатеричный символ в десятичное число…
@32
в позиции 32 (последняя цифра), применить:1+
приращение16(
…)⍣≡
повторно применить с левый аргумент 16 до стабильного:=
сравнить (дает маску , где шестнадцатеричные цифры 16)1⌽
циклический повороту на один шаг влево (это бито переноса)|+
к этому, добавить остаток деления при делении (на шестнадцать, таким образом , делая все 16 в 0) поворот цифры в длину-один шестнадцатеричный символ представлений е NLIST (Flatten)1hex
∊
источник
Java 11,
152149111108 байт-38 байт благодаря @ OlivierGrégoire .
-3 байта благодаря @ ASCII-only .
Попробуйте онлайн.
Объяснение:
Старый 149 байт ответ:
Попробуйте онлайн.
Объяснение:
источник
Руби
-pl
,625755 байтПопробуйте онлайн!
источник
Python 3 , 50 байт
Попробуйте онлайн!
источник
Python 2 ,
113112 байтПопробуйте онлайн!
Без импорта
источник
Сетчатка 0.8.2 , 21 байт
Попробуйте онлайн! Ссылка включает в себя тестовые случаи.
9
становитсяa
. Объяснение: регулярное выражение соответствует всем конечным символамf
s и-
s плюс один предшествующий символ. Затем транслитерация циклически увеличивает эти символы, как если бы они были шестнадцатеричными цифрами. Альтернативный подход, также 21 байт:Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Работает, уменьшая ввод, чтобы упростить транслитерацию. Поэтому будет 15 байтов, если он должен поддерживать только нижний регистр. Попробуйте онлайн! Ссылка включает в себя тестовые случаи.
источник
MATLAB, 138 байт
Исправлена ошибка, когда в чанке все нули. Также много играл в гольф, злоупотребляя try / catch. Чистый результат: 0 байтов сохранено.
Попытка «обмануть» с помощью
java.util.UUID
неудачной попытки, посколькуlong
возвращаемое значение возвращаетсяjava.util.UUID.get[Most/Least]SignificantBits
в a,double
что приводит к потере точности. Я приглашаю вас взглянуть на этот стол и молча произнести "... но почему? "объяснение
В
hex2dec
функции выплевываетdouble
, поэтому он не может обрабатывать весь GUID сразу же, чтобы избежать превышенияflintmax
. Вместо этого мы должны обработать кусок GUID с помощью chunck, используяsplit
. Переменнаяa
проверяет, нужно ли нам переносить единицу, и обманным путем также является начальным шагом, который мы добавляем. Условием переноса является то, что длины исходной и увеличенной строк больше не равны.Оригинальная версия была чуть менее 160 байтов, поэтому я хотел бы думать, что это не должно быть легко переиграть.
источник
Python 2 , 99 байт
Попробуйте онлайн!
Нет
uuid.UUID
использования.источник
C # (интерактивный компилятор Visual C #) , 77 байт
Попробуйте онлайн!
-1 байт благодаря @ASCIIOnly!
Анонимная функция, которая принимает в
char[]
качестве входных и выходных данных путем изменения аргумента .Ввод сканируется справа налево и заменяется с использованием следующих правил.
-
Символ игнорируется , и обработка продолжаетсяF
Символов преобразуется в0
и обработка продолжается9
Символов преобразуется вA
и обработка прекращаетсяA-E
и0-8
увеличиваются на 1 и обработка останавливаетсяисточник
==70
->>69
Powershell, 101 байт
Попробуйте онлайн!
Нет внешней библиотеки или шестнадцатеричное преобразование. Любая длина строки. Строчные и прописные буквы допускаются. Входная строка, соответствующая
^[f-]*$
тоже разрешена.Этот сценарий сканирует заднюю часть строки и вставляет каждый символ в значение из хеш-таблицы:
-
: приращение = 1-19
: приращение = 1 + 7, результат =A
F
: приращение = 1-23, результат =0
f
: приращение = 1-55, результат =0
Далее скрипт использует,
$p
чтобы определить, следует ли увеличивать текущий символ.Тестовый скрипт:
Выход:
источник
Perl 6 , 65 байт
Попробуй это
источник
Желе , 20 байт
-2 (и исправление ошибки) благодаря Денису!
Попробуйте онлайн!
источник
PowerShell , 126 байт
Попробуйте онлайн!
Довольно тривиальный ответ. Просто думал, что я добавлю любимый PowerShell в список :)
источник
JavaScript (Node.js) , 78 байт
Попробуйте онлайн!
источник
Perl 5, 64 байта
Необходимое здесь количество круглых скобок меня огорчает, но
->
связывает очень тесно, так как->as_hex
это самый быстрый способ найти вывод в шестнадцатеричном формате.Беги с
perl -Mbigint -p
. По сути, он просто преобразует число в шестнадцатеричное значение bigint, добавляет его, а затем подставляет цифры результата обратно в исходное значение, оставляя штрихи нетронутыми.источник
Ржавчина, 258 байт
да это долго .. но технически это только одна строка с 1 выражением? и никаких модных библиотек? и он не будет падать на вход Fuzz? ungolf:
попробуйте на ржавчины площадка
источник
16/32/64-битный код сборки x86, 28 байт
байты: 83C623FDAC3C2D74FB403C3A7502B0613C677502B03088460173E9C3
код:
Звоните с ESI, указывая на GUID. Замените ESI на SI для 16-битного или RSI для 64-битного (и +2 байта).
источник
C (лязг) , 62 байта
Попробуйте онлайн!
источник
Common Lisp, 166 байт
Попробуйте онлайн!
источник