Установка времени

27

Представьте себе следующие 24-часовые часы, которыми можно управлять с помощью клавиш со стрелками:

╔══╗ ┌──┐
║00║:│00│
╚══╝ └──┘
 HH   mm

Двойное нажатие стрелки вверх ( ↑↑) увеличит текущее значение часа:

╔══╗ ┌──┐
║02║:│00│
╚══╝ └──┘
 HH   mm

Нажатие стрелки вправо ( ) сфокусирует другой вход.

┌──┐ ╔══╗
│02│:║00║
└──┘ ╚══╝
 HH   mm

Нажатие стрелки вниз трижды ( ↓↓↓) теперь уменьшит этот ввод.

┌──┐ ╔══╗
│02│:║57║
└──┘ ╚══╝
 HH   mm

Коротко говоря:

  • Стрелка вверх ( ) увеличивает текущий активный вход.
  • Стрелка вниз ( ) уменьшит активный вход.
  • Стрелка вправо ( ) переместит фокус на правый вход.
  • Стрелка влево ( ) переместит фокус на левый вход.
  • Движение вверх и вниз зациклится, как и ожидалось, для ввода времени.
  • Левое и правое движение не вращаются вокруг.

Соревнование

Часы запускаются 00:00с активным входом часа (см. Первую схему). Учитывая список команд ввода, выведите полученное время в HH:mmформате.
Ввод может быть либо строкой, либо списком (или вашим языковым эквивалентом), где разные направления ввода могут быть одним из следующих параметров:

  • ↑↓←→
  • udlr
  • ^v<>
  • фактические нажатия клавиш со стрелками, если ваша программа имеет графический интерфейс

Применяются стандартные лазейки.

Контрольные примеры

↑↑→↓↓↓ = 02:57
↓→↑←↑→↓ = 00:00
↓→→↓ = 23:59
←←←←→↑ = 00:01
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓→↓ = 23:59
гнида
источник
1
@JonathanFrech Один из указанных вариантов, например, выбор любых четырех уникальных значений (например 0123), значительно упростит задачу в некоторых языках, но не принесет пользы другим.
Нить
1
@LuisfelipeDejesusMunoz Да, это действительно написано в соответствии с правилами ввода.
Нит
3
Я думаю, что это было бы более сложным, если бы он включал секунды. Это будет иметь больше логики, за которой в настоящее время в фокусе
Джо Кинг
3
Отсутствует специальное правило для обработки кода Konami.
coredump
1
@coredump Рассматривал это, но это, вероятно, заняло бы больше места, чем ядро ​​ответа в большинстве языков.
Нит

Ответы:

39

HTML в Google Chrome 67 на китайском (упрощенный), 39 байт

<input type=time value=00:00 autofocus>

Скриншот

Chrome показывает разные компоненты интерфейса на другом языке. Даже простой ввод времени: AM / PM будет отображаться, если вы используете английский (США). Если вы хотите проверить это, изменив язык вашего Chrome. Не думайте о том, как изменить это обратно.

ТТГ
источник
2
dudee !! хахах, я думаю, что это не верно
Луис Фелипе Де Хесус Муньос
2
Двойной удар AM/PMмне
удался
1
@ JoKing Я думаю, что это зависит от локали / настроек?
Нит
1
@JoKing Это зависит от локали. Может быть, попробуйте изменить язык вашего Chrome на упрощенный китайский? (Не массой до , как изменить его обратно.)
TSH
1
Работает на firefox 61.0.1
Франциско Хан
12

C (gcc) , 117 107 байтов

  • Сохранено десять байтов благодаря l4m2 .
t,i,m[8];e(char*_){for(*m=i=2[m]=0;t=*_++;t<63?i=t%4:(i[m]+=t&8?1:'w'));printf("%02d:%02d",*m%24,2[m]%60);}

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

Джонатан Фрех
источник
4
Хорошее именование переменных.
Нит
# C (gcc) , 107 байт <! - language-all: lang-c -> t,i,m[8];e(char*_){for(*m=i=2[m]=0;t=*_++;t<63?i=t%4:(i[m]+=t&8?1:119));printf("%02d:%02d",*m%24,2[m]%60);} Попробуйте онлайн!
м2
6

