Анаграмма времени

29

Первоначально опубликовано (и удалено) @Tlink , который, скорее всего, был вдохновлен этим вопросом StackOverflow .
Так как это было позором, это было удалено, потому что это казалось хорошим испытанием в целом, я решил, что перепечатал бы это с надлежащим форматированием и правилами. (Я пытался связаться с @Tlink и получить его / ее разрешение на публикацию, но он не отвечает больше, поэтому я решил опубликовать его сейчас.)

Входные данные: шесть цифр.

Вывод: либо первое, либо последнее действительное время в 24-часовом формате (00:00:00 через 23:59:59). (Вы можете сами выбрать, выводите ли вы первое или последнее действительное время.)

Пример:

Когда входные данные 1,8,3,2,6,4, могут быть созданы следующие времена:

12:36:48    12:38:46    12:46:38    12:48:36
13:26:48    13:28:46    13:46:28    13:48:26
14:26:38    14:28:36    14:36:28    14:38:26
16:23:48    16:24:38    16:28:34    16:28:43
16:32:48    16:34:28    16:38:24    16:38:42
16:42:38    16:43:28    16:48:23    16:48:32
18:23:46    18:24:36    18:26:34    18:26:43
18:32:46    18:34:26    18:36:24    18:36:42
18:42:36    18:43:26    18:46:23    18:46:32
21:36:48    21:38:46    21:46:38    21:48:36
23:16:48    23:48:16

Таким образом , мы выведем либо 12:36:48или23:48:16 в этом случае, будучи первым / последним соответственно.

Правила соревнований:

  • Укажите, будете ли вы указывать первое или последнее действительное время в своем ответе.
  • Ввод / вывод является гибким. Ввод может быть шесть отдельных целых чисел; строка, содержащая шесть цифр; целочисленный список / массив; одно (возможно восьмеричное) число; и т.д. Вывод может быть правильно упорядоченным списком / массивом цифр; Строка в формате HH:mm:ss/ HHmmss/ HH mm ss; каждая цифра печатается с разделителем новой строки; и т. д. Ваш звонок.
  • Вам разрешается брать цифры в любом порядке, в котором вы хотите, поэтому они уже могут быть отсортированы от минимального к максимальному или наоборот.
  • Если с указанными цифрами (т. Е. 2,5,5,5,5,5) Не может быть создано правильное время , сделайте это так, как вам хочется. Может вернуться null/ false; "Not possible"; сбой с ошибкой; и т. д. (Нельзя вывести недопустимое время, например 55:55:52, или другое допустимое время,00:00:00 .) Пожалуйста, укажите, как он обрабатывает входы, для которых не может быть создано допустимое время.
  • Вам не разрешено выводить все возможные допустимые времена. Только самые ранние / самые последние должны быть выведены / возвращены.
  • 24для часов (то есть 24:00:00) или 60для минут / секунд (то есть 00:60:60) не действительны. Диапазоны указаны [00-23]для часов, [00-59]минут и секунд.

Основные правила:

  • Это , поэтому выигрывает самый короткий ответ в байтах.
    Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте придумать как можно более короткий ответ для «любого» языка программирования.
  • К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
  • По умолчанию лазейки запрещены.
  • Если возможно, добавьте ссылку с тестом для вашего кода.
  • Также, пожалуйста, добавьте объяснение, если это необходимо.

Тестовые случаи:

Input:          Earliest output:     Latest output:

1,2,3,4,6,8     12:36:48             23:48:16
2,5,5,5,5,5     None possible        None possible
0,0,0,1,1,1     00:01:11             11:10:00
1,1,2,2,3,3     11:22:33             23:32:11
9,9,9,9,9,9     None possible        None possible
2,3,5,5,9,9     23:59:59             23:59:59
1,2,3,4,5,6     12:34:56             23:56:41
0,0,0,0,0,0     00:00:00             00:00:00
1,5,5,8,8,8     18:58:58             18:58:58
1,5,5,5,8,8     15:58:58             18:58:55
1,1,1,8,8,8     18:18:18             18:18:18
Кевин Круйссен
источник
1
Разве не 23:48:16допустимый вывод для примера?
TFeld
я должен вывести только один из самых ранних / последних раз или оба?
февраля
@tsh Только один. Какой из них зависит от вас. Два ответа Python пока что выводят самые ранние.
Кевин Круйссен
Разве «действительное время» не учитывает какие-либо дополнительные секунды? Например, будет 06:08:60ли допустимо, учитывая, что в течение этой минуты была скачок секунды?
Эрик Outgolfer
@EriktheOutgolfer Нет, 60минуты и секунды недействительны. Диапазоны [00-23], [00-59]и [00-59]. Уточню это в вызове.
Кевин Круйссен

