ASCII-Uhr mit Punkt- und Kommazeitmarkierungen

39

Einführung

Code Golf Erklärung

Stellen Sie sich vor, diese Zeile besteht aus zwei Zeilen. Die oberen Punkte stehen für Stunden (24-Stunden-System), während die unteren Kommas für Minuten stehen . Ein Zeichen kann Stunde, Minute oder beides darstellen - wann immer es möglich ist.

Zuerst müssten Sie wahrscheinlich die Minuten seit Mitternacht in Stunden und Minuten umrechnen .

Das Ergebnis ist die Zeichenfolge, die die aktuelle Zeit im "Punktformat" anzeigt. Die Punktzahl ( Apostroph zählt hier als Punkt und wird so genannt! ) Ist die Stundenzahl seit Mitternacht und die Kommazahl ist die Minutenzahl. Ich werde ein paar Beispiele zeigen, um es klar zu machen.

  • (Bemerkung) hh: mm - result
  • (Nur Stunden) 05:00 - '''''
  • (Nur Minuten) 00:08 - ,,,,,,,,
  • (Stunden <Minuten) 03:07 - ;;;,,,,
  • (Stunden> Minuten) 08:02 - ;;''''''
  • (Stunden = Minuten) 07:07 - ;;;;;;;
  • (Beginn des Tages) 00:00 - ( leeres Ergebnis )

Beachten Sie, dass "beide" Zeichen maximal 23 Mal verwendet werden können - für 23: xx, wobei xx 23 oder mehr ist.

Symbole

Wenn ein Charakter in Ihrer Sprache maskiert werden muss (siehe Regel 5.), können Sie ihn in eine der Alternativen ändern. Wenn die genannten Alternativen nicht ausreichen, können Sie auch andere Symbole verwenden - halten Sie diese jedoch in einem angemessenen Rahmen. Ich möchte nur nicht, dass Flucht eine Barriere ist.

  • ;(Semikolon) - Marker für beide Stunden und Minuten (alt: :)
  • '(Apostroph) - Marker für Stunden (alt: '``°)
  • ,(Komma) - Marker für die Minuten (alt: .)

Zusätzliche Regeln

  1. Der Code mit der geringsten Anzahl von Bytes gewinnt!
  2. Sie müssen beide Symbole verwenden, wann immer dies möglich ist. Für 02.04 kann das Ergebnis nicht sein '',,,,, noch ;',,,. Es muss sein;;,,
  3. Eingabe - kann ein Skript- / App-Parameter, eine Benutzereingabe (wie readline) oder eine Variable innerhalb von Code
    3.1 sein. Wenn die Variable inside code verwendet wird, muss ihre Länge so lang wie möglich sein. Es ist 1439(23:59), also würde es so aussehent=1439
  4. Der gemeinsame Teil, der durch "beide" Zeichen (12 in 12:05, 3 in 03:10) symbolisiert wird , muss am Anfang der Zeichenfolge platziert werden
  5. Symbole können nur durch Alternativen ersetzt werden, wenn sie in Ihrem Code maskiert werden müssten.
  6. Die Eingabe erfolgt in Minuten nach 00:00 . Sie können davon ausgehen, dass dies eine nicht negative Ganzzahl ist.

Testfälle

Input: 300
Output: '''''

Input: 8
Output: ,,,,,,,,

Input: 187
Output: ;;;,,,,

Input: 482
Output: ;;''''''

Input: 427
Output: ;;;;;;;

