Uhrzeit einstellen


27

Stellen Sie sich die folgende 24-Stunden-Uhr vor, die mit den Pfeiltasten gesteuert werden kann:

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

Zweimaliges Drücken des Aufwärtspfeils ( ↑↑) erhöht die aktuell fokussierte Stundeneingabe:

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

Durch Drücken des Rechtspfeils ( ) wird die andere Eingabe fokussiert.

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

Durch dreimaliges Drücken des Abwärtspfeils ( ↓↓↓) wird diese Eingabe nun verringert.

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

Kurz gesagt:

  • Der Aufwärtspfeil ( ) erhöht den aktuell aktiven Eingang.
  • Der Abwärtspfeil ( ) verringert die aktive Eingabe.
  • Der rechte Pfeil ( ) verschiebt den Fokus auf den rechten Eingang.
  • Der linke Pfeil ( ) verschiebt den Fokus auf den linken Eingang.
  • Die Auf- und Abbewegung wird wie erwartet für eine Zeiteingabe wiederholt.
  • Linke und rechte Bewegung laufen nicht umher.

Die Herausforderung

Die Uhr beginnt bei 00:00aktivem Stundeneingang (siehe erstes Schema). Geben Sie bei einer Liste von Eingabebefehlen die resultierende Zeit im HH:mmFormat aus.
Die Eingabe kann entweder eine Zeichenfolge oder eine Liste (oder eine Ihrer Sprache entsprechende) sein, wobei die verschiedenen Eingaberichtungen eine der folgenden Optionen sein können:

  • ↑↓←→
  • udlr
  • ^v<>
  • Die tatsächliche Pfeiltaste wird gedrückt, wenn Ihr Programm über eine grafische Benutzeroberfläche verfügt

Es gelten Standardlücken.

Testfälle

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

1
@JonathanFrech Eine der angegebenen Optionen, zum Beispiel die Auswahl von vier eindeutigen Werten, 0123würde die Herausforderung in bestimmten Sprachen erheblich erleichtern, während andere davon nicht profitieren.
Nit

1
@LuisfelipeDejesusMunoz Ja, das ist eigentlich nach den Eingaberegeln ausgeschrieben.
Nit

3
Ich denke, das wäre schwieriger gewesen, wenn es Sekunden enthalten hätte. Dies hätte mehr Logik, hinter der man derzeit im Fokus steht
Jo King

3
Es fehlt eine spezielle Regel für den Umgang mit Konami-Code.
Coredump

1
@coredump Betrachtet es, aber es würde wahrscheinlich mehr Platz als der Kern der Antwort in den meisten Sprachen dauern.
Nit

Antworten:


39

HTML in Google Chrome 67 in Chinesisch (vereinfacht), 39 Byte

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

Bildschirmfoto

Chrome zeigt verschiedene UI-Komponenten in verschiedenen Sprachen. Sogar eine einfache Zeiteingabe: AM / PM wird angezeigt, wenn Sie Englisch (US) verwenden. Wenn Sie dies testen möchten, ändern Sie die Sprache Ihres Chrome. Massieren Sie nicht, wie Sie es zurück ändern.


2
Alter !! hahah ich denke, ist nicht gültig bis
Luis Felipe De Jesus Munoz

2
Zweimal richtig treffen geht AM/PMfür mich
Jo King

1
@JoKing Ich denke, es ist Gebietsschema / Einstellungen abhängig?
Nit

1
@JoKing Das ist vom Gebietsschema abhängig. Versuchen Sie es vielleicht, indem Sie die Sprache Ihres Chrome auf Chinesisch (Simplify) ändern. (
Verdichten

1
Es funktioniert auf Firefox 61.0.1
Francisco Hahn


6

Stax , 36 35 33 32 Bytes

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

Führen Sie es aus und debuggen Sie es

Verwendet lrud.

Erläuterung:

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

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

Probieren Sie es online!

Verwenden ^v<>.

Dieser hat mir klar gemacht, dass der Modulo-Operator in C # nicht wie erwartet funktioniert, weil -1 % 60 = -1ich in C # am Ende diese seltsame Operation ausführen muss.


Kann nicht (h [1]% 60 + 60)% 60 durch (h [1] + 60)% 60 ersetzt werden?
IanF1

2
@ IanF1 Nein, kannst du nicht. Was passiert, wenn der Benutzer den Abwärtsknopf 100 Mal drückt? Oder 1000 mal?
Charlie

danke für die klärung :) es ist für mich überraschend, dass dieser weg kürzer ist als das modulo on the fly anzuwenden (mit 59 anstelle von -1).
IanF1