Stax , 36 35 33 32 байта

áXò↑─↨√▓|êóÇiU&≡Q#┤Æ⌡⌠╟C▐╜√⌡∟▄╩╠

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

Использует lrud.

Объяснение:

'l/{'r/Bs$2lmM{${:14-m|+i36*24+%2|zm':* Full program,
'l/                                     Split the string on "l"
   {        m                           Map over the resulting array
    'r/                                   Split at "r"
       B                                  Uncons left, first on TOS (top of stack)
        s                                 Swap to get tail to top
         $                                Flatten; this removes multiple 'r's
          2l                              Listify two items, BOS (bottom of stack) is first element
             M                          Transpose: get [hour commands, minute commands]
              {                    m    Map:
               $                          Flatten
                {    m                    Map over single commands:
                 :1                         Number of set bits: 5 for 'u', 3 for 'd'
                   4-                       Subtract 4: u -> 1, d -> -1
                      |+                  Sum
                        i                 Iteration index: hours -> 0, minutes -> 1
                         36*24+           Multiply by 36, add 24: 0 -> 24, 1 -> 60
                               %          Modulo, this does -5 % 60 = 55
                                2|z       Stringify, left-padding with "0" to length 2
                                    ':* Join on ":"
                                        Implicit output
Wastl
источник
5

C # (.NET Core) , 149 132 байта

s=>{var p=0;int[]h={0,0};foreach(var c in s)h[p=c<63?c/2%2:p]+=c>62?c>95?-1:1:0;return$"{(h[0]%24+24)%24:D2}:{(h[1]%60+60)%60:D2}";}

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

Использование ^v<>.

Это заставило меня понять, что оператор по модулю в C # не работает должным образом, потому что в C # -1 % 60 = -1, поэтому мне нужно выполнить эту странную операцию в конце.

Чарли
источник
Нельзя заменить (h [1]% 60 + 60)% 60 на (h [1] +60)% 60?
IanF1
2
@ IanF1 нет, ты не можешь. Что если пользователь нажимает кнопку «вниз» 100 раз? Или 1000 раз?
Чарли
спасибо за разъяснения :) мне удивительно, что этот способ короче, чем применение модуля на лету (с 59 вместо -1).
IanF1
5

Lua (каркас love2d), 311 308 байт

l,b,d,t,f,a=love,{24,60},{1,-1},{0,0},1,{"left","right","up","down"}function c(n,i)t[f]=(n+d[i])%b[f]end function l.draw()h,m=t[1],t[2]l.graphics.print((h<10 and 0 ..h or h)..":"..(m<10 and 0 ..m or m),0,0)end function l.keypressed(k)for i,n in pairs(a)do f=k==n and(i>2 and(c(t[f],i-2)or f)or i)or f end end

Безрукавная версия:

--initialize all needed values
l,b,d,t,f,a=love,{24,60},{1,-1},{0,0},1,{"left","right","up","down"}

--increase the numbers depending on the focus and up or down
function c(n,i)
  t[f]=(n+d[i])%b[f]
end 

--draw the time to the screen
function l.draw()
  h,m=t[1],t[2]
  l.graphics.print((h<10 and 0 ..h or h)..":"..(m<10 and 0 ..m or m),0,0)
end

--get the keys and check if it is an arrow key
function l.keypressed(k)
  for i,n in pairs(a)do
    f=k==n and(i>2 and(c(t[f],i-2)or f)or i)or f 
  end 
end

Вероятно, все еще не на 100% легко читается, потому что все if заменяются на триальное утверждение (..and .. или) :)

если он запущен в main.lua с любовью, то появится всплывающее окно, и вы можете нажать клавиши со стрелками, чтобы изменить числа

лицеи
источник
не могли бы вы также опубликовать расширенную версию для удобства чтения
ааааа говорит восстановить Монику
Конечно, я добавил расширенную версию без проблем :)
Lycea
4

MATL , 57 56 55 байт

1Oi9\"@5<?y@3-ZS*+}wx7@-X^w]]wx&Zjh24 60h\'%02d:%02d'YD

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

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

С комментариями:

1     % Push 1 on the stack
      % represents which timer box we're in, starts at hour box
      % imaginary number j would represent minutes box
O     % Push initial hour and minutes 0+0j
i9\   % Fetch input, mod each character's ASCII value by 9.
      % Gives 4 1 8 6 for ^ v > < respectively
"     % iterate through (modded) input
  @5<?     % Push current input, see if it's < 5 
           % if so, it's an up or down time change
    y        % so copy out the box indicator (1 or j)
    @3-      % Subtract 3 from the current input
    ZS       % Take the result's sign (-1 for v, 1 for ^)
    *        % Multiply indicator with that
    +        % Add the result to the time value
  }        % else, it's a right or left arrow
    wx       % so bring out the box indicator and delete it
    7@-      % Subtract current input from 7. 1 for < and -1 for >
    X^       % Take the square root of that. 1 for < and j for >
    w        % switch stack to bring time value on top again
  ]       % end if
]     % end loop
wx    % bring box indicator out, delete it
&Zj   % split the complex time value to real and imaginary
h     % then concatenate them into an array
24 60h\ % mod hour and minute values by 24 and 60 respectively
'%02d:%02d'YD % sprintf the time array with 0-padding
sundar - Восстановить Монику
источник
4