Input: 0
Output:  (empty)
Krzysiu
quelle
Vielen Dank, Adnan, dass du meinen Beitrag bearbeitet hast! Auf diese Weise lerne ich durch Vergleich meines Golf-
Neulings
3
Kein Problem! Es ist ein sehr guter erster Beitrag und eine schöne Herausforderung :)
Adnan
1
das sieht so gut aus, nur mit Semikolons und Kommas, aber Apostrophe machen alles kaputt :(
Sparr
Eigentlich 1439ist 23:59und nicht 1339. (23 x 60 + 59).
insertusernamehere
Vielen Dank für die guten Worte! :) @Sparr, ja, das ist der schlechte Punkt :( Hast du eine Idee, wie es ersetzt werden könnte? Insertusernamehere, natürlich ist das richtig!
Behoben

Antworten:

10

Pyth, 19 Bytes

:.iF*V.DQ60J"',"J\;

Testsuite

:.iF*V.DQ60J"',"J\;
      .DQ60            Divmod the input by 60, giving [hours, minutes].
           J"',"       Set J equal to the string "',".
    *V                 Perform vectorized multiplication, giving H "'" and M ','.
 .iF                   Interleave the two lists into a single string.
:               J\;    Perform a substitution, replacing J with ';'.
isaacg
quelle
8

CJam, 22 20 19 Bytes

Nimmt Eingaben von STDIN entgegen:

ri60md]',`.*:.{;K+}

Teste es hier.

Erläuterung

ri     e# Read input and convert to integer.
60md   e# Divmod 60, pushes hours H and minutes M on the stack.
]      e# Wrap in an array.
',`    e# Push the string representation of the comma character which is "',".
.*     e# Repeat apostrophe H times and comma M times.
:.{    e# Apply this block between every pair of characters. This will only applied to
       e# first N characters where N = min(hours,minutes). The others will remain
       e# untouched. So we want the block to turn that pair into a semicolon...
  ;    e#   Discard the comma.
  K+   e#   Add 20 to the apostrophe to turn it into a semicolon.
}

Es war wirklich ein Glück, wie gut die Dinge hier zusammengearbeitet haben, insbesondere die Zuweisung von Stunden zu 'und Minuten, ,so dass die Reihenfolge der Stunden und Minuten auf dem Stapel mit der Zeichenfolgendarstellung des Zeichens übereinstimmte.

Dies ist der einzige 3-Byte-Block, den ich bisher gefunden habe. Es gab Tonnen von 4-Zeichen-Lösungen:

