Đặt thời gian


27

Hãy tưởng tượng đồng hồ 24 giờ sau đây có thể được điều khiển bằng các phím mũi tên:

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

Nhấn mũi tên lên hai lần ( ↑↑) sẽ tăng đầu vào giờ đang tập trung:

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

Nhấn mũi tên phải ( ) sẽ tập trung đầu vào khác.

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

Nhấn ba lần mũi tên xuống (↓↓↓ ) bây giờ sẽ giảm đầu vào này.

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

Đặt ngắn gọn:

  • Mũi tên lên ( ) sẽ tăng đầu vào hiện đang hoạt động.
  • Mũi tên xuống ( ) sẽ giảm đầu vào hoạt động.
  • Mũi tên phải ( ) sẽ di chuyển tiêu điểm sang đầu vào bên phải.
  • Mũi tên trái ( ) sẽ di chuyển tiêu điểm sang đầu vào bên trái.
  • Chuyển động lên và xuống sẽ lặp lại như mong đợi cho đầu vào thời gian.
  • Chuyển động trái và phải không vòng quanh.

Các thách thức

Đồng hồ bắt đầu 00:00với giờ hoạt động đầu vào (xem sơ đồ đầu tiên). Đưa ra một danh sách các lệnh đầu vào, xuất thời gian kết quả ở HH:mmđịnh dạng.
Đầu vào có thể là một chuỗi hoặc một danh sách (hoặc ngôn ngữ của bạn tương đương), trong đó các hướng nhập khác nhau có thể là một trong các tùy chọn bên dưới:

  • ↑↓←→
  • udlr
  • ^v<>
  • Phím mũi tên thực tế nhấn nếu chương trình của bạn có GUI

Tiêu chuẩn áp dụng.

Các trường hợp thử nghiệm

↑↑→↓↓↓ = 02:57
↓→↑←↑→↓ = 00:00
↓→→↓ = 23:59
←←←←→↑ = 00:01
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓→↓ = 23:59

1
@JonathanFrech Một trong những tùy chọn đã cho, chọn bốn giá trị duy nhất (ví dụ 0123) sẽ giúp thử thách dễ dàng hơn rất nhiều trong một số ngôn ngữ nhất định trong khi không mang lại lợi ích cho người khác.
Nit

1
@LuisfelipeDejesusMunoz Vâng, điều đó thực sự được viết ra theo các quy tắc đầu vào.
Nit

3
Tôi nghĩ rằng điều này sẽ có nhiều thách thức hơn nếu nó bao gồm vài giây. Điều này sẽ có nhiều logic hơn đằng sau mà một người hiện đang tập trung
Jo King

3
Thiếu một quy tắc đặc biệt để xử lý mã Konami.
coredump

1
@coredump Xem xét nó, nhưng nó có thể sẽ chiếm nhiều không gian hơn cốt lõi của câu trả lời trong hầu hết các ngôn ngữ.
Nit

Câu trả lời:


39

HTML trên Google Chrome 67 bằng tiếng Trung (Đơn giản hóa), 39 byte

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

Ảnh chụp màn hình

Chrome hiển thị thành phần UI khác nhau trong ngôn ngữ khác nhau. Ngay cả đầu vào thời gian đơn giản: AM / PM sẽ được hiển thị nếu bạn đang sử dụng tiếng Anh (Hoa Kỳ). Nếu bạn muốn kiểm tra điều này bằng cách thay đổi ngôn ngữ Chrome của bạn. Đừng ồ ạt làm thế nào để thay đổi nó trở lại.


2
đồ ngốc !! hahah Tôi nghĩ là không hợp lệ tho
Luis felipe De jesus Munoz

2
Đánh đúng hai lần sẽ đến AM/PMvới tôi
Jo King

1
@JoKing Tôi nghĩ đó là địa phương / cài đặt phụ thuộc?
Nit

1
@JoKing Đó là phụ thuộc địa phương. Có thể thử bằng cách thay đổi ngôn ngữ Chrome của bạn sang tiếng Trung giản thể? (Đừng ồ ạt làm thế nào để thay đổi nó trở lại.)
tsh 18/07/18

1
Nó hoạt động trên firefox 61.0.1
Francisco Hahn


6

Stax , 36 35 33 32 byte

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

Chạy và gỡ lỗi nó

Công dụng lrud.

Giải trình:

'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



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

Hãy thử trực tuyến!

Sử dụng ^v<>.

Điều này khiến tôi nhận ra rằng toán tử modulo trong C # không hoạt động như mong đợi, vì trong C # -1 % 60 = -1, vì vậy tôi cần thực hiện thao tác kỳ lạ đó vào cuối.


