Zegar ASCII ze znacznikami czasu kropek i przecinków


39

Wprowadzenie

wyjaśnienie kodu golfa

Wyobraź sobie, że linia znaków zawiera dwa rzędy. Górny rząd - kropki - reprezentuje godziny (system 24-godzinny), podczas gdy dolny - przecinek - reprezentuje minuty . Jedna postać może reprezentować godzinę, minutę lub jedno i drugie - gdy tylko jest to możliwe.

Najpierw prawdopodobnie będziesz musiał przeliczyć minuty od północy na godziny i minuty .

Wynikiem jest ciąg pokazujący aktualny czas w „formacie kropkowym”. Liczba kropek ( apostrof liczy się tutaj jako kropka i tak się nazywa! ) To liczba godzin od północy, a liczba przecinków to liczba minut. Pokażę kilka przykładów, aby to wyjaśnić.

  • (Uwaga) gg: mm - result
  • (Tylko godziny) 05:00 - '''''
  • (Tylko minuty) 00:08 - ,,,,,,,,
  • (godziny <minuty) 03:07 - ;;;,,,,
  • (godziny> minuty) 08:02 - ;;''''''
  • (godziny = minuty) 07:07 - ;;;;;;;
  • (początek dnia) 00:00 - ( pusty wynik )

Zauważ, że znak „oba” można użyć maksymalnie 23 razy - dla 23: xx, gdzie xx to 23 lub więcej.

Symbolika

Jeśli postać musi (patrz reguła 5) być w twoim języku, możesz ją zmienić na jedną z alternatyw. Jeśli wspomniane alternatywy nie są wystarczające, możesz użyć innych symboli - ale zachowaj rozsądek. Po prostu nie chcę, żeby ucieczka była barierą.

  • ;(średnik) - marker zarówno godziny i minuty (alt: :)
  • '(apostrof) - marker godzin (alt: '``°)
  • ,(przecinek) - marker minut (alt: .)

Dodatkowe zasady

  1. Wygrywa kod z najmniejszą liczbą bajtów!
  2. Musisz użyć obu symboli, ilekroć jest to możliwe. W przypadku 02:04 wynik nie może być '',,,,, ani ;',,,. To musi być;;,,
  3. Dane wejściowe - może być parametrem skryptu / aplikacji, danymi wejściowymi użytkownika (np. Readline) lub zmienną w kodzie
    3.1. Jeśli używana jest zmienna wewnątrz kodu, to jego długość musi być jak najdłuższa. Jest 1439(23:59), więc tak by wyglądałot=1439
  4. Część wspólna symbolizowana przez znak „oba” (12 w 12:05, 3 w 03:10) musi zostać umieszczona na początku ciągu
  5. Symbole można zastąpić alternatywami tylko wtedy, gdy będą musiały być poprzedzone znakami ucieczki w kodzie.
  6. Dane są podawane w minutach po 00:00 . Możesz założyć, że jest to nieujemna liczba całkowita.

Przypadki testowe

Input: 300
Output: '''''

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

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

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

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

Input: 0
Output:  (empty)

Dziękuję, Adnan za edycję mojego postu! W ten sposób nauczę się, porównując mój nowy golf do twojego :)
Krzysiu

3
Nie ma problemu! To bardzo dobry pierwszy post i niezłe wyzwanie :)
Adnan

1
wygląda to tak dobrze tylko z średnikami i przecinkami, ale apostrofy spieprzą wszystko :(
Sparr

W rzeczywistości 1439jest 23:59i nie 1339. (23 x 60 + 59).
inserttusernamehere

Dziękuję wszystkim za dobre słowa! :) @Sparr, tak, to jest zły punkt :( Czy wiesz, jak można go zastąpić? Wstawić nazwę użytkownika, oczywiście, że tak! Naprawiono :)
Krzysiu

Odpowiedzi:


10

Pyth, 19 bajtów

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

Zestaw testowy

:.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 ';'.

8

CJam, 22 20 19 bajtów

Pobiera dane wejściowe z STDIN:

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

Sprawdź to tutaj.

Wyjaśnienie

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

To było naprawdę szczęście, jak dobrze wszystko tutaj działało, w szczególności przypisanie godzin do 'minut ,tak, że kolejność godzin i minut na stosie była zgodna z ciągiem znaków postaci.

To jedyny 3-bajtowy blok, jaki do tej pory znalazłem. Było jednak mnóstwo rozwiązań 4-znakowych:

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

6

GNU Sed, 37

Wynik obejmuje +1 za -Eopcję sed.

Nie byłem pod wrażeniem golfowej odpowiedzi na bash , więc pomyślałem, że spróbuję z sed dla zabawy.