PHP , 145 134 133 байта

(-11 байт больше в гольф)

(-1 байт, используя метод цикла Давида )

<?for($h=$m=0,$a=h;$c=$argv[++$i];)$c<l?$$a--:($c>r?$$a++:$a=$c<r?h:m);$h%=24;$m%=60;printf('%02d:%02d',$h<0?$h+24:$h,$m<0?$m+60:$m);

Чтобы запустить это:

php -n -d error_reporting=0 <filename> <command_1> <command_2> ... <command_n>

Пример:

php -n -d error_reporting=0 time_setter.php u u r d d d l d

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

Заметки:

  • Чтобы сохранить некоторые байты, я использовал строки без одинарных / двойных кавычек в качестве оболочки строк. Таким образомerror_reporting=0 опция используется, чтобы не выводить предупреждения.
  • Входные команды: u d l r
night2
источник
128 байт, -6: попробуйте онлайн! (Хорошее решение, кстати :)
Давид
@ Давид: Спасибо, но у вашего обновления есть две проблемы. Во-первых, $ h не задано, поэтому его уменьшение при запуске завершается неудачно: попробуйте онлайн!
Night2
@ Дэвид: И вторая проблема возникает, когда мы переключаем час / минуту вверх или вниз более чем 24/60 раз: попробуйте онлайн!
Night2
@ Давид: Но благодаря вашему методу цикла, я мог бы уменьшить еще 1 байт: попробуйте онлайн!
Night2
ах, ладно, извините, это не совсем сработало :)
Давид
4

JavaScript, 104 103 байт

Принимает ввод как массив символов, используя <>^v.

a=>(a.map(z=>z<"^"?a=z<">":a?x+=z<"v"||23:y+=z<"v"||59,x=y=0),g=n=>`0${n}`.slice(-2))(x%24)+`:`+g(y%60)

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

мохнатый
источник
3

Haskell, 236 байт

f=u 0 0
k _ _ _ _ _ h m[]=z h++':':z m
k a b c d e h m(q:s)=case q of{'^'->e(a h)(b m)s;'v'->e(c h)(d m)s;'>'->v h m s;'<'->u h m s}
u=k(o(+)24)id(o(-)24)id u
v=k id(o(+)60)id(o(-)60)v
o f m x=mod(f x 1)m
z n|n<10='0':show n
z n=show n

fявляется основной функцией и имеет тип String -> String:

*Main> f "^^>vvv"
"02:57"
*Main> f "v>^<^>v"
"00:00"
*Main> f "v>>v"
"23:59"
*Main> f "<<<<>^"
"00:01"
*Main> f "vvvvvvvvvvvvvvvvvvvvvvvvv>v"
"23:59"

