codegolf.com: Zamandan Tasarruf


11

Codegolf.com (15 Eylül 2011'den itibaren yüklenmiyor) beni çıldırtan biriydi. Kesin bir formun bir saati STDOUT'a yazdırın, STDIN'den okuma süresi ve hsaatte ve mdakikada bir işaretleme (5'in katına yuvarlanır) ve xçakışırsa kullanılmayan keneler bir ile işaretlenir o, böylece

echo "23:13" | perl script.pl

verim

        o
    h       o

 o             m

o               o

 o             o

    o       o
        o

Benimki:

$/=':';($h,$m)=<>;printf'%9s
%5s%8s

%2s%14s

%s%16s

%2s%14s

%5s%8s
%9s',map{qw'o h m x'[2*($_==int$m/5)^$_==$h%12]}map{$_,11-$_}0..5

Perl kullanarak 136 karakter için. Keşke siteye girebilseydim, ama liderlerin 100'ün altında olduğunu ve Perl'i kullandıklarını hatırlıyorum. Başkası yenebilir mi?



Büyüleyici bir okuma :)
JB

@Peter, altın madeni! Bunu bulduğunuz için teşekkür ederim, merak ediyorum benim tekniklerini uyarlayabilir mi?
Joel Berger

1
Bir daire yerine böyle bir limon şeklinde bir şey kullanmanın ciddi bir nedeni var mı?
kullanıcı bilinmiyor

1
@userunknown: Orijinal görev muhtemelen daha geniş bir yazı tipi kullanılarak tasarlanmıştır.
Hamar

Yanıtlar:


3

Golfscript, 75 bayt

Esinlenen yorumlarda bağlantılı makalede .

':'/{~}/5/:m;12%:h;"XXXXXXXXXXXX"{..318\%9/' '*@12%.h=2*\m=+'omhx'=@85/n*}%

XXXXXXXXXXXXParçası bazıları basılamaz veri 12 bayt temsil eder ve bayt sırası ile değiştirilmesi gerekir 120 47 253 22 194 9 183 44 196 55 125 246.

Kolaylık sağlamak için, base64 kodlu bir sürüm:

JzonL3t+fS81LzptOzEyJTpoOyJ4L/0Wwgm3LMQ3ffYiey4uMzE4XCU5LycgJypAMTIlLmg9Mipc
bT0rJ29taHgnPUA4NS9uKn0l

Örnek çalışma:

$ echo -n "JzonL3t+fS81LzptOzEyJTpoOyJ4L/0Wwgm3LMQ3ffYiey4uMzE4XCU5LycgJypAMTIlLmg9MipcbT0rJ29taHgnPUA4NS9uKn0l" | base64 -d > saving-time.gs
$ ls -l saving-time.gs 
-rw-r--r-- 1 ahammar ahammar 75 2012-01-29 17:31 saving-time.gs
$ ruby golfscript.rb saving-time.gs <<< "15:37"
        o
    o       o

 o             o

o               h

 o             o

    m       o
        o

2

Cı, 259 244 163 karakter

Komut satırı argümanı stdin ile değiştirildi (gerektiği gibi daha kısa sona erer).
59'un üzerindeki dakikalar için destek kaldırıldı - 3 karakterlik bir atık.
Kod satır sonları ve girinti ile gösterilir, ancak karakterler bunlar olmadan sayılır.

main(i,h,m,x){
    scanf("%d:%d",&h,&m);
    for(i=0;i<12;
        printf("%*c","IEHBNAPBNEHI"[i++]-64,"ohmx"[(x==h%12)+2*(x==m/5)]))
        x=i%2?puts("\n"+(i%10==1)),11-i/2:i/2;
    puts("");
}

Eski deneme (ANSI kaçış kodlarını kullanarak), 244 karakter:

f(x,y)char*y;{printf("\033[%d%c",x>0?x:-x,y[x<0]);}
main(i,h,m,x){
    char*v="HIJJJJIGFFFFPKJHFDCCDFHJ";
    f(i=f(scanf("%d:%d",&h,&m),"J")*0,v);
    for(;i<12;i++)
        (x=v[i+12]-72)&&f(x,"CD"),
        f(v[i]-72,"BA"),
        putchar("omhx"[2*(i==h%12)+(i==m%60/5)]);
    f(i,"B");
}

1

Python, 175 karakter

h,m=map(int,raw_input().split(':'))
S=([' ']*17+['\n'])*11
for i in range(12):p=1j**(i/3.);S[98+int(8.5*p.imag)-18*int(5*p.real)]='ohmx'[2*(i==m/5)+(i==h%12)]
print''.join(S),

Perl kodunuzu geçmez, ancak karmaşık sayılarla (veya trig fonksiyonlarıyla) daha özlü bir dil, bu fikri daha iyi yapmak için kullanabilir.


1

Python, 226 karakter

