Pengaturan waktu

27

Bayangkan 24 jam berikut yang dapat dikontrol dengan tombol panah:

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

Menekan panah ke atas dua kali ( ↑↑) akan menambah input jam yang saat ini difokuskan:

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

Menekan panah kanan ( ) akan memfokuskan input lainnya.

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

Menekan panah bawah tiga kali ( ↓↓↓) sekarang akan mengurangi input ini.

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

Singkatnya:

  • Panah atas ( ) akan menambah input yang sedang aktif.
  • Panah bawah ( ) akan mengurangi input aktif.
  • Panah kanan ( ) akan memindahkan fokus ke input yang benar.
  • Panah kiri ( ) akan memindahkan fokus ke input kiri.
  • Gerakan naik dan turun akan berputar seperti yang diharapkan untuk input waktu.
  • Gerakan kiri dan kanan tidak berputar.

Tantangan

Jam dimulai 00:00dengan input jam aktif (lihat skema pertama). Diberikan daftar perintah input, output waktu yang dihasilkan dalam HH:mmformat.
Input dapat berupa string atau daftar (atau bahasa Anda setara), di mana arah input yang berbeda dapat menjadi salah satu opsi di bawah ini:

  • ↑↓←→
  • udlr
  • ^v<>
  • tombol panah yang sebenarnya ditekan jika program Anda memiliki GUI

Celah standar berlaku.

Uji kasus

↑↑→↓↓↓ = 02:57
↓→↑←↑→↓ = 00:00
↓→→↓ = 23:59
←←←←→↑ = 00:01
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓→↓ = 23:59
Nit
sumber
1
@JonathanFrech Salah satu opsi yang diberikan, memilih empat nilai unik (misalnya 0123) akan membuat tantangan lebih mudah dalam bahasa tertentu tanpa menguntungkan orang lain.
Nit
1
@LuisfelipeDejesusMunoz Ya, itu sebenarnya ditulis di bawah aturan input.
Nit
3
Saya pikir ini akan lebih menantang jika itu termasuk detik. Ini akan memiliki lebih banyak logika di balik yang mana saat ini sedang dalam fokus
Jo King
3
Tidak ada aturan khusus untuk menangani kode Konami.
coredump
1
@coredump Dianggap, tetapi mungkin akan membutuhkan lebih banyak ruang daripada inti dari jawaban di sebagian besar bahasa.
Nit

Jawaban:

39

HTML di Google Chrome 67 dalam bahasa Mandarin (Sederhana), 39 byte

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

Tangkapan layar

Chrome menampilkan komponen UI yang berbeda dalam bahasa yang berbeda. Bahkan input waktu yang sederhana: AM / PM akan ditampilkan jika Anda menggunakan bahasa Inggris (AS). Jika Anda ingin menguji ini dengan mengubah bahasa Chrome Anda. Jangan secara massal cara mengubahnya kembali.

tsh
sumber
2
dudee !! hahah saya pikir tidak sahih
Luis felipe De jesus Munoz
2
Memukul dua kali tepat AM/PMbagi saya
Jo King
1
@ Mengobrol Saya pikir itu tergantung pada pengaturan lokal /?
Nit
1
@ JoKing Itu tergantung pada lokal. Mungkin sudah mencoba dengan mengubah bahasa Chrome Anda ke bahasa Mandarin Simplify? (Jangan secara massal cara mengubahnya kembali.)
tsh
1
Ini bekerja di firefox 61.0.1
Francisco Hahn
12

C (gcc) , 117 107 byte

  • Disimpan sepuluh byte berkat 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);}

Cobalah online!

Jonathan Frech
sumber
4
Penamaan variabel yang bagus.
Nit
# C (gcc) , 107 byte <! - 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);} Cobalah secara online!
14m2
6

Stax , 36 35 33 32 byte

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

Jalankan dan debug itu

Penggunaan lrud.

Penjelasan:

'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
sumber
6

Python 2 , 105 byte

h=m=p=0
for c in map(' ^<>'.find,input()):w=1/c;m+=w*p;h+=w-w*p;p=[c-2,p][w]
print'%02d:%02d'%(h%24,m%60)

Cobalah online!

ovs
sumber
5

JavaScript (Node.js) , 103 byte

Mengambil input sebagai string, menggunakan udlr.

s=>(Buffer(s).map(n=>n%6?s%4?m+=n%2||59:h+=n%2||23:s=n,h=m=0),g=n=>('0'+n).slice(-2))(h%24)+':'+g(m%60)

Cobalah online!

Arnauld
sumber
5

C # (.NET Core) , 149 132 byte

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}";}

Cobalah online!

Menggunakan ^v<>.

Yang ini membuat saya sadar bahwa operator modulo di C # tidak berfungsi seperti yang diharapkan, karena di C # -1 % 60 = -1, jadi saya perlu melakukan operasi aneh pada akhirnya.