Dane wejściowe są jednoargumentowe, zgodnie z tą meta-odpowiedzią .

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

Wypróbuj online


nienazwana etykieta?
mikeserv


@manatwork - myślę, że to musi być błąd GNU.
mikeserv

@mikeserv - ale używanie błędów również jest w porządku, prawda? Nie proszę cię kpić, po prostu nie wiem :)
Krzysiu,

@Krzysiu - ok? hmm na tej stronie myślę, że byłby to znak doskonałości. w przeciwnym razie prawie na pewno nie. kiedy programiści zbaczają z API i używają szczegółów implementacji, programy stają się zależne od wersji / implementacji - co jest złą rzeczą.
mikeserv

6

Python 2, 56 bajtów

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

Funkcja, która drukuje (jeden znak krótszy niż t=input();).

Metoda jest podobna do Loovjo . Liczba ,jest różna między minutami i godzinami, z domyślnym minimum 0. Dla ', to jest negacja. Ponieważ ;oblicza mindomyślnie, biorąc tyle ;godzin, a następnie skracając do liczby minut.

Oszczędza znaki, aby zaoszczędzić d, ale nie liczbę godzin i minut tutaj. Analog z lambda był o dwa znaki dłuższy (58), więc warto przypisać zmienne.

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

Bezpośrednie przetwarzanie danych wejściowych również nie zapisywało znaków (58):

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

Kolejna strategia z krojeniem, znacznie dłużej (64):

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


3

Pure Bash (bez zewnętrznych narzędzi), 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]

Dzięki @ F.Hauri za zapisanie 2 bajtów.


Miły! Ale można zaoszczędzić 2 znaki poprzez zamianę $1i $2w p()i pisać p , $cna linii 3.
F. HAURI

Tak, ale jak to jest stosowane tylko w printf "%s", mający cpracę pusty wola w porządku (choć nie użyć ponownie)
F. Hauri

@ F.Hauri Teraz rozumiem - dzięki!
Cyfrowy uraz

3

C, 119 bajtów

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

Szczegółowy

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

1
Używanie putcharliterałów całkowitych i znaków jako znaków oszczędza jeden bajt, ciągnięcie średników wewnątrz makra oszczędza jeszcze dwa :)
Quentin

@ Zapisano notatkę Quentin, zapisano 5 bajtów
Khaled.K

Możesz stracić miejsce przed swoim whilemakrem #define. -1 bajt
Albert Renshaw

1
Możesz także zaoszczędzić trochę więcej bajtów, po prostu tworząc funkcję p (a, b) zamiast makra. (I posypując jeszcze kilka średnikami do swojej głównej funkcji)
Albert Renshaw

3

Haskell, 68 66 bajtów

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

Przykład użycia:

(g.(`divMod`60)) 482

Sprytny bit polega na tym, replicateże zwróci pusty ciąg, jeśli podana długość jest ujemna lub zero, więc mogę zastosować go do obu różnic i tylko ta dodatnia się pojawi. Pierwsza część jest łatwa, ponieważ liczba średników jest tylko minimum dwóch. Następnie zipWithstosuje funkcję do odpowiednich pozycji.

EDYCJA: Zdałem sobie sprawę, że przez kilka minut używałem niewłaściwego znaku

EDYCJA 2: Zaoszczędź 2 bajty dzięki @Laikoni


Możesz zapisać dwa bajty, zastępując concat$je 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)

2

PowerShell, 99 85 bajtów

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

Używając metody Loovjo , jest to moja implementacja PowerShell.

bez golfa

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)

Zaoszczędzono 14 bajtów dzięki AdmBorkBork


Można zapisać za pomocą pseudo trójskładnikowymi do pierwszej, przesuwając $mi $hdeklaracje do niego, a następnie przy użyciu logiczną mnożenia. Tak jak -param($n)';'*(($m=$n%60),($h=$n/60))[($b=$m-gt$h)]+'°'*(($h-$m)*!$b)+','*(($m-$h)*$b)
AdmBorkBork

1

Python 3, 98 bajtów

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

Prawdopodobnie nie najlepsza odpowiedź, ale była świetna zabawa!


1

Python 2, 61 bajtów

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

Wyjaśnienie:

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)

1

PHP, 81 bajtów

Poszedłem do zmiennej wejściowej, ponieważ jest ona krótsza niż czytanie STDINlub przyjmowanie argumentów wiersza poleceń.

for($_=1439;$i<max($h=0|$_/60,$m=$_%60);++$i)echo$i<$h?$i<min($h,$m)?';':"'":",";

