Inkrementelles Spielzeitformat

18

Inkrementelles Spielzeitformat

Tor

Inkrementelle Spiele haben oft einen Countdown-Zähler, der die Tage, Stunden, Minuten und Sekunden anzeigt, bis eine Aufgabe abgeschlossen ist. Abhängig vom verfügbaren Speicherplatz können sie wie folgt formatiert werden:

2d 13h
23h 59m 48s
14m
3h 0m 0s

Das Ziel dieses Codegolfs ist es, eine Funktion oder ein Programm zu schreiben, die bzw. das diese Formatierung durchführt.

Eingänge

  • Die Gesamtanzahl der Sekunden.
  • Die maximale Anzahl der auszugebenden Segmente.

Ausgabe

  • Segmente umfassen:
    • 0w Wochen
    • 0 Tage
    • 0h Stunden
    • 0m Minuten
    • 0s Sekunden
  • Jedes Segment ist durch ein einzelnes Leerzeichen getrennt.
  • Angezeigte Segmente müssen zusammenhängend sein. Beispielsweise werden Stunden und Sekunden nicht ohne Minuten angezeigt, auch wenn keine Minuten vorhanden sind.
  • Einstellige Werte haben keine führenden Nullen, ein Wert von Null muss jedoch als angezeigt werden 0.
  • Die Werte sind abgerundet.
  • Das erste angezeigte Segment ist der erste Wert ungleich Null.

Testfälle

seconds  segments  output
     0      1      0s
   123      1      2m
   123      2      2m 3s
   123      3      2m 3s
 82815      3      23h 0m 15s
307891      2      3d 13h
307891      4      3d 13h 31m 31s
604800      1      1w
604800      6      1w 0d 0h 0m 0s

Gewinnen

Die Lösung mit der niedrigsten Byteanzahl in einer Woche gewinnt die "Akzeptanz".

Bearbeitungen

  • Klargestellt, welches Segment das erste ist, wie in den Beispielen gezeigt.
  • Testfall 4 gemäß Anfrage hinzugefügt.
Hand-E-Food
quelle
Wofür wird die Ausgabe erwartet 307891 1? 0woder 1w.
Jnovacho
1
@jnovacho Wäre es nicht 3d? "Das erste angezeigte Segment ist der erste Wert ungleich Null"
Luigi
@ Luigi Wahr. Das habe ich verpasst
Jnovacho
Bin ich der einzige, der denkt, dass dies eine Frage ist, ob jemand diesen Code für mich schreiben könnte?
9.
Es ist nicht jeder Tag, an dem eine Code-Golf-Aufgabe tatsächlich nützlich sein könnte. Ich sage, mach mit: D
Geobits

Antworten:

7

CJam (Snapshot), 41 38 Bytes

q~"<<^X^G"{imd\}%W%"wdhms":s.+_{0=}#><S*

Oben wird die Caret-Notation verwendet, da zwei der Zeichen nicht druckbar sind.

Vielen Dank an @ Sp3000 für das Golfen mit 2 Bytes.

Testen

Die neueste stabile Version (0.6.5) hat einen Fehler , der dazu führen kann, dass {}#Integer statt Long zurückgegeben werden. Paradoxerweise kann dies umgangen werden, indem auf integer ( i) umgewandelt wird.

Um dies mit Code mit dem Online-Interpreter auszuführen, klicken Sie auf diesen Permalink oder kopieren Sie den Code aus dieser Paste .

Alternativ können Sie den neuesten Snapshot herunterladen und erstellen, indem Sie die folgenden Befehle ausführen:

hg clone http://hg.code.sf.net/p/cjam/code cjam-code
cd cjam-code/
ant

Sie können die CJam-Datei folgendermaßen erstellen:

base64 -d > game-time.cjam <<< cX4iPDwYByJ7aW1kXH0lVyUid2RobXMiOnMuK197MD19Iz48Uyo=

Wie es funktioniert