Ответы:

9

C (gcc) , 186 174 байта

D[7]={0,1,10,100,1e3,1e4,1e5};G(O,L,F,T,I,M,E){if(!F)O=L<24e4&L%10000<6e3&L%100<60?L:1e9;else{for(T=1e9,I=0;I++<F;M=G(O/10,L*10+E,F-1),T=T>M?M:T,O=(O/10)+E*D[F])E=O%10;O=T;}}

Попробуйте онлайн!

-12 байт благодаря Кевину Круйссену

Вероятно, не оптимально, но это работает. Как ни странно, по какой-то причине с 7 аргументами реализация gcc на TIO требует, чтобы вы на самом деле предоставили их, или она вызывает ошибки. Однако на моей машине это не нужно.

Формат: G (X, 0,6) -> Y, где X - это 6-значное число, цифры которого должны использоваться, а Y - это 6-значное число, которое, если принять его за время (вставив: соответственно), является минимальным.

LambdaBeta
источник
2
Я думаю , что вы можете играть в гольф {0,1,10,100,1000,10000,100000}в {0,1,10,100,1e3,1e4,1e5}. Кроме того, вы можете играть for(I=0;I<F;++I){E=O%10;M=G(O/10,L*10+E,F-1);T=T>M?M:T;O=(O/10)+E*D[F];}в гольф for(I=0;I++<F;M=G(O/10,L*10+E,F-1),T=T>M?M:T,O=(O/10)+E*D[F])E=O%10;и снимать скобки по всему if. Попробуйте онлайн 174 байта . Также мне нравится G(O,L,F,T,I,M,E). :)
Кевин Круйссен
Забавно, на моей машине использование ...1e3,1e4,1e5}не сработало. Спасибо за предложение.
LambdaBeta
Ты повсюду на ответах этого парня, @ceilingcat, кстати, приятно играть в гольф.
Захари
Я ценю понимание. Всегда приятно видеть, что люди действительно читают ответы и находят способы их улучшить. :) Ты повсюду на них тоже.
LambdaBeta
130 байт
floorcat
6

Хаскелл , 114 96 86 байт

import Data.List
f l=minimum[x|x@[a,b,c,d,e,f]<-permutations l,a:[b]<"24",c<'6',e<'6']

Теперь с менее строгим выводом. Принимает ввод в виде строки цифр и сравнивает перестановки с ограничениями при сравнении списка. С минутами и секундами проверяется только первая цифра. Вылетает и горит, если перестановка не является допустимым временем.

Попробуйте онлайн!

Angs
источник
5

Python 2 , 131 115 112 109 105 88 байт

lambda s:min(d for d in permutations(s)if(2,4)>d[:2]>d[4]<6>d[2])
from itertools import*

Попробуйте онлайн!

Ввод / вывод - это списки целых чисел

Выдает ошибку, если время не возможно


Альтернатива:

Python 2 , 88 байт

lambda s:max(d*((2,4)>d[:2]>d[4]<6>d[2])for d in permutations(s))
from itertools import*

Попробуйте онлайн!

Возвращает самое позднее время

Возвращает пустой кортеж для неверных времен


Сохраненный

  • -21 байт, благодаря овсу
TFeld
источник
5

05AB1E , 20 15 байт

Введите как отсортированную строку.
Выводим наименьшее время в виде строки.
В случае отсутствия решения выводится пустой список.

œʒ2ô•3Èñ•2ô‹P}н

Попробуйте онлайн!

Emigna
источник
5

JavaScript (ES6), 93 89 88 байт

Ожидается массив из 6 цифр, отсортированный по убыванию. Возвращает либо 6-значную строку первого действительного времени, либо, falseесли решения не существует.

f=(a,t='')=>t<24e4&/..([0-5].){2}/.test(t)?t:a.some((v,i)=>s=f(a.filter(_=>i--),t+v))&&s

Попробуйте онлайн!

комментарии

