Nokta ve virgül zaman işaretleyicili ASCII saat


39

Giriş

kod golf açıklaması

Aslında bu karakter çizgisinin iki sıra olduğunu hayal edin. Üst sıra - noktalar - saati (24 saat sistemi) belirtirken, alt virgüller - dakikaları temsil eder . Bir karakter, mümkün olduğu zaman saati, dakikayı veya her ikisini temsil edebilir .

İlk başta, muhtemelen dakikaları gece yarısından saatlere ve dakikalara dönüştürmeniz gerekir .

Sonuç, geçerli saati "nokta biçiminde" gösteren dizgedir. Nokta sayımı ( kesme işareti burada nokta olarak sayılır ve bu şekilde adlandırılır! ) Gece yarısından beri saat sayımıdır ve virgül sayımı dakika sayımıdır. Bunu açıklığa kavuşturmak için birkaç örnek göstereceğim.

  • (Açıklama) ss: d - result
  • (Sadece saatler) 05:00 - '''''
  • (Sadece dakikalar) 00:08 - ,,,,,,,,
  • (saat <dakika) 03:07 - ;;;,,,,
  • (saat> dakika) 08:02 - ;;''''''
  • (saat = dakika) 07:07 - ;;;;;;;
  • (günün başlangıcı) 00:00 - ( boş sonuç )

"Her iki" karakterin en fazla 23 kez kullanılabildiğine dikkat edin - 23: xx için, burada xx 23 veya daha fazladır.

Semboller

Karakter ise gerek kendi dilinizde öncelenmelidir (kural 5. bakınız), alternatif çözümlerden birine değiştirdi başladı. Eğer söylenen alternatifler yeterli değilse, başka semboller de kullanabilirsiniz - ancak makul olmasını sağlayın. Sadece bir engel olmaktan kaçmak istemiyorum.

  • ;(alt: saat ve dakika hem de markör - (noktalı virgül) :)
  • '(alt: saat için markör - (kesme işareti) '``°)
  • ,(alt: dakika için markör - (virgül) .)

Ek kurallar

  1. En az baytlık olan kod kazanır!
  2. Her iki sembolü de mümkün olduğunda kullanmanız gerekir. 02:04 için sonuç olamaz '',,,,, ne de ;',,,. Olmalı;;,,
  3. Giriş - script / app parametresi, kullanıcı girişi (readline gibi) veya kod
    3.1 içindeki değişken olabilir . Kod içindeki değişken kullanılırsa, uzunluğu mümkün olan en uzun olmalıdır. Bu 1439(23:59), öyleyse öyle gözüküyordu.t=1439
  4. "Her iki" karakteriyle sembolize edilen ortak bölüm (12: 12: 12'de, 03: 10'da 3) dizenin başına konulmalıdır
  5. Semboller, yalnızca kodunuzdan kaçmaları gerektiğinde alternatiflerle değiştirilebilir.
  6. Giriş, 00: 00'dan sonra dakikalar içinde verilir . Bunun negatif olmayan bir tamsayı olduğunu varsayabilirsiniz.

Test durumları

Input: 300
Output: '''''

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

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

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

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

Input: 0
Output:  (empty)

Görevimi düzenlediğiniz için teşekkür ederim Adnan! Bu sayede, yeni golf
oyunumu

3
Sorun değil! Bu çok iyi bir ilk yazı ve güzel bir meydan okuma :)
Adnan

1
Bu sadece noktalı virgül ve virgül ile çok iyi görünüyor, ancak kesme işareti her şeyi
emmek

Aslında 1439öyle 23:59değil 1339. (23 x 60 + 59).
insertusername

Güzel sözler için hepinize teşekkür ederim! :) :) evet, @Sparr, bu kötü nokta :( var o yerinden olabilir nasıl bir fikir insertusernamehere sağ Sabit oluyor Var elbette?!
Krzysiu

Yanıtlar:


10

Pyth, 19 bayt

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

Test odası

:.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 bayt

STDIN'den girdi alır:

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

Burada test et.

açıklama

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

Olayların özellikle burada bir araya saatlik atama nasıl çalıştığını iyi gerçekten şanslı 've dakika ,yığın saat ve dakika sırası karakterinin dize gösterimi ile eşleşti böyle.

Bu, şu ana kadar bulduğum tek 3 baytlık blok. Ancak 4 karakterlik çözüm ton vardı:

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

6

GNU Sed, 37

Skor -Eseçeneği için +1'i içerir .

Özellikle benim bir golfiness ile etkilendim değildi bash cevap ben eğlenmek için sed ile denemek düşündüm bu yüzden.

Bu meta cevabına göre girdi birleşiktir .

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

Çevrimiçi deneyin


adsız etiket
mikeserv


@ manatwork - Bunun bir GNU hatası olması gerektiğini düşünüyorum.
mikeserv

@mikeserv - ama böcek kullanmak da sorun değil mi? Seninle alay etmek istemiyorum, sadece bilmiyorum :)
Krzysiu