h,p,s=raw_input().split(':'),['o']*12,[0,11,1,10,2,9,3,8,4,7,5,6]
a,b=int(h[0])%12,int(h[1])/5
p[a],p[b]='h','m' if a!=b else 'x'
print '%9s\n%5s%8s\n\n %s%14s\n\n%s%16s\n\n %s%14s\n\n%5s%8s\n%9s'%tuple([p[i] for i in s])

Kullanım: 'python script.py' komutunu çalıştırın ve istediğiniz zamanı yazın. (Örn: 09:45)

Çıktı:

        o
    o       o

 o             o

x               o

 o             o

    o       o
        o

0

Perl çözümüm:

use POSIX;$/=':';@ss=(8,4,1,0,1,4,8);@sn=(0,7,13,15,13,7,0);$h=<stdin>;
$m=<stdin>;if($h>12){$h=$h-12;}$m=floor($m/5);
for($c=0;$c<7;$c++){for($s=0;$s<$ss[$c];$s++){printf(" ");}
$ac='o';if($h>5&&$h-6==6-$c){$ac='h';}if((($m>5)&&$m-6==6-$c)||($m==$c)&&($c==0)){
if($h>5&&$h-6==6-$c){$ac='x';}else{$ac='m';}}
print($ac);for($s=0;$s<$sn[$c];$s++){printf(" ");}$bc='o';if($h<6&&$h==$c){$bc='h';}
if($m<6&&$m==$c){if($h<6&&$h==$c){$bc='x';}else{$bc='m';}}
if($sn[$c]){print($bc);}printf("\n");if($c&&($c!=5)){printf("\n");}}

527 bayt

C çözümüm:

main(){int x[]={8,4,1,0,1,4,8},y[]={0,7,13,15,13,7,0}
,h,m,z,c,s;scanf("%d:%d",&h,&m);h>12?h-=12:h;m/=5;
for(c=0;c<7;c++){for(s=0;s<x[c];s++){printf(" ");}z='o';
if(h>5&h-6==6-c){z='h';}if((m>5&m-6==6-c)|(m==c)&!c){
z='m';if(h>5&h-6==6-c){z='x';}}printf("%c",z);
for(s=0;s<y[c];s++){printf(" ");}z='o';if(h<6&h==c){
z='h';}if(m<6&m==c){z='m';if(h<6&h==c){z='x';}}
if(y[c]){printf("%c",z);}printf("\n");if(c&&(c!=5)){printf("\n");}}}

440 bayt


1
Perl hızlı bir öneri: Eğer sadece birlikte stdin'den okuyabilir, POSIX gerek yok <>ve ben gerek sanmıyorum printf, bunu kullanmakta olduğunuz şekilde printçalışacaktır :)
Joel Berger

0

Scala 327 karakter

object C extends App{
val R=List(2,4,6,8,10)
val r=1::R:::11::R.reverse
val C=List(3,6,12,18,21)
val c=1::C:::21::C.reverse
def p(n:Int,i:Char){
val z=r(n)
val s=c((n+3)%12)
printf("[%d;%dH"+i,z,s)}
val t=readLine.split(":")
val h=t(0).toInt%12
val m=t(1).toInt/5
(0 to 11).map(x=>p(x,'o'))
p(h,'h')
p(m,'m')
if(h==m)p(h,'x')}

limon-XXXX'inizle değil, uygun bir daire şeklinde kullanılır:

clear  && echo 5:43 | scala C 
           o
     o           o

  o                 o

o                    o

  m                 o

     o           h
           o

ungolfed:

object Clock {
 val R = List (2,4,6,8,10)
 val r = 1 :: R ::: 11 :: R.reverse
 val C = List (3,6,12,18,21)
 val c = 1 :: C ::: 22 :: C.reverse

 def pos (n: Int, i: Char)={
   val z = r (n) 
   val s = c ((n+3) % 12) 
   printf ("[%d;%dH" + i, z, s)
 }

 def main (args: Array [String]) {
   val t = args (0).split (":")
   val h = t (0).toInt % 12
   val m = t (1).toInt /  5
   (0 to 11).map (x=> pos (x, 'o'))
   pos (h, 'h') 
   pos (m, 'm')
   if (h == m) pos (h, 'x')
  }
}

Poz (y, x) çıkışında Ansi-Code kullanır. Sadece 5 Dakika hassasiyete ihtiyacımız olduğundan, x ve y için önceden hesaplanan değerler, içe aktarma işlemlerinde günah ve cos işlevlerini işlemekten daha kısa gibi görünüyor.


0

Python, 176 karakter

o=map(ord,' .@Set~lWC2&!/0ABTUfgu')
h,m=map(int,raw_input().split(':'))
print''.join([' ',['\n','ohmx'[2*(i==o[m/5])+(i==o[h%12])]][i in o[:12]]][i in o]for i in range(24,127))

0

Perl 131 karakter

<>=~/:/;$h=$`%12;$m=$'/5;printf'%9s
%12$5s%8s

%11$2s%14s

%10$s%16s

%9$2s%14s

%8$5s%8s
%9s',map$_^$h?$_^$m?o:'m':$h^$m?h:x,0..11
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.