Мы рекурсивно пробуем все перестановки входных данных, пока не найдем тот, который проходит гибридный тест, используя как арифметическое, так и регулярное выражение.

f = (                       // f = recursive function taking
  a, t = ''                 // a[] = input array and t = current time
) =>                        //
  t < 24e4 &                // if t is less than 240000
  /..([0-5].){2}/.test(t) ? // and it matches "hhMmSs" with M and S in [0-5]:
    t                       //   return t
  :                         // else:
    a.some((v, i) =>        //   for each digit v at position i in a[]:
      s = f(                //     save in s the result of a recursive call with:
        a.filter(_ => i--), //       a copy of a[] with the current digit removed
        t + v               //       the current digit appended to t
      )                     //     end of recursive call
    ) && s                  //   end of some(); if truthy, return s
Arnauld
источник
5

Japt , 17 байт

Принимает ввод в виде строки цифр и выводит первое действительное время; циклы бесконечно, если нет действительного времени.

á
@øXr':}a@ÐX ¤¯8

Попытайся

Предупреждение: очень медленно - добавьте *1000после второй, Xчтобы немного ускорить его. И не забывайте, что неверный ввод создаст бесконечный цикл и может привести к сбою вашего браузера.


объяснение

                   :Implicit input of string U
á                  :Get all permutations of U
\n                 :Reassign that array to U
      }a           :Loop until true and then return the argument that was passed
        @          :By default that argument is an integer X which increments on each loop so first we'll pass X through a function
         ÐX        :  new Date(X)
            ¤      :  Get the time
             ¯8    :  Slice to the 8th character to get rid of the timezone info
@                  :The function that tests for truthiness
  Xr':             :  Remove all colons in X
 ø                 :  Does U contain the resulting string?
мохнатый
источник
5

Retina , 77 74 69 65 62 байта

$
:
6+Lv$`(.)(.*):
$%`$2:$1$%'
O`
0L`([01].|2[0-3])([0-5].){2}

Попробуйте онлайн! Выводит самое раннее время или пустую строку, если время не найдено. Редактировать: 5 @ байт благодаря @TwiNight. Объяснение:

$
:
6+Lv$`(.)(.*):
$%`$2:$1$%'

Генерация всех перестановок. :Работает свой путь , хотя строка , как перестановки генерируются, в конечном итоге на старте.

O`

Сортируйте время по порядку.

0L`([01].|2[0-3])([0-5].){2}

Выведите первое действительное время.

Нил
источник
Поскольку вы можете выводить цифры, разделенные символом новой строки, вы можете сохранить 5 байтов
TwiNight
Вы даже можете удалить: на этапе grep, так как он должен соответствовать 6 символам, а первый должен быть 0, 1 или 2
TwiNight
@TwiNight О, если Grep короче, чем я, я все равно могу сохранить еще 4 байта.
Нил
Ах да, вы можете простоL0
TwiNight
@TwiNight на 0Gсамом деле.
Нил
4

Красный , 157 124 байта

Спасибо Кевину Круйссену за то, что он напомнил мне, чтобы он читал подробности!