Không thể thay thế (h [1]% 60 + 60)% 60 bằng (h [1] +60)% 60?
IanF1

2
@ IanF1 không bạn không thể. Nếu người dùng nhấn nút xuống 100 lần thì sao? Hay 1000 lần?
Charlie

cảm ơn vì đã làm rõ :) điều đáng ngạc nhiên với tôi là cách này ngắn hơn so với việc áp dụng modulo khi đang bay (với 59 thay cho -1).
IanF1

5

Lua (khung 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

Phiên bản không giới hạn:

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

Có lẽ vẫn không dễ đọc 100% vì tất cả các if được hoán đổi với một câu lệnh ba (..và .. hoặc) :)

Nếu bắt đầu trong một main.lua với tình yêu thì nó sẽ bật lên một cửa sổ và bạn có thể nhấn phím mũi tên để thay đổi số


bạn cũng có thể đăng phiên bản mở rộng để có thể đọc được không
aaaaa nói rằng phục hồi Monica

chắc chắn, tôi đã thêm một phiên bản mở rộng không có vấn đề gì :)
Lycea

4

MATL , 57 56 55 byte

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

Hãy thử trực tuyến!

Biểu thị giờ và phút bằng các số phức, với phần thực là giờ và phần phút tưởng tượng.

Với nhận xét:

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

4

PHP , 145 134 133 byte

(-11 byte bằng cách chơi gôn nhiều hơn)

(-1 byte bằng cách sử dụng phương thức vòng lặp của Dav giác )

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

Để chạy nó:

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

Thí dụ:

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

Hoặc dùng thử trực tuyến!

Ghi chú:

  • Để lưu một số byte, tôi đã sử dụng các chuỗi mà không có trích dẫn đơn / đôi làm trình bao bọc chuỗi. Như vậy,error_reporting=0 tùy chọn được sử dụng để không đưa ra cảnh báo.
  • Các lệnh đầu vào: u d l r

128 byte, -6: Hãy thử trực tuyến! (Giải pháp tốt đẹp, btw :)
Davіd

@ Dav giác: Cảm ơn, nhưng bản cập nhật của bạn có hai vấn đề. Đầu tiên là $ h không được đặt, vì vậy việc giảm nó khi bắt đầu thất bại: Hãy thử trực tuyến!
Đêm2

@David: Và vấn đề thứ hai xảy ra khi chúng tôi chuyển đổi giờ / phút lên hoặc xuống hơn 24/60 lần: Hãy thử trực tuyến!
Đêm2

@ Davіd: Nhưng nhờ phương thức lặp của bạn, tôi có thể giảm thêm 1 byte: Hãy thử trực tuyến!
Đêm2

à, được rồi, xin lỗi, nó không hoàn toàn hoạt động :)
Davіd

4

JavaScript, 104 103 byte

Đưa đầu vào dưới dạng một mảng các ký tự, sử dụng <>^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)

Dùng thử trực tuyến


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

flà chức năng chính và có loại 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"

Về cơ bản uvlà các hàm đệ quy lẫn nhau của loại Integer -> Integer -> String -> String. Họ lấy giờ, phút và danh sách các ký tự trên tập hợp {v,^,<,>}và trả về chuỗi thời gian. uhoạt động như thể mặt số giờ được tô sáng, gọi đệ quy unếu phần đầu của danh sách nằm trong {v,^}vnếu phần đầu của danh sách nằm trong {<,>}. vlà tương tự nhưng đối với quay số phút.

Mọi thứ khác chỉ là tiết kiệm nhân vật.


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'

Hãy thử trực tuyến!


Giải trình