@Krzysiu - tamam? hı. üzerinde bu sitede ben mükemmellik bir işaret olacağını düşünüyorum. Aksi takdirde, kesinlikle kesinlikle hayır. programcılar API'den ayrılıp uygulama ayrıntılarını kullandıklarında, programlar sürüme / uygulamaya bağımlı hale gelir - bu kötü bir şeydir.
mikeserv

6

Python 2, 56 bayt

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

Yazdırılan bir işlev (bir karakterden kısa t=input();).

Yöntem Loovjo'nunkine benzer . Sayısı ,için 0 örtülü bir minimim ile, dakika ve saat arasında farklı olan 'bu olumsuzluk var. Çünkü ;, minörtülü ;olarak saat kadar sürerek hesaplar , sonra dakika sayısını kısaltır.

Tasarruf etmek için karakter kaydeder d, ancak burada saat ve dakika sayısı yoktur. Lambda ile analog iki karakter daha uzundu (58), bu yüzden değişken atamaları buna değer.

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

Girişi doğrudan işlemek, karakterleri de kaydetmedi (58):

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

Dilimleme ile başka bir strateji, çok daha uzun (64):

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


3

Saf Bash (harici yardımcı program yoktur), 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]

2 bayt tasarrufu için @ F.Hauri teşekkürler.


Güzel! Ama değiştirerek 2 karakter kurtarabilecek $1ve $2içinde p()ve yazma p , $chat 3'te
F. Hauri

Evet, ancak yalnızca printf "%s"c
a'da

@ F.Hauri Şimdi anladım - teşekkürler!
Dijital Travma

3

C, 119 bayt

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

Detaylı

// 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
Kullanılması putcharkarakterler bir bayt kaydeder olarak makrosundaki noktalı virgül çekerek, & tamsayı değişmezleri :) iki tane daha kaydeder
Quentin

@Quentin notu 5 bayt kurtardı
Khaled.K

Öncesinde while#define makronuzdaki alanı kaybedebilirsiniz . -1 bayt
Albert Renshaw

1
Makro yerine sadece p (a, b) fonksiyonunu yaparak da bazı baytları kaydedebilirsiniz. (Ve ana işlevinize birkaç tane daha virgül serpme)
Albert Renshaw

3

Haskell, 68 66 Bayt

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

Kullanım örneği:

(g.(`divMod`60)) 482

Buradaki zekice bit, replicateverilen uzunluk negatif veya sıfır ise boş dizgiyi döndürür, böylece onu iki farklılığa da uygulayabilirim ve sadece pozitif olanı ortaya çıkar. İlk bölüm kolaydır, çünkü noktalı virgüllerin sayısı ikisinin yalnızca minimumudur. Ardından zipWithişlevi ilgili öğelere uygular.

EDIT: Farkında dakikalarca yanlış karakter kullanıyordum

EDIT 2: @Laikoni sayesinde 2 bayt kaydedildi


Sen değiştirerek iki bayt kaydedebilirsiniz concat$ile 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 bayt

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

Loovjo'nun metodunu kullanarak , bu benim powershell uygulamam.

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)

AdmBorkBork sayesinde 14 bayt kaydedildi


İlki bir sözde üçlüsü kullanarak , $mve $hbildirimlerini içine taşıyarak ve sonra Boolean çarpımını kullanarak tasarruf edebilirsiniz . Öyle -param($n)';'*(($m=$n%60),($h=$n/60))[($b=$m-gt$h)]+'°'*(($h-$m)*!$b)+','*(($m-$h)*$b)
AdmBorkBork

1

Python 3, 98 bayt

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

Muhtemelen en iyi cevap değil, ama çok eğlenceliydi!


1

Python 2,61 bayt

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

Açıklama:

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 bayt

Değişken girdisine gittim, okumadan STDINveya komut satırı argümanlarını almaktan daha kısa olduğu için gittim .

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