func[s][a: 0:0:0 loop 86400[b: to-string a a: a + 1 if b/1 =#"0"[insert b"0"]if s = sort replace/all copy b":"""[return b]]]

Попробуйте онлайн!

Принимает отсортированную строку в качестве ввода. Возвращает, noneесли не удается выделить время.

Объяснение:

f: func[s][                                    ; the argument is a sorted string of digits
    a: 0:0:0                                   ; time object, set to 00:00:00 h 
    loop 86400 [                               ; loop through all seconds in 24 h
        b: to-string a                         ; convert the time to string 
        a: a + 1                               ; add 1 second to the current time   
        if b/1 = #"0" [                        ; prepend "0" if necessary
            insert b "0"                       ; (Red omits the leading 0)
        ]
        if s = sort replace/all copy b ":" ""[ ; compare the input with the sorted time
            return b                           ; return it if they are equal 
        ]
    ]
]
Гален Иванов
источник
3
Является ли sortв начале необходимо? В состоянии задача I: « Вы имеете право взять цифры в любом порядке , вы хотите, чтобы они уже могут быть отсортированы от низшего к высшему или наоборот. »
Кевин Cruijssen
@Kevin Cruijssen - Нет, в этом нет необходимости. Я обновлю решение для работы с отсортированным вводом. Спасибо!
Гален Иванов
3

Python 2 , 78 байт

lambda s:min(x for x in range(62**3)if x%100<60>x/100%100<s==sorted('%06d'%x))

Попробуйте онлайн!

Арно сохранил байт. Благодарность!

Ожидается список как ['1','2','3','4','6','8']в отсортированном порядке:

Вам разрешается брать цифры в любом порядке, в котором вы хотите, поэтому они уже могут быть отсортированы от минимального к максимальному или наоборот.

Выводит целое число, как 123648для 12:36:48. Я надеюсь, что это приемлемо.

Линн
источник
2
Не могли бы вы использовать 62**3вместо 240000?
Арно
3

Japt , 39 23 байта

Я уверен, что есть более короткий способ сделать это, но я хотел попробовать использовать объекты Date в Japt.

á ®¬ò q':Ãf@T<ÐXiSiKÅ
Ì

á                     // Get all permutations of the input array.
  ®¬ò q':à            // [1,2,3,4,5,6] -> "12:34:56"
          f@          // Filter the results, keeping those that
            T<        // are valid dates
              ÐXiSiKÅ // when made into a date object.
Ì                     // Return the last remaining item, if any.

Принимает ввод в виде отсортированного массива чисел, возвращает последнее действительное время или пустой вывод, если его не существует.
Потерял 10 фунтов байтов благодаря Shaggy .

Попробуй это здесь .

гнида
источник
25 байтов
лохматый
@ Shaggy Спасибо, очень аккуратно. До сих пор я не знал, что у Джапта есть отдельный раздел в методических документах для дат, что мне кажется довольно глупым, я просто пытался обойтись без них.
Нить
3

Рубин , 68 67 62 56 55 байт

->*b{b.permutation.find{|a,b,c,d,e|c<6&&e<6&&a*9+b<22}}

Попробуйте онлайн!

Входные данные: отсортировано массив цифр (в виде целых чисел).

Вывод: массив цифр или, nilесли решение не найдено

гигабайт
источник
Вы можете оставить место на eval "я думаю.
Кевин Круйссен
Да, это работает, спасибо.
GB
Я думаю, что вы можете сделать a*9+b<22для одного байта.
JayCe
2

Желе , 17 байт

Я почти уверен, что это не самый короткий подход ... рассмотрим это позже :)

Œ!s2Ḍ<ẠʋÐṀ“ð<<‘ṢḢ

Попробуйте онлайн!

Джонатан Аллан
источник
Вы правы, это не самый короткий подход. Однако публичное унижение нехорошо, поэтому я пока не буду комментировать улучшения. :)
Эрик Outgolfer
Тот факт, что входные данные можно считать отсортированными, спасает некоторые. Это не унизительно видеть лучше, потратив всего 2 минуты на гольф!
Джонатан Аллан
Чтобы быть более точным, вы можете сделать это в 15 байтов; чтобы сохранить один байт, нужно сделать что-то тривиальное; чтобы спасти другого, это не так тривиально. Имейте в виду, я собирался опубликовать эту 15-байтовую версию, но она использует ваш подход. Кстати, у тебя все в порядке?
Эрик Outgolfer
Идите и отправьте. Здоровье в порядке, я на работе, поэтому не могу тратить время на гольф !!
Джонатан Аллан
Опубликовано. Теперь вы можете понять, почему я имел в виду «унижение». : P
Эрик Outgolfer
2

Wolfram Language (Mathematica) , 63 байта