Charlie
sumber
Tidak bisakah (h [1]% 60 + 60)% 60 diganti dengan (h [1] +60)% 60?
IanF1
2
@ IanF1 tidak, Anda tidak bisa. Bagaimana jika pengguna menekan tombol bawah 100 kali? Atau 1000 kali?
Charlie
terima kasih telah menjelaskan :) ini mengejutkan bagi saya bahwa cara ini lebih pendek daripada menerapkan modulo on the fly (dengan 59 menggantikan -1).
IanF1
5

Lua (kerangka love2d), 311 308 byte

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

Versi tidak rusak:

--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

Mungkin masih tidak 100% mudah dibaca karena semua seandainya dipertukarkan dengan pernyataan trinary (..dan ..atau) :)

jika dimulai di main.lua dengan cinta maka itu akan muncul jendela dan Anda dapat menekan tombol panah untuk mengubah angka

Lycea
sumber
dapatkah Anda juga memposting versi yang diperluas untuk keterbacaan
aaaaa kata mengembalikan Monica
tentu, saya menambahkan versi yang diperluas tidak ada masalah :)
Lycea
4

MATL , 57 56 55 byte

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

Cobalah online!

Merupakan jam dan menit menggunakan bilangan kompleks, dengan bagian nyata adalah jam dan bagian imajiner menit.

Dengan komentar:

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 - Pasang kembali Monica
sumber
4

PHP , 145 134 133 byte

(-11 bytes dengan lebih banyak bermain golf)

(-1 byte dengan menggunakan metode loop Davіd )

<?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);

Untuk menjalankannya:

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

Contoh:

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

Atau Coba online!

Catatan:

  • Untuk menghemat beberapa byte, saya telah menggunakan string tanpa kutip tunggal / ganda sebagai pembungkus string. Dengan demikian, error_reporting=0opsi ini digunakan untuk tidak menampilkan peringatan.
  • Perintah input: u d l r
Night2
sumber
128 byte, -6: Cobalah online! (Solusi bagus, btw :)
Davіd
@ David: Terima kasih, tetapi pembaruan Anda memiliki dua masalah. Pertama adalah $ h tidak disetel, jadi gagal saat memulai gagal: Coba online!
Malam 2
@ David: Dan masalah kedua terjadi ketika kita mengganti jam / menit naik atau turun lebih dari 24/60 kali: Cobalah online!
Malam 2
@ David: Tetapi berkat metode loop Anda, saya dapat mengurangi 1 byte lagi: Cobalah online!
Night2
ah, baik-baik saja, maaf itu tidak sepenuhnya berhasil :)
Davіd
4

JavaScript, 104 103 byte

Mengambil input sebagai array karakter, menggunakan <>^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)

Cobalah online

Shaggy
sumber
3

Haskell, 236 byte

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

fadalah fungsi utama, dan memiliki tipe 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"

Pada dasarnya udan vmerupakan fungsi tipe yang saling rekursif Integer -> Integer -> String -> String. Mereka mengambil jam, menit dan daftar karakter di set {v,^,<,>}, dan mengembalikan string waktu. ubertindak seolah-olah dial jam disorot, secara rekursif memanggil ujika kepala daftar ada {v,^}, dan vjika kepala daftar ada di {<,>}. vserupa tetapi untuk dial menit.

Yang lainnya hanya menyimpan karakter.

AlexJ136
sumber
3

Lua , 132 byte

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'

Cobalah online!


Penjelasan

Ini adalah fungsi anonim (cara menggunakannya ditampilkan pada tautan).

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
sumber
Outputnya harus dalam HH:mmformat, bukan tabel
Jo King
2

Java 8, 121 byte

c->{int i=0,m[]={0,0,0};for(int t:c)if(t<63)i=t%4;else m[i]+=(t&8)>0?1:119;return"".format("%02d:%02d",m[0]%24,m[2]%60);}

Pelabuhan Jonathan Frech 's C jawabannya . Menerima ^v<>. Cobalah online di sini .

Ketidakseimbangan
sumber
2

Jelly , 36 byte

Saya percaya O%5;4ṣ3œṡ€4Z%3’§§%"“ð<‘DŻ€ṫ€-j”:harus bekerja untuk 32, tetapi œṡ saat ini tampaknya memiliki bug .

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

Sebuah program lengkap yang mencetak hasilnya ke STDOUT (sebagai tautan monadik, ia benar-benar mengembalikan daftar bilangan bulat (meskipun yang satu digit) dan karakter (yang : ).

Menggunakan udlr opsi untuk input.

Cobalah online! Atau lihat a test-suite .

Bagaimana?

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)
Jonathan Allan
sumber
2

APL (Dyalog Classic) , 97 84 byte

5↑∊{¯3'0',':',⍨⍕⍵}¨24 60|A⊣⍎¨'⎕IO←1' '⎕IO←0' 'A[1]+←1' 'A[1]-←1'['←→↑'⍳⍞,'←']⊣A0 0

Cobalah online!

Membutuhkan ⎕IO←1

Zacharý
sumber
2

QBasic , 229 byte