PHP'yi çok iyi tanıdığımı sanıyordum ama görüyorum | ilk kez. Biraz egzersiz yapmak için kullanacağımı düşünüyorum - analiz edeceğim :)
Krzysiu

İçin başarısız 240. Deneyin $i>=min($h,$m)?$h<$m?",":"'":";"(+1 bayt). Veya kullanın for($_=1439;$i<max($h=0|$_/60,$m=$_%60);)echo"',;"[$i++<min($h,$m)?2:$h<$m];(76 bayt). BTW: tek alıntı -rimkansız kılar ; Bu nedenle, bir dizgede veya °bağımsız bir durumda ise saatlerce geriye doğru hareket etmelisiniz (tırnak işaretleri gerektirmez - -1 bayt).
Titus

1

JavaScript (ES6), 77 71 bayt

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

Öznitelik erişim / işlev bağımsız değişkenlerinde atamaların harika kullanımı. +1
Cyoce

1

Perl 6, 103 101 98 97 69 bayt

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

Birkaç dizi çıktılar, ama kahretsin, tadını çıkar. Her zaman olduğu gibi, herhangi bir golf fırsatı değerlendirilir.

Düzenleme: -2 bayt: cesur ve bazı atmalarını kaldırdı.

Düzen2: -3 bayt dizileri kaldırarak.

Edit3: -1 byte, "lambdas" kullanarak ve parantezleri kullanarak doğru biçimde yazdırmak için.

Edit4: (üzgünüm çocuklar) bu saatler kötüye - dakika 0 ve tersi dönmelidir. If ifadeleri kaldırıldı. Sonra parantezi söküp, sonra lambdaya hiç ihtiyacım olmadığını farkettim. -28 bayt :)

Woah bu işte daha iyi oluyor.


0

C, 141 bayt

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

Bir kaç bayt kullanarak tasarruf edebileceğinizi düşünüyorum h>0||m>0. O zaman h--;m--;her yinelemede sadece bir kez yapmanız gerekir ve bunun {}için if/elseeski kalır .
insertusernamehere

Ayrıca, ikinci şartlamanıza bir kaç byte kaydedebilirsiniz: bunun yerine else if(h&&!m)sadece sahip olabilirsinizelse if(h)
Hellion

Ve son olarak, kullanarak kurtaracak gibi "uzun" kelimeleri üçlü operatörü kullanmayı deneyin ifve else.
insertusernamehere

Yeniden düzenlemeyi, girişi bir int parametresi olarak alan bir işlev olarak düşünün - en azından sizi kurtarması gerekir scanf().
Dijital Travma

%24Gerekli olduğunu sanmıyorum - maksimum giriş 23:59.
Dijital Travma

0

Gema, 119 karakter

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

Örnek çalışma:

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 bayt

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

Ölçek:

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

0

SmileBASIC, 59 bayt

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

Açıklaması:

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 ,

Alt kısmı, çünkü oldukça korkunç görünüyor ;bile aynı değildir ,yılında SmileBASIC en yazı


0

PHP, 81 bayt

biraz daha fazla çözüm:

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

İle koş 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]);

1439Giriş ile değiştirin , dosyaya kaydedin, çalıştırın.


0

Yakut, 50 karakter

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

Sayesinde:

  • GB için
    • Bana bir dizgiden (-1 karakterden daha fazla karakter alamayacağımı hatırlatıyor)
    • hesaplamamı yeniden düzenleme (-1 karakter)

Çok uzun süre bekledik Numeric.divmod, sadece korkunç derecede uzun olduğunu fark etmek için.

Örnek çalışma:

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

1
Min kullanmak yerine dizgiyi kısarak 1 karakterden tasarruf edin:(?;*h=t/60)[0,m=t%60]
GB

1
Ve başka bir bayt, m'den h çıkartarak:",',"[0<=>m-=h]*m.abs
GB

0

05AB1E , 25 bayt

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

Çevrimiçi deneyin!

60‰vy„'.Nè×}kesinlikle kısaltılabilir, sadece çözemedim ve şüpheli bir sürümü olmadıkça, bu yaklaşımı kazanmak için 7 byte'ı kaldırabileceğime şüpheliyim ×.


Örnek (63'e eşit giriş):

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 benim orijinal versiyonumdu, ama divmod'dan bile pahalı.

60‰WDµ';ˆ¼}-¬0Qi'.ë''}ZׯìJ denedim başka bir yöntem ...



0

Java 8, 101 99 86 bayt

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

Açıklama:

Burada dene.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.