По сути uи vявляются взаимно рекурсивными функциями типа Integer -> Integer -> String -> String. Они берут час, минуту и ​​список символов в наборе {v,^,<,>}и возвращают строку времени. uдействует так, как будто выделен часовой циферблат, рекурсивно вызываяu если заголовок списка находится {v,^}, и vесли заголовок списка находится в{<,>} .vпохоже, но для минутного набора.

Все остальное просто сохранение персонажей.

AlexJ136
источник
3

Lua , 132 байта

loadstring's,t,m=1,{0,0},{24,60}for c in(...):gmatch"."do t[s]=(t[s]+(("d u"):find(c)or 2)-2)%m[s]s=("lr"):find(c)or s end return t'

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


объяснение

Это анонимная функция (способ ее использования показан по ссылке).

s=1 -- s will control the selection (1 is hour and 2 min)
t={0,0} -- is the time itself
m={24,60} -- is the maximum for each 'box' (hour or min)
-- I've actually used Lua's multiple variable assignment: s,t,m=1,{0,0},{24,60}

for c in (...):gmatch(".") do -- go through each character of the input
  t[s] = (t[s] + (("d u"):find(c) or 2)-2) % m[s] -- set the current 'box' as
          t[s] +   -- itself plus ...
                  ("d u"):find(c) or 2   -- it's index on the string "d u" (that means it's going to be 1 or 3)
                                         -- or 2 if it wasn't found (if the current character doesn't sum or subtract from the box)
                                       -2   -- this adjusts the result 1, 2 or 3 to being -1, 0 or 1
                                            -- making the inputs 'd' and 'u' as -1 and +1 respectively, and an input different from both as 0
         (                               ) % m[s]   -- modulo of the maximum of the selected 'box'

  s=("lr"):find(c) or s
    ("lr"):find(c)   -- if the current input character is l or r, then set 's' (the 'box' selection) to being 1 or 2.
                   or s   -- else let it as is
end
return t -- returns 't', a table with hour and minutes respectively
Visckmart
источник
Вывод должен быть в HH:mmформате, а не в таблице
Джо Кинг,
2

Желе , 36 байт

Я считаю, что O%5;4ṣ3œṡ€4Z%3’§§%"“ð<‘DŻ€ṫ€-j”:должно работать на 32, но, œṡ похоже, в настоящее время есть ошибка .

O%5;4ṣ3i€4$œṖ"$Z%3’§§%"“ð<‘DŻ€ṫ€-j”:

Полная программа, печатающая результат в STDOUT (в виде монадической ссылки фактически возвращает смешанный список целых чисел (хотя и однозначных) и символов ( : ).

Использует udlrопцию для ввода.

Попробуйте онлайн! Или посмотрите тестовый набор .

Как?

O%5;4ṣ3i€4$œṖ"$Z%3’§§%"“ð<‘DŻ€ṫ€-j”: - Link: list of characters (in 'udlr')
O                                    - to ordinals
 %5                                  - modulo five  ...maps u:2, d:0, l:3, r:4
   ;4                                - concatenate a 4 (to always end up with both hrs & mins - even when no r is ever pressed)
     ṣ3                              - split at threes (the l presses)
       i€4$œṖ"$                      - a replacement for œṡ€4 (split each at first occurrence of)...
              $                      - | last two links as a monad:
          $                          - |   last two links as a monad:
         4                           - |     literal four
       i€                            - |     for €ach get first index of (4) else yield 0
             "                       - |   zip with:
           œṖ                        - |     partition at indices
               Z                     - transpose (to get a list of two lists of lists)
                %3                   - modulo by three. To replace any 4(r) with 1
                                     -  ...while keeping any 0(d) as 0, or 2(u) as 2
                  ’                  - decrement. All r are now 0, d are -1 and u are 1
                   §                 - sum each
                    §                - sum each. Now we have the total increase value as
                                     -    ...integers for each of hrs and mins
                       “ð<‘          - code-page indices list = [24,60]
                      "              - zip with:
                     %               -   modulo
                           D         - to decimal lists
                            Ż€       - prepend each with a zero (to cater for values less than ten)
                              ṫ€-    - tail each from index -1. Keeps rightmost two digits of each only)
                                  ”: - literal character ':'
                                 j   - join
                                     - as full program implicit print (smashes the digits and characters together)