FirstCase[Permutations@#,{a:0|1|2,b_,c_,_,d_,_}/;a*b-4<6>d>=c]&

Попробуйте онлайн!

Принимает отсортированный список цифр в качестве ввода. Возвращает Missing[NotFound]для неверных входных данных.

объяснение

Permutations@#

Найти все перестановки ввода. Поскольку входные данные отсортированы, гарантируется, что все допустимые значения времени будут в порядке возрастания.

FirstCase[ ... ]

Найти первый список, который соответствует ...

{a:0|1|2,b_,c_,_,d_,_}

Первый элемент, обозначенный a, равно 0, 1 или 2, и маркируют второй, третий и пятый элементы b, cи , dсоответственно , ...

... /;a*b-4<6>d>=c

... таким образом, что a*bсоставляет менее 10, а dи cменее чем 6, с d >= c.

Хитрость заключается в том, что для всех номеров 00в24 , произведение двух цифр не более 9, а возможные недействительных числа 25к 29(так как мы заставляем первую цифру 0, 1 или 2) есть продукт наименее 10.

Юнг Хван Мин
источник
2

Pyth , 37 байт

j\:hf&&<shT24<s@T1 60<seT60mcs`Md2S.p

Тестирование

Объяснение:
j\:hf&&<shT24<s@T1 60<seT60mcs`Md2S.pQ # Code with implicit variables
   h                                   # The first element of
                                   .pQ # The list of all permutations of the input list
                                  S    # Sorted
                           mcs`Md2     # Mapped to three two digit long strings
    f                                  # Filtered on whether
       <shT24                          #  The first number is less than 24
      &      <s@T1 60                  #  AND the second number is less than 60
     &               <seT60            #  AND the third number is less than 60
j\:                                    # Joined by a colon
hakr14
источник
2

Perl 5 с -palF, 73 байта

$"=",";($_)=grep@F~~[sort/./g]&/([01]\d|2[0-3])([0-5]\d){2}/,glob"{@F}"x6

Попробуйте онлайн!

Выходы как HHmmss и выводит пустую строку для недействительных записей.

Каждый ответ, который я сделал недавно, использовался globдля перестановок ... Странно!

Дом Гастингс
источник
2

Bash + GNU sed, 83 , 72 , 69 байт

  • Принимает ввод как 6 отдельных аргументов;
  • Возвращает самое раннее время (если найдено);
  • Ничего не возвращает (пустой вывод), если не существует допустимой комбинации.

seq 0 86399|sed "s/^/date +%T -ud@/e;h;`printf s/%d//\; $@`/\w/d;x;q"

Как это работает

Предварительно сгенерируйте все возможные строки времени для отметок времени в диапазоне от 0 до 86399, используя команду GNU-sed e (xecute) + date.

%seq 0 86399|sed "s/^/date +%T -ud@/e;h;"

00:00:00
00:00:01
...
23:59:59

Создайте sedсценарий с 6 последовательными командами замещения для каждой входной цифры.

%echo sed `printf s/%d//\; $@`

sed s/1//;s/2//;s/3//;s/4//;s/6//;s/8//;

Затем примените подстановки, удалите все входные строки, у которых есть хотя бы одна оставшаяся цифра, выведите первую совпадающую строку (исходная строка времени извлекается из пространства удержания с помощью x)

%echo 23:45:12|sed 's/1//;s/2//;s/3//;s/4//;s/6//;s/8//;'
:5:2 //non-matching, delete

%echo 12:36:48|sed 's/1//;s/2//;s/3//;s/4//;s/6//;s/8//;'
:: //matching, print and stop

Тест

%./timecomb 1 2 3 4 6 8
12:36:48
%./timecomb 2 5 5 5 5 5
%./timecomb 0 0 0 1 1 1
00:01:11
%./timecomb 1 1 2 2 3 3
11:22:33
%./timecomb 9 9 9 9 9 9
%./timecomb 2 3 5 5 9 9
23:59:59
%./timecomb 1 2 3 4 5 6
12:34:56
%./timecomb 0 0 0 0 0 0
00:00:00
%./timecomb 1 5 5 8 8 8
18:58:58
%./timecomb 1 5 5 5 8 8
15:58:58
%./timecomb 1 1 1 8 8 8
18:18:18

Попробуйте онлайн!

дирижабль
источник
2

Котлин , 396 391 389 байт

Понятия не имею, как сделать это меньше. Я думаю, что это вдвое больше, чем возможно. Производит самое раннее время. Спасибо Кевину за 7 байтов!

fun p(d:Array<Int>)={val s=Array(6,{0})
val f=Array(6,{1>0})
val t=Array(3,{0})
val o=Array(3,{60})
fun r(i:Int){if(i>5){var l=0>1
var e=!l
for(p in 0..2){t[p]=s[p*2]*10+s[p*2+1]
l=l||(e&&t[p]<o[p])
e=e&&t[p]==o[p]}
if(t[0]<24&&t[1]<60&&t[2]<60&&l)for(p in 0..2)o[p]=t[p]}
else
for(p in 0..5)if(f[p]){f[p]=0>1
s[i]=d[p]
r(i+1)
f[p]=1>0}}
r(0)
if(o[0]>23)0
else "${o[0]}:${o[1]}:${o[2]}"}()

Попробуйте онлайн!

JohnWells
источник
2
Я не знаю Kotlin, но тебе действительно нужно и то, var l=0>1и другое var e=1>0? Кроме того, зачем l=lи e=eнужно? Две вещи, которые, кажется, работают в гольфе, - var e=1>0это var e=!lудаление пространства раньше "None". Кроме того, любой вывод фальси в порядке, так что "None"может быть просто 0.
Кевин Круйссен
@Kevin спасибо за 5 байтов. В шоке я пропустил одного из них. Поскольку я не отменяю цикл, я все равно не вижу, чтобы не знать, остались ли два раза равными, чтобы я мог решить, что новый раз меньше. Я кодировал кучу способов, и это оказалось самым коротким. Тем не менее, общий код намного больше, чем мне нравится.
Джон Уэллс,
1
Еще 2 байта для гольфа в вашей последней версии: "0"может быть просто0
Кевин Круйссен
@Kevin, который не будет типом String, и я должен добавить: Any, чтобы разрешить как String, так и Int.
Джон Уэллс,
1
Хмм хорошо. Тем не менее, он работает в TIO и по-прежнему печатает 0без ошибок. А ваша текущая функция, насколько я могу судить, не указывает тип возвращаемого значения, так что не все равно будет неявно возвращаться как объект? PS: я совсем не знаю Kotlin, просто пробовал без кавычек, и результаты были такими же. ;) Может быть, что-то еще не работает из-за этого, чего я не знаю.
Кевин Круйссен
2