q~        e# Read an evaluate the input.
"<<^X^G"  e# Push the string corresponding to the array [60 60 24 7
{         e# For each character:
  i       e#   Replace it by its code point.
  md      e#   Push divisor and residue of the division by that code point.
  \       e#   Swap their order.
}%
W%        e# Reverse the resulting array.
"wdhms":s e# Push ["w" "d" "h" "m" "s"].
.+        e# Perform vectorized concatenation.
_         e# Push a copy.
{0=}#     e# Find the index of the first pair with positive integer.
>         e# Remove the preceding pairs.
<         e# Truncate to the number of pairs specified in the input.
S*        e# Join, separating by spaces.
Dennis
quelle
6

Java 197, 191 Bytes

String p(int s,int m){String a[]={s%60+"s",(s/=60)%60+"m",(s/=60)%24+"h",(s/=24)%7+"d",(s/7)+"w"},b="",z="";for(s=5;s>0&&a[--s].charAt(0)=='0';);for(;s>=0&&--m>=0;z=" ")b+=z+a[s--];return b;}

Mir ist gerade aufgefallen, dass Java Deklaration wie unterstützt String a[]. Dies ermöglichte es mir, die Deklaration von bund zin dieselbe Zeile zu ziehen, was mich davon abhielt, Stringerneut zu schreiben .

ECS
quelle
1
Wie die ;z=" ")- sehr schlau.
OldCurmudgeon
5

C 134 127 110 104 103 Bytes

Neue Version:

a,e=5;f(n,x){for(;e;n%=a)a=(int[]){1,60,3600,86400,604800}[--e],x>e?printf("%u%c ",n/a,"smhdw"[e]):0;}

Vorherige Version:

#define p(a) x>--e?printf("%u%c ",n/a,"smhdw"[e]):0;n%=a;
e=5;f(n,x){p(604800)p(86400)p(3600)p(60)p(1)}
openaddr
quelle
4

Pyth, 39 43 Bytes

jd_>vz+V?u?GeGPG+m%~/QddCM"<<"Q)Q]0"smhdw

edit: +4 Zeichen, weil ich den 0sTestfall vergessen habe.

Dies beinhaltet 2 nicht druckbare Zeichen. Holen Sie sich den aktuellen Code und probieren Sie ihn online aus: Demonstration

Erläuterung:

                                         z = 1st input line (segments, as string)
                                         Q = 2nd input line (time, as int)
                         "<<.."          string with 4 chars
                       CM                convert to ASCCI-values => [60,60,24,7]
                m                        map each d of ^ to:
                   /Qd                     Q / d 
                  ~                        update Q, but use the old value for
                 %  Q d                    Q mod d
                                         this gives [sec, min, hour, day]
               +               Q         add Q (week)
        u                       )        apply the following expression to G, 
                                         starting with G = [s,m,h,d,w], until
                                         G stops changing:
         ? eG                              if eG != 0:
          G                                  update G with G (stop changing)
                                           else:
             PG                              update G with G[-1]
                                         this gets rid of trailing zeros
      +V                         "smhdw  vectorized add with "smhdw"
   >vz                                   only use the last eval(z) items
  _                                      reverse order
jd                                       join by spaces and print
Jakube
quelle
3

Python 2.7 - 181 178 174 Bytes

Mein erster Versuch etwas zu golfen.

def I(s,M):
 z=[0]*5;j=0
 for i in [604800,86400,3600,60,1]:z[j],s=s/i,s%i;j+=1
 l=[z.index(n)for n in z if n][0]
 return" ".join([str(i)+n for n,i in zip('wdhms',z)][l:l+M])
f.rodrigues
quelle
1
Toller erster Versuch! Besser als einige meiner sechsten Versuche ...;) Sie können 3 Bytes abschneiden, indem Sie if n!=0auf nur ändern if n.
kirbyfan64sos
Oh ja, habe vergessen, dass 0 False ergibt. Vielen Dank.
f.rodrigues
2

Julia, 158 Bytes

Ich bin mir sicher, dass dies mit einem klügeren Ansatz kürzer sein könnte, aber das ist, was ich jetzt habe.