Джонатан Аллан
источник
2

QBasic , 229 байт

Скрипт, который принимает ввод как нажатия клавиш и выводит на консоль.

Примечание: терминал "включен только для подсветки синтаксиса и не вносит вклад в bytecount

z$=CHR$(0)
DO
x=0
y=0
SELECT CASE INKEY$
CASE z$+"K"
r=0
CASE z$+"M"
r=1
CASE z$+"H"
x=1
y=1
CASE z$+"P"
x=23
y=59
END SELECT
IF r THEN m=(m+y)MOD 60ELSE h=(h+x)MOD 24
CLS
?RIGHT$("00000"+LTRIM$(STR$(h*1000+m)),5)
LOCATE 1,3
?":"
LOOP

комментарии

z$=CHR$(0)                                      ''  Set var to null char
DO                                              ''
    x=0                                         ''  Set Hours Shift to 0 
    y=0                                         ''  Set Minutes Shift to 0 
    SELECT CASE INKEY$                          ''  Take keystroke input
        CASE z$+"K"                             ''  If is Left Arrow
            r=0                                 ''    Bool to modify right (minutes) 
        CASE z$+"M"                             ''  If is Right Arrow
            r=1                                 ''    Bool to modify left (hours)
        CASE z$+"H"                             ''  If is Up Arrow
            x=1                                 ''    Set Hours Shift to 1 
            y=1                                 ''    Set Minutes Shift to 1
        CASE z$+"P"                             ''  If is Down Arrow
            x=23                                ''    Set Hours Shift to 23 
            y=59                                ''    Set Minutes Shift to 23 
    END SELECT                                  ''
    IF r THEN m=(m+y)MOD 60ELSE h=(h+x)MOD 24   ''  Shift Minutes If `r=1` Else Shift Hours
    CLS                                         ''  Clear Screen
    ?RIGHT$("00000"+LTRIM$(STR$(h*1000+m)),5)   ''  Use math to concat Hours and Minutes 
                                                ''  then Convert to String and prepend 0s 
                                                ''  to a length of 5
    LOCATE 1,3                                  ''  Cursor to the the third digit
    ?":"                                        ''  Overwrite that digit with a `:`
LOOP                                            ''  Loop
Тейлор Скотт
источник
1
Не должно ли это быть (m+y)?
Нил
В примечании, не должны ли быть делать ?
Джонатан Фрех
@JonathanFrech - Да, это должно быть. Спасибо за проверку моей грамматики
Тейлор Скотт
Извините, я думал, что mбыло несколько минут по какой-то причине ... Я вижу вашу закомментированную версию более читабельным.
Нил
2

Powershell, 109 103 байт

-6 байт благодаря AdmBorkBork

$t=0,0
$args|%{$t[+$i]+=. @{l={$i=0};r={$i=1};u={1};d={119}}.$_}
"{0:00}:{1:00}"-f($t[0]%24),($t[1]%60)

Тестовый скрипт:

$f = {

$t=0,0
$args|%{$t[+$i]+=. @{l={$i=0};r={$i=1};u={1};d={119}}.$_}
"{0:00}:{1:00}"-f($t[0]%24),($t[1]%60)

}

@(
    ,('02:57',('u','u','r','d','d','d'))
    ,('00:00',('d','r','u','l','u','r','d'))
    ,('23:59',('d','r','r','d'))
    ,('00:01',('l','l','l','l','r','u'))
    ,('23:59',('d','d','d','d','d','d','d','d','d','d','d','d','d','d','d','d','d','d','d','d','d','d','d','d','d','r','d'))
) | % {
    $e, $c = $_
    $r = &$f @c
    "$($r-eq$e): $r"
}

Выход:

True: 02:57
True: 00:00
True: 23:59
True: 00:01
True: 23:59

объяснение

Основная идея заключается в использовании a [hashtable], которые keysявляются управляющими командами и valuesявляются скриптовыми блоками. Код выполняет скрипт-блок для каждой команды из аргументов.