Đây là một chức năng ẩn danh (một cách để sử dụng nó được hiển thị trên liên kế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

Đầu ra phải ở HH:mmđịnh dạng, thay vì bảng
Jo King


2

Thạch , 36 byte

Tôi tin rằng O%5;4ṣ3œṡ€4Z%3’§§%"“ð<‘DŻ€ṫ€-j”:nên làm việc cho 32, nhưng œṡ dường như hiện đang có một lỗi .

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

Một chương trình đầy đủ in kết quả thành STDOUT (dưới dạng liên kết đơn, nó thực sự trả về một danh sách hỗn hợp gồm các số nguyên (mặc dù là một chữ số) và các ký tự ( : ).

Sử dụng udlrtùy chọn cho đầu vào.

Hãy thử trực tuyến! Hoặc xem một thử nghiệm .

Làm sao?

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 byte

Một tập lệnh lấy đầu vào là tổ hợp phím và đầu ra cho bàn điều khiển.

Lưu ý: thiết bị đầu cuối "được bao gồm chỉ để làm nổi bật cú pháp và không đóng góp cho 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

Đã bình luận

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
Có nên như (m+y)vậy không?
Neil

Trong ghi chú, không nên không được làm ?
Jonathan Frech

@JonathanFrech - Đúng vậy. Cảm ơn vì đã kiểm tra ngữ pháp của tôi
Taylor Scott

Xin lỗi, tôi nghĩ mlà trong vài phút vì một số lý do ... Tôi thấy phiên bản nhận xét của bạn dễ đọc hơn.
Neil

2

Powershell, 109 103 byte

-6 byte cảm ơn 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)

Kịch bản thử nghiệm:

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

Đầu ra:

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

Giải trình

Ý tưởng cơ bản là sử dụng một [hashtable], đó keyslà các lệnh điều khiển và valueslà các đoạn mã. Mã thực thi scriptblock cho mỗi lệnh từ các đối số.


1
Bạn có thể thoát khỏi $i=0bằng cách truyền chỉ mục mảng của bạn như $t[+$i]để lưu một số byte. Hãy thử trực tuyến!
admBorkBork

2

Perl 6 , 101 91 89 86 byte

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

Hãy thử trực tuyến!

Khối mã ẩn danh nhận một chuỗi uldrký tự và trả về ở định dạng đã cho


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

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)

Điều này trông giống như một đoạn trích lấy đầu vào trong một biến. Theo nguyên tắc chung, chúng tôi yêu cầu các câu trả lời để trình bày một chương trình đầy đủ (lấy đầu vào từ đối số chương trình hoặc đầu vào tiêu chuẩn) hoặc một hàm (lấy đầu vào từ các tham số chức năng).
OOBalance

1
Ngoài ra, điều này sẽ không chạy vào tường khi đầu vào, giả sử ldhoặc rrunguyên nhân irời khỏi phạm vi (0,1) và o[i]được truy cập sau đó?
OOBalance

@OOBalance oh cảm ơn vì đã nhắc nhở tôi rằng bạn cần chức năng hay unput(). Từ những yêu cầu tôi đã hình dung ra rằng các hành động L và R sẽ không bao giờ lặp lại (tức là không LL)
aaaaa nói phục hồi lại

@aaaaaa Không có nghĩa là lặp lllkhông giống như r. Có llhoặc rrlà đầu vào hợp lệ, nó cũng có trong các trường hợp thử nghiệm, xem ví dụ thứ ba.
Nit

Câu trả lời này hiện có IndexError trong trường hợp thử nghiệm thứ 3 thay vì xuất ra 23:59. Hãy thử trực tuyến!
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

Hãy thử trực tuyến!


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

Chắc chắn không phải là cách tiếp cận tốt nhất, nhưng hoạt động.

Chức năng: Chạy chức năng, nhập từng chữ cái vào (in / de) nhăn hoặc di chuyển sang trái / phải, gõ "s" kết thúc "trò chơi". Điều hấp dẫn là nó sẽ chấp nhận một và chỉ một chữ cái tại một thời điểm.

-13 byte Hợp nhất một số giá trị thành một hàng, ghi đè T thành F thay vì sử dụng ngắt, tìm thấy một số khoảng trắng để loại bỏ và thay vào đó một chuỗi được lưu trữ trong một biến

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

Tôi cũng đang chỉnh sửa một định dạng thay thế để chấp nhận chuỗi R và / hoặc vector, sẽ đăng vào tuần tới.


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() trả về một số nguyên trong đó mỗi bit đại diện cho một nút

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

BUTTON(2) chỉ trả về các nút vừa được nhấn (không được giữ)

WAIT là bắt buộc vì BUTTON chỉ cập nhật một lần trên mỗi khung hình (1/60 giây). Nếu không, nhấn cùng một nút sẽ được phát hiện nhiều lần.

Điều này chắc chắn có thể ngắn hơn


0

05AB1E , 38 37 byte

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

Sử dụng udlrcho các hướng, nhưng cũng có thể sử dụng ^v<>cho cùng một số đếm byte (các ký tự ↑↓←→không phải là một phần của bảng mã của 05AB1E, do đó, việc sử dụng chúng sẽ làm tăng số lượng byte lên rất nhiều, vì mã hóa nên được đổi thành ASCII).

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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

Xem 05AB1E mẹo này của tôi (phần Làm thế nào để nén các số nguyên lớn? ) Để hiểu tại sao Ž9¦2460.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.