{;;';}
{';\?}
{^'0+}
{^'F-}
{-'@+}
{-'6-}
...
Martin Ender
quelle
6

GNU Sed, 37

Die Punktzahl enthält +1 für die -EOption zum Beruhigen.

Ich war nicht besonders beeindruckt von der Golffreundlichkeit meiner Bash-Antwort und dachte, ich würde es aus Spaß mit sed versuchen.

Die Eingabe ist gemäß dieser Meta-Antwort unär .

y/1/,/          # Convert unary 1's to commas (minutes)
s/,{60}/'/g     # divmod by 60.  "'" are hours
:               # unnamed label
s/(.*)',/;\1/   # replace an apostrophe and comma with a semicolon
t               # jump back to unnamed label until no more replacements

Probieren Sie es online aus

Digitales Trauma
quelle
unbenanntes Etikett ??
mikeserv
@manatwork - ich denke, es muss ein GNU-Bug sein.
mikeserv
@mikeserv - aber auch die Verwendung von Bugs ist in Ordnung, oder? Ich bitte dich nicht zu verspotten, ich weiß es einfach nicht :)
Krzysiu
@ Krzysiu - ok? hmm. Ich denke, es wäre ein Zeichen für Exzellenz auf dieser Website. ansonsten fast definitiv nein. Wenn Programmierer von der API abweichen und Implementierungsdetails verwenden, werden Programme versions- / implementierungsabhängig - was eine schlechte Sache ist.
mikeserv
6

Python 2, 56 Bytes

def g(t):d=t%60-t/60;print(t/60*";")[:t%60]+","*d+"'"*-d

Eine Funktion, die druckt (ein Zeichen kürzer als t=input();).

Die Methode ähnelt der von Loovjo . Die Anzahl ,ist der Unterschied zwischen Minuten und Stunden mit einem impliziten Minimum von 0. Denn 'es ist die Negation. Für ;berechnet die minimplizit so viele , indem sie ;als Stunden, dann auf die Anzahl der Minuten Kürzen.

Das spart Zeichen d, aber nicht die Anzahl der Stunden und Minuten. Das Analogon mit Lambda war zwei Zeichen länger (58), daher lohnen sich die variablen Zuweisungen.

lambda t:(t%60*";")[:t/60]+","*(t%60-t/60)+"'"*(t/60-t%60)

Bei der direkten Verarbeitung der Eingabe wurden auch keine Zeichen gespeichert (58):

h,m=divmod(input(),60);d=m-h;print(";"*m)[:h]+","*d+"'"*-d

Eine andere Strategie mit viel längerem Schneiden (64):

def g(t):m=t%60;h=t/60;return(";"*m)[:h]+(","*m)[h:]+("'"*h)[m:]
xnor
quelle
3

Pure Bash (keine externen Dienstprogramme), 103

p()(printf -vt %$2s;printf "${t// /$1}")
p \; $[h=$1/60,m=$1%60,m>h?c=m-h,h:m]
p , $c
p \' $[m<h?h-m:0]

Vielen Dank an @ F.Hauri für das Speichern von 2 Bytes.

Digitales Trauma
quelle
Nett! Sie können jedoch 2 Zeichen sparen, indem Sie tauschen $1und $2in Zeile 3 p()schreiben p , $c.
F. Hauri
Ja, aber da es nur in a verwendet wird, funktioniert es gut printf "%s", wenn cleer ist (wenn es nicht wiederverwendet wird)
F. Hauri
@ F.Hauri Jetzt verstehe ich - danke!
Digital Trauma
3

C 119 Bytes

#define p(a,b) while(a--)putchar(b);
main(h,m,n){scanf("%d",&m);h=m/60;m%=60;n=h<m?h:m;h-=n;m-=n;p(n,59)p(h,39)p(m,44)}

Detailliert

// macro: print b, a times
#define p(a,b) while(a--)putchar(b)

int main(void)
{
    int h,m,n;
    scanf("%d",&m);  // read input

    h=m/60;m%=60;    // get hours:minutes
    n=h<m?h:m;       // get common count
    h-=n;m-=n;       // get remaining hours:minutes

    p(n,59);        // print common
    p(h,39);        // print remaining hours
    p(m,44);        // print remaining minutes

    return 0;
}
Khaled.K
quelle
1
Die Verwendung von putchar& Integer-Literalen als Zeichen spart ein Byte, das Ziehen der Semikolons im Makro spart zwei weitere :)
Quentin
@Quentin Notiz genommen, 5 Bytes gespeichert
Khaled.K
Sie können den Platz vor Ihrem whilein Ihrem #define-Makro verlieren . -1 Byte
Albert Renshaw
1
Sie können auch mehr Bytes speichern, indem Sie p (a, b) anstelle eines Makros zu einer Funktion machen. (Und streuen Sie ein paar Semikolons mehr zu Ihrer Hauptfunktion)
Albert Renshaw
3

Haskell, 68 66 Bytes

g(h,m)=id=<<zipWith replicate[min h m,h-m,m-h]";',"
g.(`divMod`60)

Anwendungsbeispiel:

(g.(`divMod`60)) 482

Das Schlaue dabei ist, dass replicatedie leere Zeichenfolge zurückgegeben wird, wenn die angegebene Länge negativ oder null ist, sodass ich sie auf beide Differenzen anwenden kann und nur die positive auftaucht. Der erste Teil ist einfach, da die Anzahl der Semikolons nur das Minimum der beiden ist. Dann zipWithwendet die Funktion auf die entsprechenden Positionen.

EDIT: Ich habe festgestellt, dass ich minutenlang den falschen Buchstaben verwendet habe

EDIT 2: 2 Bytes dank @Laikoni gespeichert

user1472751
quelle
Sie können durch den Austausch von zwei Bytes speichern concat$mit id=<<.
Laikoni
2

JavaScript (ES6) 69

m=>";".repeat((h=m/60|0)>(m%=60)?m:h)+",'"[h>m|0].repeat(h>m?h-m:m-h)
edc65
quelle
2

Powershell, 99 bis 85 Bytes

param($n)";"*(($m=$n%60),($h=$n/60))[($b=$m-gt$h)]+"'"*(($h-$m)*!$b)+","*(($m-$h)*$b)

Nach Loovjos Methode ist dies meine PowerShell-Implementierung.

ungolfed

param($n) 
# set the number of minutes and hours, and a boolean which one is bigger
# and also output the correct number of ;s
";"*(($m=$n%60),($h=$n/60))[($b=$m-gt$h)]+ 
# add the difference between h and m as 's but only if h > m
"'"*(($h-$m)*!$b)+
# add the difference between m and h as ,s but only if m > h
","*(($m-$h)*$b)

14 Bytes dank AdmBorkBork gespart

Björn Molenmaker
quelle
Sie können speichern, indem Sie ein Pseudoternäres für das erste verwenden, die $mund $h-Deklarationen darin verschieben und dann die boolesche Multiplikation verwenden. Gefällt param($n)';'*(($m=$n%60),($h=$n/60))[($b=$m-gt$h)]+'°'*(($h-$m)*!$b)+','*(($m-$h)*$b)
mir
1

Python 3, 98 Bytes

d=int(input());m=d%60;h=int((d-m)/60)
if m>=h:print(";"*h+","*(m-h))
else:print(";"*(m)+"'"*(h-m))

Wahrscheinlich nicht die beste Antwort, aber es hat viel Spaß gemacht!

Adnan
quelle
1

Python 2, 61 Bytes

t=input();m,h=t%60,t/60
print";"*min(h,m)+","*(m-h)+"'"*(h-m)

Erklärung:

t=input();              # Read input
          m,  t%60,     # Do a divmod, h = div, m = mod
            h=     t/60

print";"*min(h,m)+                    # Print the minimum of the h and m, but in ";"s
                  ","*(m-h)+          # Print (m-h) ","s (if m-h is negative, print nothing)
                            "'"*(h-m) # Print (h-m) "'"s (if h-m is negative, print nothing)
Loovjo
quelle
1

PHP, 81 Bytes

Ich habe mich für die Variableneingabe entschieden, da sie kürzer ist als das Lesen von STDINoder das Verwenden von Befehlszeilenargumenten.

for($_=1439;$i<max($h=0|$_/60,$m=$_%60);++$i)echo$i<$h?$i<min($h,$m)?';':"'":",";
insertusernamehere
quelle
Ich dachte, ich kenne PHP ziemlich gut, aber ich verstehe | zum ersten Mal. Ich denke, ich werde es verwenden, um ein bisschen zu trainieren - ich werde es analysieren :)
Krzysiu
Scheitert für 240. Versuchen Sie $i>=min($h,$m)?$h<$m?",":"'":";"(+1 Byte). Oder verwenden Sie for($_=1439;$i<max($h=0|$_/60,$m=$_%60);)echo"',;"[$i++<min($h,$m)?2:$h<$m];(76 Bytes). Übrigens: Single Quote macht -runmöglich; Sie sollten Backtick also stundenlang verwenden, wenn Sie sich in einer Zeichenfolge oder in einer °eigenständigen Zeichenfolge befinden (erfordert keine Anführungszeichen -> -1 Byte).
Titus
1

JavaScript (ES6), 77 71 Bytes

x=>';'[r='repeat'](y=Math.min(h=x/60|0,m=x%60))+"'"[r](h-y)+','[r](m-y)
Mwr247
quelle
Sehr gute Verwendung von Zuweisungen in Attributzugriffs- / Funktionsargumenten. +1
Cyoce
1

Perl 6, 103 101 98 97 69 Bytes

$_=get;say ";"x min($!=($_-$_%60)/60,$_=$_%60)~"'"x $!-$_~","x $_-$!;

Gibt mehrere Arrays aus, aber scheiß drauf, viel Spaß. Wie immer sind alle Golfmöglichkeiten gegeben.

Edit: -2 Bytes: Wurde mutig und entfernte einige Casts.

Edit2: -3 Bytes durch Entfernen der Arrays.

Edit3: -1 Byte zum Drucken im richtigen Format mit "Lambdas" und Entfernen von Klammern.

Edit4: (sorry guys) Missbrauch dieser Stunden - Minuten sollte 0 und das Gegenteil zurückgeben. Entfernte if-Anweisungen. Dann entferne ich die Klammern und stelle fest, dass ich das Lambda überhaupt nicht brauchte. -28 Bytes :)

Woah, ich werde besser darin.

Håvard Nygård
quelle
0

C 141 Bytes

main(h,m){scanf("%d",&m);h=(m/60)%24;m%=60;while(h||m){if(h&&m){printf(";");h--;m--;}else if(h&&!m){printf("'");h--;}else{printf(",");m--;}}}
user2064000
quelle
Ich denke, Sie könnten mit ein paar Bytes sparen h>0||m>0. Dann müssen Sie h--;m--;nur einmal in jeder Iteration und das {}für if/elsewürde veralten.
insertusernamehere
Sie können auch ein paar Bytes unter Ihrer zweiten Bedingung speichern: Stattdessen else if(h&&!m)können Sieelse if(h)
Hellion
Und schließlich versuchen Sie, den ternären Operator zu verwenden, der Sie davor bewahrt, "lange" Wörter wie ifund zu verwenden else.
insertusernamehere
Betrachten Sie das Refactoring als eine Funktion, die die Eingabe als int-Parameter verwendet - das sollte Ihnen zumindest das ersparen scanf().
Digital Trauma
Ich denke nicht, dass das %24notwendig ist - maximale Eingabe ist 23:59.
Digital Trauma
0

Gema, 119 Zeichen

<D>=@set{h;@div{$0;60}}@set{m;@mod{$0;60}}@repeat{@cmpn{$h;$m;$h;$h;$m};\;}@repeat{@sub{$h;$m};'}@repeat{@sub{$m;$h};,}

Probelauf:

bash-4.3$ gema '<D>=@set{h;@div{$0;60}}@set{m;@mod{$0;60}}@repeat{@cmpn{$h;$m;$h;$h;$m};\;}@repeat{@sub{$h;$m};`}@repeat{@sub{$m;$h};,}' <<< '252'
;;;;,,,,,,,,
Mann bei der Arbeit
quelle
0

Matlab: 89 Bytes

i=input('');m=mod(i,60);h=(i-m)/60;[repmat(';',1,min(h,m)),repmat(39+5*(m>h),1,abs(h-m))]

Prüfung:

310
ans =
;;;;;,,,,,
brainkz
quelle
0

SmileBASIC, 59 Bytes

INPUT M
H%=M/60M=M-H%*60?";"*MIN(H%,M);",'"[M<H%]*ABS(H%-M)

Erklärt:

INPUT MINUTES 'input
HOURS=MINUTES DIV 60 'separate the hours and minutes
MINUTES=MINUTES MOD 60
PRINT ";"*MIN(HOURS,MINUTES); 'print ;s for all positions with both
PRINT ",'"[MINUTES<HOURS]*ABS(HOURS-MINUTES) 'print extra ' or ,

Es sieht ziemlich schrecklich aus, da der untere Teil von ;nicht einmal derselbe ist wie ,in der Schriftart von SmileBASIC

12Me21
quelle
0

PHP, 81 Bytes

Einige weitere Lösungen:

echo($r=str_repeat)(";",min($h=$argn/60,$m=$argn%60)),$r(",`"[$h>$m],abs($h-$m));
// or
echo($p=str_pad)($p("",min($h=$argn/60,$m=$argn%60),";"),max($h,$m),",`"[$h>$m]);

Laufen Sie mit echo <time> | php -R '<code>'.

<?=($r=str_repeat)(";",min($h=($_=1439)/60,$m=$_%60)),$r(",`"[$h>$m],abs($h-$m));
// or
<?=($r=str_repeat)(";",min($h=.1/6*$_=1439,$m=$_%60)),$r(",`"[$h>$m],abs($h-$m));
// or
<?=str_pad(str_pad("",min($h=($_=1439)/60,$m=$_%60),";"),max($h,$m),",`"[$h>$m]);

Durch 1439Eingabe ersetzen , in Datei speichern, ausführen.

Titus
quelle
0

Ruby, 50 Zeichen

->t{(?;*h=t/60)[0,m=t%60]+",',"[0<=>m-=h]*m.abs}

Dank an:

  • GB für
    • erinnere mich daran, dass ich nicht mehr Zeichen aus einer Zeichenkette nehmen kann, als sie hat (-1 Zeichen)
    • meine Rechnung umstellen (-1 Zeichen)

Ich habe so lange darauf gewartet, es zu benutzen Numeric.divmod, nur um zu erkennen, dass es fürchterlich lang ist.

Probelauf:

2.1.5 :001 > puts ->t{(?;*h=t/60)[0,m=t%60]+",',"[0<=>m-=h]*m.abs}[252]
;;;;,,,,,,,,
Mann bei der Arbeit
quelle
1
Speichern Sie 1 Zeichen, indem Sie die Zeichenfolge abschneiden, anstatt min zu verwenden:(?;*h=t/60)[0,m=t%60]
GB
1
Und noch ein Byte durch Subtrahieren von h von m:",',"[0<=>m-=h]*m.abs
GB
0

05AB1E , 25 Bytes

60‰vy„'.Nè×}‚.BøJ„'.';:ðK

Probieren Sie es online!

60‰vy„'.Nè×}kann definitiv verkürzt werden, ich konnte es einfach nicht herausfinden und bezweifle, dass ich 7 Bytes abschneiden kann, um mit diesem Ansatz zu gewinnen, es sei denn, es gibt eine vektorisierte Version von ×.


Beispiel (mit Eingabe gleich 63):

60‰                       # Divmod by 60.
                          # STACK: [[1,3]]
   vy      }              # For each element (probably don't need the loop)...
                          # STACK: []
     „'.Nè×               # Push n apostrophe's for hours, periods for minutes.
                          # STACK: ["'","..."]
            ‚             # Group a and b.
                          # STACK: [["'","..."]]
             .B           # Boxify.
                          # STACK: [["'  ","..."]]
               ø          # Zip it (Transpose).
                          # STACK: [["'."," ."," ."]
                J         # Join stack.
                          # STACK: ["'. . ."]
                 „'.';:   # Replace runs of "'." with ";".
                          # STACK: ["; . ."]
                       ðK # Remove all spaces.
                          # OUTPUT: ;..

D60÷''×s60%'.ׂ.BøJ„'.';:ðK war meine ursprüngliche Version, aber das ist noch teurer als divmod.

60‰WDµ';ˆ¼}-¬0Qi'.ë''}ZׯìJ Noch eine andere Methode, die ich ausprobiert habe ...

Magische Kraken-Urne
quelle
0

Java 8, 101 99 86 Bytes

n->{String r="";for(int m=n%60,h=n/60;h>0|m>0;r+=h--*m-->0?";":h<0?",":"'");return r;}

Erläuterung:

Probieren Sie es hier aus.

n->{                      // Method with integer parameter and String return-type
  String r="";            //  Result-String (starting empty)
  for(int m=n%60,h=n/60;  //   Get the minutes and hours from the input integer
      h>0|m>0;            //   Loop as long as either the hours or minutes is above 0
    r+=                   //   Append the result-String with:
       h--*m-->0?         //    If both hours and minutes are above 0
                          //    (and decrease both after this check):
        ";"               //     Use ";"
       :h<0?              //    Else-if only minutes is above 0 (hours is below 0)
        ","               //     Use ","
       :                  //    Else:
        "'"               //     Use "'"
  );                      //  End loop
  return r;               //  Return the result
}                         // End of method
Kevin Cruijssen
quelle