Mazzy
источник
1
Вы можете избавиться от него $i=0, приведя свой индекс массива, например, $t[+$i]чтобы сохранить несколько байтов. Попробуйте онлайн!
AdmBorkBork
2

Perl 6 , 101 91 89 86 байт

{$/=[];$!=0;$_>2>($!=$_-3)||($/[$!]+=$_-1)for .ords X%5;($0%24,$1%60).fmt("%02d",":")}

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

Блок анонимного кода, который принимает строку uldrсимволов и возвращает в заданном формате

Джо Кинг
источник
1

perl -F // -E, 72 байта

$x=H;/u/?$$x++:/d/?$$x--:($x=/l/?H:M)for@F;printf"%02d:%02d",$H%24,$M%60

источник
1

Python, 120 байт

o,i=[0,0],0
for s in list(input()):i=(i+(s=='r')-(s=='l')>=1);o[i]+=(s=='u')-(s=='d')
print'%02d:%02d'%(o[0]%24,o[1]%60)
ааааа говорит восстановить монику
источник
Это похоже на фрагмент, принимающий входные данные в переменной. Как правило, мы требуем, чтобы ответы представляли либо полную программу (с использованием входных данных из аргументов программы или стандартного ввода), либо функцию (с использованием входных данных из параметров функции).
OOBalance
1
Кроме того, не будет ли это натолкнуться на стену, когда ввод, скажем, ldили rruзаставит iвыйти из диапазона (0,1) и o[i]будет получен доступ позже?
OOBalance
@OOBalance О, спасибо, что напомнили мне, что вам нужна функция или unput(). Из требований я понял, что действия L и R никогда не будут повторяться (то есть, нет LL)
ааааа говорит восстановить Монику
@aaaaaa Никаких зацикливаний значит lllне то же самое, что и r. Имея llили rrявляется допустимым вводом, это также в тестовых примерах, см. Третий пример.
Нить
Этот ответ в настоящее время содержит ошибку IndexError в третьем тестовом примере вместо вывода 23:59. Попробуйте онлайн!
0
1

R 368 355 байт

f=function(){C=as.character
i=ifelse
p=paste0
r=1:10
h=C(0:23);m=C(0:59)
h[r]=p(0,h[r])
m[r]=p(0,m[r])
x=y=z=1
while(T){print(p(h[x],":",m[y]))
v=1
n="[UDLRS]"
while(!grepl(n,v))v=toupper(readline(n))
if(v=="L")z=1 else if(v=="R")z=0
if(v=="S")T=F
if(v=="U")if(z)x=i(x==24,1,x+1)else y=i(y==60,1,y+1)
if(v=="D")if(z)x=i(x==1,24,x-1)else y=i(y==1,60,y-1)}}

Определенно не лучший подход, но работает.

Функциональность: Запустите функцию, введите каждую букву, чтобы (в / де) согнуть или переместить влево / вправо, ввод «s» завершает «игру». Подвох в том, что он будет принимать одно и только одно письмо за раз.

-13 байт Консолидировал некоторые значения в одну строку, переписал T как F вместо использования break, нашел несколько пробелов для удаления и вместо этого строку, сохраненную в переменной

f=function(){C=as.character                             # Abbreviate functions
i=ifelse
p=paste0
r=1:10                                                  # Initialize and format values
h=C(0:23);m=C(0:59)
h[r]=p(0,h[r])
m[r]=p(0,m[r])
x=y=z=1
while(T){print(p(h[x],":",m[y]))                        # Begin while loop and print time
v=1                                                     # Initial value reset each iteration to retrieve a new direction
n="[UDLRS]"                                             # Used for verification and request
while(!grepl(n,v))v=toupper(readline(n))                # Will only accept proper directions or stopping rule
if(v=="L")z=1 else if(v=="R")z=0                        # Evaluate for hour or minute
if(v=="S")T=F                                           # Stopping rule, overwrite True to False
if(v=="U")if(z)x=i(x==24,1,x+1)else y=i(y==60,1,y+1)    # Rules for Up
if(v=="D")if(z)x=i(x==1,24,x-1)else y=i(y==1,60,y-1)}}  # Rules for Down