5

Lua (love2d Framework), 311 308 Bytes

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

Uncrumbeled Version:

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

Wahrscheinlich immer noch nicht 100% leicht zu lesen, da alle ifs mit einer trinären Aussage (..und ..oder) ausgetauscht werden :)

Wenn Sie in einer main.lua mit Liebe gestartet sind, wird ein Fenster geöffnet und Sie können die Pfeiltasten drücken, um die Zahlen zu ändern


könnten Sie auch zur besseren Lesbarkeit erweiterte Version veröffentlichen
sagt aaaaa wieder einzusetzen Monica

Klar

4

MATL , 57 56 55 Bytes

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

Probieren Sie es online!

Stellt Stunden und Minuten mit komplexen Zahlen dar, wobei der Realteil Stunden und der Imaginärteil Minuten sind.

Mit Kommentaren:

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 Bytes

(-11 Bytes durch mehr Golf)

(-1 Byte mit Davids Schleifenmethode)

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

Um es auszuführen:

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

Beispiel:

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

Oder versuchen Sie es online!

Anmerkungen:

  • Um einige Bytes zu sparen, habe ich Strings ohne einfache / doppelte Anführungszeichen als String-Wrapper verwendet. Daher wird die error_reporting=0Option verwendet, um keine Warnungen auszugeben.
  • Eingabebefehle: u d l r

128 Bytes, -6: Probieren Sie es online! (Schöne Lösung, übrigens :)
Davіd

@ Davіd: Danke, aber dein Update hat zwei Probleme. Erstens ist $ h nicht gesetzt, daher schlägt das Verringern beim Start fehl: Probieren Sie es online aus!
Night2

@David: Und das zweite Problem tritt auf, wenn wir die Stunde / Minute mehr als 24/60 Mal hoch oder runter schalten: Probieren Sie es online aus!
Night2

@ Davіd: Aber dank Ihrer Loop-Methode könnte ich 1 Byte mehr reduzieren: Probieren Sie es online!
Night2

Ah, in Ordnung, tut mir leid, es hat nicht vollständig funktioniert :)
Davіd

4

JavaScript, 104 103 Bytes

Nimmt die Eingabe als Array von Zeichen unter Verwendung von <>^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)

Probieren Sie es online aus


3

Haskell, 236 Bytes

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

fist die Hauptfunktion und hat den Typ 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"

Im Wesentlichen uund vsind gegenseitig rekursive Funktionen vom Typ Integer -> Integer -> String -> String. Sie nehmen die Stunde, die Minute und eine Liste von Zeichen über den Satz {v,^,<,>}und geben die Zeitzeichenfolge zurück. uVerhält sich so, als ob die Stundenanzeige hervorgehoben ist, und ruft rekursiv an, uwenn sich der Kopf der Liste in {v,^}befindet und vwenn sich der Kopf der Liste in befindet {<,>}. vist ähnlich, aber für die Minutenanzeige.

Alles andere ist nur das Speichern von Zeichen.


3

Lua , 132 Bytes

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'

Probieren Sie es online!


Erläuterung

Dies ist eine anonyme Funktion (eine Verwendungsweise ist im Link angegeben).

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

Die Ausgabe sollte im HH:mmFormat und nicht in einer Tabelle erfolgen
Jo King

2

Java 8, 121 Bytes

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

Port von Jonathan Frech 's C Antwort . Akzeptiert ^v<>. Probieren Sie es hier online aus .


2

Gelee , 36 Bytes

Ich glaube, O%5;4ṣ3œṡ€4Z%3’§§%"“ð<‘DŻ€ṫ€-j”:sollte für 32 arbeiten, œṡ scheint aber derzeit einen Fehler zu haben .

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

Ein vollständiges Programm, das das Ergebnis an STDOUT ausgibt (als monadische Verknüpfung gibt es tatsächlich eine gemischte Liste von Ganzzahlen (wenn auch einstelligen) und Zeichen (die) zurück : ) zurück.

Verwendet die udlr Option zur Eingabe.

Probieren Sie es online! Oder sehen Sie ein Testsuite an .

Wie?

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 Bytes

Ein Skript, das Eingaben als Tastenanschläge aufnimmt und an die Konsole ausgibt.

Hinweis: Die Terminals "dienen nur der Syntaxhervorhebung und tragen nicht zum bytecount bei

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