Sebuah skrip yang mengambil input sebagai penekanan tombol dan output ke konsol.

Catatan: terminal "disertakan hanya untuk penyorotan sintaks, dan tidak berkontribusi pada 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

Berkomentar

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
Taylor Scott
sumber
1
Bukankah seharusnya begitu (m+y)?
Neil
Dalam catatan, seharusnya tidak tidak akan melakukan ?
Jonathan Frech
@ JonathanFrech - Yep seharusnya. Terima kasih telah menjaga tata bahasa saya
Taylor Scott
Maaf, saya pikir mitu hanya beberapa menit untuk beberapa alasan ... Saya melihat versi komentar Anda lebih mudah dibaca.
Neil
2

Powershell, 109 103 byte

-6 byte terima kasih 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)

Skrip uji:

$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"
}

Keluaran:

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

Penjelasan

Ide dasarnya adalah menggunakan a [hashtable], yang keysmerupakan perintah kontrol dan valuesmerupakan scriptblock. Kode menjalankan scriptblock untuk setiap perintah dari argumen.

mazzy
sumber
1
Anda dapat menyingkirkan $i=0dengan mem-casting indeks array Anda seperti $t[+$i]menyimpan beberapa byte. Cobalah online!
AdmBorkBork
2

Perl 6 , 101 91 89 86 byte

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

Cobalah online!

Blok kode anonim yang mengambil string uldrkarakter dan kembali dalam format yang diberikan

Jo King
sumber
1

perl -F // -E, 72 byte

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

sumber
1

Python, 120 byte

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)
kata aaaaa mengembalikan Monica
sumber
Ini terlihat seperti cuplikan yang mengambil input dalam suatu variabel. Sebagai aturan umum, kami memerlukan jawaban untuk menyajikan program lengkap (mengambil input dari argumen program atau input standar) atau fungsi (mengambil input dari parameter fungsi).
OOBalance
1
Juga, tidakkah ini akan menabrak dinding ketika input, katakan, ldatau rrumenyebabkan imeninggalkan rentang (0,1) dan o[i]diakses setelahnya?
OOBalance
@OOBalance oh terima kasih telah mengingatkan saya bahwa Anda memerlukan fungsi atau unput(). Dari persyaratan saya pikir tindakan L dan R tidak akan pernah berputar (yaitu tidak LL)
aaaaa mengatakan mengembalikan Monica
@aaaaaa Tidak ada perulangan berarti llltidak sama dengan r. Memiliki llatau rrinput yang valid, itu juga dalam kasus uji, lihat yang ketiga misalnya.
Nit
Jawaban ini saat ini memiliki IndexError pada test case ke-3 alih-alih menghasilkan 23:59. Cobalah online!
0
1

Haskell , 186 byte

f(0,0)'<'
f t i('^':r)=f(i#t$1)i r
f t i('v':r)=f(i#t$ -1)i r
f t i(x:r)=f t x r
f(h,m)_ _=s h++':':s m
('<'#(h,m))n=(mod(24+n+h)24,m)
(_#(h,m))n=(h,mod(60+n+m)60)
s n=['0'|n<10]++show n

Cobalah online!

Laikoni
sumber
1

R, 368 355 byte

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)}}

Jelas bukan pendekatan terbaik, tetapi berhasil.

Fungsionalitas: Jalankan fungsi, ketikkan setiap huruf ke (in / de) lipatan atau bergerak ke kiri / kanan, mengetik "s" mengakhiri "permainan". Tangkapannya adalah bahwa ia akan menerima satu dan hanya satu huruf pada satu waktu.

-13 byte Menggabungkan beberapa nilai menjadi satu baris, menimpa T sebagai F daripada menggunakan break, menemukan beberapa spasi untuk dihilangkan, dan string disimpan dalam variabel sebagai gantinya

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

Saya juga mengedit format alternatif untuk menerima string R dan / atau vektor, akan dikirim minggu depan.

Sumner18
sumber
1

SmileBASIC, 123 byte

@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() mengembalikan bilangan bulat di mana setiap bit mewakili tombol

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

BUTTON(2) hanya mengembalikan tombol yang baru saja ditekan (tidak ditahan)

WAITdiperlukan karena BUTTONhanya pembaruan sekali per frame (1/60 detik). Kalau tidak, tekan tombol yang sama akan terdeteksi beberapa kali.

Ini pasti bisa lebih pendek

12Me21
sumber
0

05AB1E , 38 37 byte

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

Menggunakan udlrpetunjuk arah, tetapi bisa juga digunakan ^v<>untuk byte-count yang sama (karakter ↑↓←→bukan bagian dari codepage 05AB1E, jadi menggunakan itu akan meningkatkan byte-count oleh banyak, karena pengkodean harus diubah ke ASCII).

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

'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)

Lihat ini 05AB1E ujung tambang (bagian Cara kompres bilangan bulat besar? ) Untuk memahami mengapa Ž9¦adalah 2460.

Kevin Cruijssen
sumber