MATL , 31 30 байт

Y@3Xy[X1]X*!Y*t[4XX]6*<!AY)1Y)

Попробуйте онлайн!

Входные данные - 6 целых чисел, выходные данные - минимальные часы, минуты и секунды в массиве. Сбои для входов, где такое время невозможно.

(-1 байт благодаря @Luis Mendo.)

sundar - Восстановить Монику
источник
Я думаю, что вы можете заменить 2&Aна !A, потому что двоичная матрица никогда не будет вектором строк
Луис Мендо
1

Stax , 15 байт

╝a╣=→aá≈#8(⌂≈58

Запустите и отладьте его

Для ввода требуется строка отсортированных цифр. Возвращает первую перестановку, которая удовлетворяет нескольким критериям.

  • лексикографически меньше "24"
  • все три пары символов лексикографически меньше «6»
рекурсивный
источник
1

Сетчатка , 58 47 байт

+,V^2`[0-5][6-9]{2}
G`([01].|2[0-3])([0-5].){2}

Попробуйте онлайн!

Ввод 6 цифр в отсортированном порядке. Выходные данные состоят из 6 цифр, представляющих самое раннее допустимое время, или пустой строки, если допустимого времени не существует.

РЕДАКТИРОВАТЬ: я был идиотом, -9 байт

объяснение

Алгоритм

Для краткости давайте определим младшую цифру 0-5, а старшую цифру 6-9.

Во-первых, переставьте цифры таким образом, чтобы "low" или "high" в каждой позиции были правильными. Правильное расположение для каждого числа старших цифр на входе:

# of highs  arrangment
0           LLLLLL
1           LLLLLH
2           LLLHLH
3           LHLHLH
4+          Not possible

Так как любая перестановка потерпит неудачу, последняя проверка на входе имеет 4+ старших разряда, мы можем полностью проигнорировать этот случай.

Затем отсортируйте минимумы и максимумы по отдельности. В сочетании с перегруппировкой это дает наименьшее значение, которое удовлетворяет ограничениям минут и секунд. Так что это дает самое раннее действительное время, если таковое существует.

Наконец, проверьте, что у нас есть правильное время. Если нет, откажитесь от строки.


программа

+,V^2`[0-5][6-9]{2}

Сопоставляет LHHи заменяет первые две цифры в этом (становится HLH) и повторяет это, пока больше не LHHсуществует. Это дает правильное расположение.

На самом деле я солгал. Сортировка не требуется, потому что 1) обмен происходит только между соседними цифрами и только между низким и высоким; и 2) вход отсортирован. Таким образом, минимумы и максимумы по отдельности уже в порядке сортировки.

G`([01].|2[0-3])[0-5].[0-5].

Сохраняет строку, только если это правильное время

TwiNight
источник