Myślałem, że dość dobrze znam PHP, ale widzę | po raz pierwszy. Myślę, że wykorzystam to do ćwiczenia - przeanalizuję to :)
Krzysiu,

Nie działa na 240. Spróbuj $i>=min($h,$m)?$h<$m?",":"'":";"(+1 bajt). Lub użyj for($_=1439;$i<max($h=0|$_/60,$m=$_%60);)echo"',;"[$i++<min($h,$m)?2:$h<$m];(76 bajtów). Btw: pojedynczy cytat -runiemożliwia; więc powinieneś używać backticka przez wiele godzin, jeśli jest to ciąg lub °samodzielny (nie wymaga cudzysłowów -> -1 bajt).
Tytus

1

JavaScript (ES6), 77 71 bajtów

x=>';'[r='repeat'](y=Math.min(h=x/60|0,m=x%60))+"'"[r](h-y)+','[r](m-y)

Świetne wykorzystanie przypisań w argumentach dostępu do atrybutu / funkcji. +1
Cyoce

1

Perl 6, 103 101 98 97 69 bajtów

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

Generuje kilka tablic, ale pieprzyć to, ciesz się. Jak zwykle, wszelkie możliwości gry w golfa są apperowane.

Edycja: -2 bajty: stał się odważny i usunął niektóre obsady.

Edycja2: -3 bajty poprzez usunięcie tablic.

Edytuj3: -1 bajt, aby wydrukować w odpowiednim formacie, używając „lambdas” i usuwając nawiasy.

Edit4: (przepraszam) nadużywają tych godzin - minuty powinny zwracać 0 i odwrotnie. Usunięto instrukcje if. Następnie usuwając nawiasy, a potem uświadamiając sobie, że wcale nie potrzebowałem lambda. -28 bajtów :)

Woah, jestem w tym lepszy.


0

C, 141 bajtów

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

Myślę, że możesz zaoszczędzić kilka bajtów, używając h>0||m>0. Następnie musisz h--;m--;tylko raz w każdej iteracji, a {}for if/elsestałoby się przestarzałe.
inserttusernamehere

Możesz także zapisać kilka bajtów na drugim warunku: zamiast tego else if(h&&!m)możesz po prostu miećelse if(h)
Hellion

I w końcu spróbuj użyć operatora trójskładnikowego, dzięki czemu nie będziesz używać „długich” słów, takich jak ifi else.
inserttusernamehere

Rozważ refaktoryzację jako funkcję, która przyjmuje dane wejściowe jako parametr int - co powinno przynajmniej zaoszczędzić scanf().
Digital Trauma,

Nie sądzę, że %24jest to konieczne - maksymalny wkład to 23:59.
Cyfrowy uraz

0

Gema, 119 znaków

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

Przykładowy przebieg:

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'
;;;;,,,,,,,,

0

Matlab: 89 bajtów

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

Test:

310
ans =
;;;;;,,,,,

0

SmileBASIC, 59 bajtów

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

Wyjaśniono:

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 ,

Wygląda to dość straszne, ponieważ dolna część ;nie jest nawet takie same, jak ,w czcionce SmileBASIC za


0

PHP, 81 bajtów

kilka innych rozwiązań:

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

Uruchom z 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]);

Zamień na 1439dane wejściowe, zapisz do pliku, uruchom.


0

Ruby, 50 znaków

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

Dzięki:

  • GB dla
    • przypominając mi, że nie mogę pobrać więcej znaków z ciągu niż ma (-1 znak)
    • reorganizacja moich obliczeń (-1 znak)

Tak długo czekałem na użycie Numeric.divmod, by zdać sobie sprawę, że jest strasznie długi.

Przykładowy przebieg:

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

1
Zapisz 1 znak, obcinając ciąg zamiast używać min:(?;*h=t/60)[0,m=t%60]
GB

1
I kolejny bajt odejmując h od m:",',"[0<=>m-=h]*m.abs
GB

0

05AB1E , 25 bajtów

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

Wypróbuj online!

60‰vy„'.Nè×}można zdecydowanie skrócić, po prostu nie mogłem tego rozgryźć i wątpię, czy uda mi się wygolić 7 bajtów, aby wygrać dzięki temu podejściu, chyba że istnieje wersja wektorem ×.


Przykład (z wejściem równym 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 była moja oryginalna wersja, ale jest to nawet WIĘCEJ kosztowne niż divmod.

60‰WDµ';ˆ¼}-¬0Qi'.ë''}ZׯìJ jeszcze jedną metodę próbowałem ...



0

Java 8, 101 99 86 bajtów

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

Wyjaśnienie:

Wypróbuj tutaj.

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.