Kommentiert

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
Sollte das nicht sein (m+y)?
Neil

In der Notiz sollte nicht funktioniert werden tun ?
Jonathan Frech

@ JonathanFrech - Ja, es sollte sein. Vielen Dank, dass Sie meine Grammatik in Schach halten
Taylor Scott

Tut mir leid, ich dachte, mes wäre aus irgendeinem Grund für Minuten ... Ich sehe, dass Ihre kommentierte Version besser lesbar ist.
Neil

2

Powershell, 109 103 Bytes

-6 byte danke 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)

Testskript:

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

Ausgabe:

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

Erläuterung

Die Grundidee ist die Verwendung von a [hashtable], bei denen keyses sich um Steuerbefehle und valuesScriptblöcke handelt. Der Code führt den Scriptblock für jeden Befehl aus Argumenten aus.


1
Sie können loswerden, $i=0indem Sie Ihren Array-Index wie $t[+$i]einige Bytes speichern. Probieren Sie es online!
AdmBorkBork

2

Perl 6 , 101 91 89 86 Bytes

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

Probieren Sie es online!

Anonymer Codeblock, der eine Zeichenfolge uldrakzeptiert und im angegebenen Format zurückgibt


1

Perl -F // -E, 72 Bytes

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

1

Python, 120 Bytes

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)

Dies sieht aus wie ein Snippet, das Eingaben in eine Variable vornimmt. In der Regel benötigen wir Antworten, um entweder ein vollständiges Programm (Eingabe von Programmargumenten oder Standardeingabe) oder eine Funktion (Eingabe von Funktionsparametern) zu präsentieren.
OOBalance

1
Läuft dies nicht auch auf eine Wand, wenn eine Eingabe von beispielsweise ldoder rrubewirkt i, dass der Bereich (0,1) verlassen wird und o[i]anschließend darauf zugegriffen wird?
OOBalance

@OOBalance oh danke, dass du mich daran erinnerst, dass du funktionierst oder unput(). LL
Aufgrund der

@aaaaaa No looping means lllist nicht dasselbe wie r. Haben lloder rrist eine gültige Eingabe, es ist auch in den Testfällen, siehe die dritte zum Beispiel.
Nit

Diese Antwort hat derzeit einen IndexError für den 3. Testfall, anstatt auszugeben 23:59. Probieren Sie es online!
0 '19.

1

Haskell , 186 Bytes

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

Probieren Sie es online!


1

R, 368 355 Bytes

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

Auf jeden Fall nicht der beste Ansatz, aber funktioniert.

Funktionalität: Führen Sie die Funktion aus, geben Sie jeden Buchstaben ein, um ihn zu vergrößern oder zu verkleinern, oder bewegen Sie sich nach links oder rechts. Wenn Sie "s" eingeben, wird das "Spiel" beendet. Der Haken ist, dass immer nur ein Buchstabe akzeptiert wird.

-13 Byte Einige Werte in einer Zeile zusammengefasst, T als F anstelle von break überschrieben, mehrere zu entfernende Leerzeichen gefunden und stattdessen eine Zeichenfolge in einer Variablen gespeichert

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

Ich bearbeite auch ein alternatives Format, um eine R-Zeichenfolge und / oder einen Vektor zu akzeptieren.


1

SmileBASIC, 123 Bytes

@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() Gibt eine Ganzzahl zurück, wobei jedes Bit eine Schaltfläche darstellt

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

BUTTON(2) gibt nur die Tasten zurück, die gerade gedrückt wurden (nicht gehalten werden)

WAITist erforderlich, da BUTTONnur einmal pro Frame (1/60 Sekunde) aktualisiert wird. Andernfalls würde der gleiche Tastendruck mehrmals erkannt.

Dies kann definitiv kürzer sein


0

05AB1E , 38 37 Bytes

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

Verwendet udlrfür die Anweisungen, könnte aber auch ^v<>für die gleiche ↑↓←→Bytezahl verwendet werden (die Zeichen sind nicht Teil der Codepage von 05AB1E, daher würde durch die Verwendung dieser Zeichen die Bytezahl um ein Vielfaches erhöht, da die Codierung in ASCII geändert werden sollte).

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

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

Sehen Sie sich meinen Tipp 05AB1E (Abschnitt Wie komprimiere ich große ganze Zahlen? ) An, um zu verstehen, warum dies so Ž9¦ist 2460.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.