(s,g)->(j=0;p=cell(5,1);for i=[604800,86400,3600,60,1] p[j+=1],s=s÷i,s%i end;z=findfirst(p);z>0?join([string(p[i],"wdhms"[i])for i=z:min(z+g-1,5)]," "):"0s")

Dadurch wird eine unbenannte Funktion erstellt, die zwei Ganzzahlen als Eingabe akzeptiert und eine Zeichenfolge zurückgibt. Um es zu nennen, geben Sie ihm einen Namen, z f=(s,g)->....

Ungolfed + Erklärung:

function f(s, g)
    # Initialize an array and an index
    p = cell(5, 1)
    j = 0

    # Loop over the number of seconds in a week, day, hour,
    # minute, and second
    for i in [604800, 86400, 3600, 60, 1]
        # Set the jth element in p to be the quotient and s
        # to be the remainder of i into s
        p[j+=1], s = s ÷ i, s % i
    end

    # Get the index of the first nonzero value in p
    z = findfirst(p)

    if z > 0
        # We start the string at the first nonzero value
        # and continue until we hit the desired number of
        # units (z+g-1) or the maximum number of units (5),
        # whichever comes first. The appropriate unit is
        # appended to each value and the values are then
        # joined with a space.
        join([string(p[i], "wdhms"[i]) for i in z:min(z+g-1,5)], " ")
    else
        # If there are no nonzero values in p, we just
        # have 0 seconds
        "0s"
    end
end

Beispiele:

julia> f(82815, 6)
"23h 0m 15s"

julia> f(604800, 4)
"1w 0d 0h 0m"
Alex A.
quelle
1

Scala, 147 Bytes

def p(s:Int,i:Int)=List(s/604800+"w",s/86400%7+"d",s/3600%24+"h",s/60%60+"m",s%60+"s").dropWhile(k=>k.head=='0'&&k.tail!="s").take(i).mkString(" ")
user42083
quelle
1

RS , 367 Bytes

^(\d+)/(_)^^(\1)
(_*) (\d)/\1!\2
_{60}/#
#{60}/@
@{24}/:
:{7}/;
(_+)/(^^\1)s
(#+)/(^^\1)m
(@+)/(^^\1)h
(:+)/(^^\1)d
(;+)/(^^\1)w
([a-z])/\1 
w ((\d+[^\dd])|!)/w 0d \1
d ((\d+[^\dh])|!)/d 0h \1
h ((\d+[^\dm])|!)/h 0m \1
(m|^) ?!/\1 0s!
!(\d+)/!(_)^^(\1)
#
+#(\d+)([a-z]) ?(.*)!(_*)/\1\2 #\3!\4@
#/
(@+)/ (_)^^((^^\1))
!(_+) \1(_*)/!\2
_+ _+/
+\d+[a-z] ?!_/!
 *!/
^$/0s

Live-Demo und alle Testfälle.

Chaotisch, chaotisch, chaotisch ...

Die Ausführung der Testfälle unter Chrome für Android dauert ca. 3-7 Sekunden. Verwenden Sie nicht den Debug-Modus, der Ihren Browser in diesem Fall aufgrund der gesamten Ausgabe, die gedruckt werden würde, einfrieren kann.

kirbyfan64sos
quelle
Was ist rs? -----
Caleb Paul
@Wideshanks Ich habe einen Link in den Titel eingefügt. Es ist eine auf Regex basierende sprachliche Sache, die ich geschrieben habe.
kirbyfan64sos
0

C #, 239 237 170 164 Bytes

Dies ist bei weitem nicht so kompakt wie andere Lösungen, aber ich kann diese Herausforderung nicht bewältigen, ohne mich selbst daran zu stechen.

Diese neueste Iteration wurde durch die Antwort von ESC inspiriert .

Zur Verdeutlichung eingerückt:

string G(int s,int n){
    int[]x={s%60,(s/=60)%60,(s/=60)%24,(s/=24)%7,s/7};
    for(s=5;x[--s]==0&s>0;);
    var o="";
    while(n-->0&s>=0)
        o+=" "+x[s]+"smhdw"[s--];
    return o.Trim();
}
Hand-E-Food
quelle