Я также редактирую альтернативный формат, чтобы принять строку R и / или вектор, опубликую на следующей неделе.

Sumner18
источник
1

SmileBASIC, 123 байта

@L
B=BUTTON(2)D=(B==1)-(B==2)S=S+!S*(B>7)-S*(B==4)H=(H+D*!S+24)MOD 24WAIT
M=(M+D*S+60)MOD 60?FORMAT$("%02D:%02D",H,M)GOTO@L

BUTTON() возвращает целое число, где каждый бит представляет кнопку

1 = up
2 = down
4 = left
8 = right
...

BUTTON(2) возвращает только те кнопки, которые были только что нажаты (не удерживаются)

WAITтребуется, потому что BUTTONобновляется только один раз за кадр (1/60 секунды). В противном случае одно и то же нажатие кнопки будет обнаружено несколько раз.

Это определенно может быть короче

12Me21
источник
0

05AB1E , 38 37 байт

'l¡ε'r¡}0ζćs˜‚€S„udS1®‚:OŽ9¦2ä%T‰J':ý

Пользы udlr для указаний, но может также использоваться ^v<>для того же количества байтов (символы ↑↓←→не являются частью кодовой страницы 05AB1E, поэтому их использование значительно увеличит число байтов, поскольку кодировка должна быть изменена на ASCII).

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

'l¡            '# Split the (implicit) input on "l"
                #  i.e. "lllrurulddd" → ["","","","ruru","ddd"]
   ε   }        # Map each item to:
    'r¡        '#  Split the item on "r"
                #   i.e. ["","","","ruru","ddd"] → [[""],[""],[""],["","u","u"],["ddd"]]
        0ζ      # Zip/transpose; swapping rows/columns, with "0" as filler
                #  i.e. [[""],[""],[""],["","u","u"],["ddd"]]
                #   → [["","","","","ddd"],["0","0","0","u","0"],["0","0","0","u","0"]]
ć               # Head extracted: pop and push the remainder and head-item to the stack
                #  i.e. [["","","","","ddd"],["0","0","0","u","0"],["0","0","0","u","0"]]
                #   → [["0","0","0","u","0"],["0","0","0","u","0"]] and ["","","","","ddd"]
 s              # Swap to get the remainder
  ˜             # Flatten it
                #  i.e. [["0","0","0","u","0"],["0","0","0","u","0"]]
                #   → ["0","0","0","u","0","0","0","0","u","0"]
               # Pair the head and remainder back together
                #  i.e. ["","","","","ddd"] and ["0","0","0","u","0","0","0","0","u","0"]
                #   → [["","","","","ddd"],["0","0","0","u","0","0","0","0","u","0"]]
    S          # Convert each item to a list of characters
                # (implicitly flattens and removes empty strings)
                #  i.e. [["","","","","ddd"],["0","0","0","u","0","0","0","0","u","0"]]
                #   → [["d","d","d"],["0","0","0","u","0","0","0","0","u","0"]]
      udS1®‚:  # Replace all "u" with "1" and all "d" with "-1"
                #  i.e. [["d","d","d"],["0","0","0","u","0","0","0","0","u","0"]]
                #   → [["-1","-1","-1"],["0","0","0","1","0","0","0","0","1","0"]]
              O # Then take the sum of each inner list
                #  i.e. [["-1","-1","-1"],["0","0","0","1","0","0","0","0","1","0"]]
                #   → [-3,2]
Ž9¦             # Push compressed integer 2460
   2ä           # Split into two parts: [24,60]
     %          # Modulo the two lists
                #  i.e. [-3,2] and [24,60] → [21,2]
      T        # Divmod each with 10
                #  i.e. [21,2] → [[2,1],[0,2]]
        J       # Join each inner list together
                #  i.e. [[2,1],[0,2]] → ["21","02"]
         ':ý   '# Join the list with ":" delimiter
                #  i.e. ["21","02"] → "21:02"
                # (and output the result implicitly)

Посмотрите эту подсказку 05AB1E (раздел Как сжать большие целые числа? ), Чтобы понять, почему Ž9¦это так 2460.

Кевин Круйссен
источник