ความท้าทายของนาฬิกาทราย


43

นาฬิกาทราย

นาฬิกาทรายนี้มี 60 "แซนด์ของเวลา" และมันเต็มไปแต่ละห้อง นาฬิกากว้าง 19 ตัวอักษรและสูง 13 ตัว แต่ละห้องมีทราย 5 แถวและมีแถวตรงกลางที่สามารถถือทรายได้ 1 ผืน แถวบนสามารถถือทรายได้ 17 เม็ดอันถัดไป 15 อันและอื่น ๆ (ดูด้านล่าง) หาดทรายตกลงไปสู่ห้องล่างในอัตราหนึ่งทรายต่อวินาที

       START                     3 SECONDS LATER               38 SECONDS LATER

███████████████████            ███████████████████            ███████████████████
█.................█   17       █..............   █   14       █                 █    0
██...............██   15       ██...............██   15       ██               ██    0
███.............███   13       ███.............███   13       ███.......      ███    7  
█████.........█████   09       █████.........█████   09       █████.........█████   09 
███████.....███████   05       ███████.....███████   05       ███████.....███████   05 
█████████.█████████   01       █████████.█████████   01       █████████.█████████   01 
███████     ███████            ███████  .  ███████            ███████  .  ███████  
█████         █████            █████    .    █████            █████    .    █████   
███             ███            ███      .      ███            ███....         ███
██               ██            ██               ██            ██...............██  
█                 █            █                 █            █.................█  
███████████████████            ███████████████████            ███████████████████   

ความท้าทาย

แสดงนาฬิกาทราย (ไม่ต้องใช้ตัวเลขหรือส่วนหัว) หลังจากระยะเวลาหนึ่ง (0 ≤ t ≤ 60)

กฎการเข้ารหัส

  1. นาฬิกาทรายควรมีลักษณะเหมือนที่แสดงที่นี่ คุณสามารถแทนที่อักขระและ / หรือ.อักขระด้วยสิ่งที่คุณต้องการให้พอดีกับภาษาของคุณ (Unicode ปัญหาความเข้ากันได้ของ ASCII)
  2. อินพุตควรเป็นตัวเลขเช่น 45 หรือ 7 แสดงนาฬิกาหลังจากหลายวินาทีเหล่านี้
  3. เอาต์พุตสามารถถูกแสดงหรือบันทึกลงในไฟล์ ไม่ต้องการข้อความหรือป้ายกำกับเพิ่มเติมตามที่แสดงด้านบน - เพียงนาฬิกาทรายคือสิ่งที่เราต้องการ
  4. หากผู้ใช้ป้อน t> 60 คุณไม่ต้องจัดการกับข้อผิดพลาด

จุด

  1. รหัสที่สั้นที่สุดชนะ

ฉันไม่รู้ว่ามันเป็นแค่ฉัน แต่นาฬิกาทรายมีลักษณะแตกต่างไปจากเดิมอย่างสิ้นเชิงกว่าในโพสต์เอง นั่นอาจเป็นเพราะตัวละคร█ไม่แสดงความกว้างที่เหมาะสม
Dennis

1
เม็ดทรายสัมผัสกับเลเยอร์ปัจจุบันจากนั้นจัดแนวไปทางซ้ายหนึ่งวินาทีในภายหลัง?
xnor

2
สิ่งที่ควรเป็นผลลัพธ์สำหรับ t == 59
edc65

3
ยินดีด้วยกับการสร้างรายการคำถามเกี่ยวกับเครือข่ายแลกเปลี่ยนร้อน!
Alex A.

1
นี่ไม่ใช่คำตอบจริงๆเพราะมันไม่ตรงกับสเป็ค แต่ดูที่นี่สำหรับการส่งใน Desmos (กดปุ่มเล่นและตั้งค่าความเร็วเป็น 0.15x สำหรับ ~ 1 หน่วย / วินาที)
Conor O'Brien

คำตอบ:


27

JavaScript ( ES6 ), 203 208 233 270 256ตัวอักษร

แก้ไขแก้ไขโดยใช้การวนซ้ำแทนลำดับการโทร

แก้ไขเพิ่มแถวบนและล่างที่หายไป

ฟังก์ชันส่งคืนเอาต์พุต เรียกใช้ตัวอย่างใน Firefox เพื่อทดสอบ

f=w=>[h='█'[R='repeat'](19),...[17,15,13,9,5,1,5,9,13,15,17].map((d,i)=>(t=i>5?-v:v,v-=i<5?d:1-d,e=' '[R](d/2),b='█'[R](10-d/2),b+('.'[R](t<d&&d-t)+e+' .'[i>4&w>i-6&t>=d|0]+e).slice(0,d)+b),v=w),h].join`
`

// Less golfed
F=
w=>[h='█'.repeat(19),
    ... [17, 15, 13, 9, 5, 1, 5, 9, 13, 15, 17].map(
     (d,i) => (
       t = i>5 ? -v : v,
       v -= i<5 ? d : 1-d, 
       e = ' '.repeat(d / 2),
       b = '█'.repeat(10 - d / 2),
       b + 
        ('.'.repeat(t < d && d - t) 
         + e + ' .'[i > 4 & w > i-6 & t >= d | 0]
         + e).slice(0,d)
       + b
     ), v = w
    ),
    h].join('\n')

// TEST            

O.innerHTML=f(+I.value)

function tick(d) {
  var i=+I.value+d
  I.value=i
  O.innerHTML=f(i)
}

var int=0;

function auto()
{
  function go()
  {
    var t = I.value;
    O.innerHTML=f(++t)
    if (t>70)t=0;
    I.value = t;
  }
  if (A.checked && !int)
  { 
    int = setInterval(go, 200);
  }
  else if (!A.checked && int)
  {
    clearInterval(int);
    int = 0;
  }
}
input[type=text] { width: 3em }
<button onclick='tick(-1)'>-</button>
<input type=text id=I value=0 onchange='tick(0)' >
<button onclick='tick(1)'>+</button>
<input type=checkbox id=A onclick='auto()'>Fly time
<pre id=O><pre>


5
สำหรับความอยากรู้ของฉันทำไมถูก downvoted สองครั้งนี้ ฉันไม่พบปัญหาใด ๆ
จัดการ

คำตอบนี้ยอดเยี่ยมมาก ! เปิดใน Firefox ผู้คน!
Cristian Lupascu

1
คำตอบที่ดี แต่ดูเหมือนว่านาฬิกาบนและฐานของนาฬิกาจะหายไป
Renae Lider

@ การจัดการไม่แน่ใจ (แน่นอน) แต่มีข้อบกพร่องแน่นอน
edc65

กรุณาสร้าง setInterval () จาวาสคริปต์จะดีสำหรับที่:setTimeout( tick, 1000);
Martijn

18

Python 2, 200

t=input()+1
s=' '*t+'.'*60+' '*70
n=0
d=sum((1<t<56,2<t<48,3<t<36,4<t<22))
for c in'ctrplhdhlprtc':i=ord(c)-99;print[s[n+i:n:-1],[s[180-n-i+d:][:i],'.'][5+d*3>i>0]][n>59].center(i).center(19,'#');n+=i

XNOR ได้ทำ197รุ่นไบต์ในการสนทนา

ฉันจะโพสต์คำอธิบาย แต่ฉันไม่ทราบว่ามันใช้งานได้จริง ...

นอกจากนี้ต่อไปนี้เป็นเวอร์ชันแอนิเมชั่นพร้อมคำสาป:

นาฬิกาทราย

from curses import*
w=initscr()

for t in range(1,61):
    s=' '*t+'.'*60+' '*70
    n=0
    d=sum((1<t<56,2<t<48,3<t<36,4<t<22))
    for i in 0,17,15,13,9,5,1,5,9,13,15,17,0:w.addstr([s[n+i:n:-1],[s[180-n-i+d:][:i],'.'][5+d*3>i>0]][n>59].center(i).center(19,'#')+"\n");n+=i
    w.refresh()
    w.clear()
    napms(999)

endwin()

1
รุ่งโรจน์คุณทำให้ฉันค้นพบว่าสายมีวิธีการศูนย์ ()!
Dieter

13

Python 2.7, 362 356 347

e,c,x,a,b,n=' .#ab\n';R,r,s,l,T,m=range,str.replace,'',19,[1,2,3,5,7,9],-1
for t in[T,T[:m][::m]]:s+=''.join([n+x*y+c*(l-y*2)+x*y for y in t]);c=b
s=list(s)
for i in R(130,220,20):s[i]=a
for _ in R(input()):s[s.index('.')]=e;i=s.index(a)if a in s else 219-s[::m].index(b);s[i]='.'
for l in(x*l+r(r(''.join(s),a,e),b,e)+n+x*l).split(n):print l[::m]

นาฬิกาทราย

เอาต์พุตที่ 38 วินาที:

###################
#                 #
##               ##
###.......      ###
#####.........#####
#######.....#######
#########.#########
#######  .  #######
#####    .    #####
###...   .      ###
##...............##
#.................#
###################

2
รหัส Python ประเภทใด ฉันชอบที่จะเรียนรู้ที่จะรหัสเหมือนพวกเขา กรุณาแนะนำในทิศทางที่ถูกต้อง
Rajat Saxena

1
ฉันไม่แน่ใจว่านี่เป็นคำตอบที่ถูกต้องหรือไม่ หากคุณดูตัวอย่างที่เขาทำไว้เป็นเวลา 38 วินาทีคุณจะเห็นได้ว่าจุดต่ำสุดที่ยังคงตกลงมานั้นไม่ได้อยู่ในแนวที่จุดเรียงกัน (ในบรรทัดที่ 4 จากด้านล่างตรงกลาง)
RononDex

3
@RononDex: ตามที่อธิบายไว้ในความคิดเห็นของคำถามลำดับการบรรจุไม่เข้มงวดมาก - การใช้งานของฉันติดเม็ดทรายทางซ้ายในลักษณะที่แตกต่างจากคำถามเล็กน้อย แต่ยังใช้ได้อยู่
dieter

3

C 544

นี่คือสิ่งที่ฉันมีเพื่อแก้ปัญหา C

#include <stdio.h>
int main(int z,char **a){int r,i,y=i=0,v,d,t,m,s=atoi(a[1]),n[13]={0,43,28,15,6,1,0,1,5,13,25,39,0};char H[13][20];while(y<13){int x,b=x=i=0;v=y-6;t=3+abs(v);m=2*abs(v);d=t<m?t:m;d=9-d;if(d==0)d=10;while (b<d){H[y][b]='#';H[y][18-b]='#';b++;}while(x<19-2*b){if(x<=s-n[y])H[y][x+b]=v>0?' ':'.';else H[y][x+b]=v>0?'.':' ';x++;}if(s>58)r=0;else if(s==58)r=1;else if(s==57)r=2;else if(s==56)r=3;else if(s>38)r=4;else if(s>24)r=3;else if(s>12)r=2;else if(s>4)r=1;while(i<r){H[7+i][9]='.';i++;}H[y][19]='\n';y++;}fputs(H,stdout);}

คอมไพล์ด้วยคำสั่งต่อไปนี้:

gcc -w -o hourglass hourglass.c  // I realize I should have cast H as a char *, but since it works this way, I just decided to suppress the error from the compiler instead to save space.

เป็นที่ยอมรับภาษานี้มีจำนวนมาก - รวมถึงคำสั่งเป็นบิตของแฮนดิแคปออกมาจากบล็อก แต่จริง ๆ แล้วฉันแค่มองหาข้ออ้างที่จะฝึกใช้ซี

ฉันหวังว่าคุณจะชอบวิธีแก้ปัญหาของฉันและแจ้งให้เราทราบหากคุณเห็นวิธีการปรับปรุง


2
มีหลายวิธีในการปรับปรุงทำให้แย่ลง C แต่สั้นกว่ามาก
edc65

1
คำแนะนำ: forแทนwhere, ?:แทนif elseตัวแปร int ทั่วโลกไม่จำเป็นต้องint, includeไม่จำเป็นต้อง (ฉันชอบคณิตศาสตร์ของคุณ)
edc65

1
317: r,i,y,x,b,d,n[]={0,43,28,15,6,1,0,1,5,13,25,39,0};char H[14][20];main(s,a)char**a;{for(s=atoi(a[1]);y<13;){b=x=i=0;d=abs(y-6);d+=3<d?3:d;d=9-d?9-d:10;r=s>55?59-s:s>38?4:s>24?3:s>12?2:s>4?1:r;for(;b<19;)H[y][b++]=35;for(;x<19-2*d;x++)H[y][x+d]=(x>s-n[y]?" .":". ")[y>6];for(;i<r;)H[7+i++][9]=46;H[y++][b]=10;}puts(H);}(ระวัง, ตัวอักษรที่มองไม่เห็นแปลก ๆ ถูกเพิ่มเข้าไปใน
คอมเม้นท์แบบ

3

Matlab, 252 ไบต์

แนวคิดกำลังสร้างเมทริกซ์ที่มีลักษณะดังนี้:

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
0  17  16  15  14  13  12  11  10   9   8   7   6   5   4   3   2   1   0
0   0  32  31  30  29  28  27  26  25  24  23  22  21  20  19  18   0   0
0   0   0  45  44  43  42  41  40  39  38  37  36  35  34  33   0   0   0
0   0   0   0   0  54  53  52  51  50  49  48  47  46   0   0   0   0   0
0   0   0   0   0   0   0  59  58  57  56  55   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0  60   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0 116 117  61 118 119   0   0   0   0   0   0   0
0   0   0   0   0 108 109 110 111  62 112 113 114 115   0   0   0   0   0
0   0   0  96  97  98  99 100 101  63 102 103 104 105 106 107   0   0   0
0   0  82  83  84  85  86  87  88  64  89  90  91  92  93  94  95   0   0
0  66  67  68  69  70  71  72  73  65  74  75  76  77  78  79  80  81   0
0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

จากตรงนั้นง่ายต่อการกรอกข้อมูลด้วยสตริงที่ขึ้นอยู่กับn(กรอกข้อมูลทั้งหมดที่มากกว่าnและเล็กกว่าn+60ด้วยจุด)

function c=f(n);
b=zeros(13,19);
z=[0,17,32,45,54,59];
y=-2:3;
for k=2:6;
    d=k+sum(k>4:5);
    b(k,d:20-d)=z(k):-1:z(k-1)+1;
    b(14-k,d:19-d)=68+(z(k-1):z(k)-2)-k;
end;
b(8:12,11:19)=b(8:12,10:18);
b(7:12,10)=60:65;c=[ones(13,19)*32,''];
c(~b)='¶';c(n<b)=46;c(b>n+60)=32

เพราะn=38เราได้ผลลัพธ์นี้:

¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶
¶                 ¶
¶¶               ¶¶
¶¶¶.......      ¶¶¶
¶¶¶¶¶.........¶¶¶¶¶
¶¶¶¶¶¶¶.....¶¶¶¶¶¶¶
¶¶¶¶¶¶¶¶¶.¶¶¶¶¶¶¶¶¶
¶¶¶¶¶¶¶  .  ¶¶¶¶¶¶¶
¶¶¶¶¶    .    ¶¶¶¶¶
¶¶¶...   .      ¶¶¶
¶¶...............¶¶
¶.................¶
¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶

2

Java, 712

อินพุตถูกนำมาจากบรรทัดคำสั่ง จัดการกับค่าลบทั้งสองครั้งและใหญ่กว่าที่ต้องการ

enum H{;public static void main(String[]r){int x=0,y=0,z=0,l,t=Integer.parseInt(r[0]);String b="",d="█",e=" ",f=".",n="\n",j,k,a="███████████████████"+n;int[]w={17,15,13,9,5},v;int[][]h=new int[10][];for(;x<5;){l=w[x];v=(h[x++]=new int[l--]);l/=2;v[l]=++z;for(y=0;y++<l;){v[l-y]=++z;v[l+y]=++z;}}for(z=0;x>0;){l=w[--x];v=(h[9-x]=new int[l--]);v[l/2]=++z;}for(;x<5;){l=(w[x]-1)/2;v=h[9-x++];for(y=0;y++<l;){v[l-y]=++z;v[l+y]=++z;}}p(a);for(x=0;x<5;x++){l=w[x];j=b;for(y=0;y++*2<19-l;)j+=d;k=b;for(y=0;y<l;)k+=t<h[x][y++]?f:e;p(j+k+j+n);}j="█████████";p(j+f+j+n);for(;x>0;){l=w[--x];j=b;for(y=0;y++*2<19-l;)j+=d;k=b;for(y=0;y<l;)k+=t<h[9-x][y++]?e:f;p(j+k+j+n);}p(a);}static void p(String s){System.out.print(s);}}

เอาท์พุท:

time: 0
███████████████████
█.................█
██...............██
███.............███
█████.........█████
███████.....███████
█████████.█████████
███████     ███████
█████         █████
███             ███
██               ██
█                 █
███████████████████

time: 1
███████████████████
█........ ........█
██...............██
███.............███
█████.........█████
███████.....███████
█████████.█████████
███████  .  ███████
█████         █████
███             ███
██               ██
█                 █
███████████████████

time: 9
███████████████████
█....         ....█
██...............██
███.............███
█████.........█████
███████.....███████
█████████.█████████
███████  .  ███████
█████    .    █████
███      .      ███
██       .       ██
█      .....      █
███████████████████

time: 41
███████████████████
█                 █
██               ██
███..         ..███
█████.........█████
███████.....███████
█████████.█████████
███████  .  ███████
█████    .    █████
███   .......   ███
██...............██
█.................█
███████████████████

มันเติมทรายจากจุดศูนย์กลางออกไปด้านนอก ฉันสามารถเล่นกอล์ฟได้มากขึ้นถ้าฉันขี้เกียจว่ามันเติมครึ่งล่างและเทครึ่งบนทิ้ง แต่ตอนนี้ฉันค่อนข้างชอบ


2

Haskell 512 ไบต์

h=[17,15,13,9,5,1];b=drop 1$reverse h;n#s=[1..n]>>[s];s='.';n =' ';c q=(q#n)++(60-q)#s;f q|q<=5=q#s|3>2=g#s where{g=foldl i 5 (scanl (+) 0 h);i x y=if q>x+y then x-1 else x};e q=j#s++(59-length(k q)-(j))#n where{j=q-length(f q)};l q=c q++k q++(reverse$e q);p _ []=[];p x y=reverse(z++take q x++z):p (drop (head y) x) (tail y)where{q=head y;z=replicate(div (19-q) 2) '|'};k q= (concat.map(\x -> z x ++ "." ++ z x).take (length.f$q)$b)where{z x=(div x 2)#n};m n=mapM_ putStrLn $ t ++ p (l n) (h++b) ++ t;t=[19#'|'] 

อินพุต m 55

เอาท์พุต

|||||||||||||||||||
|                 |
||               ||
|||             |||
|||||         |||||
|||||||.... |||||||
|||||||||.|||||||||
|||||||  .  |||||||
|||||.........|||||
|||.............|||
||...............||
|.................|
|||||||||||||||||||

อินพุตm 48 เอาต์พุต

    |||||||||||||||||||
    |                 |
    ||               ||
    |||             |||
    |||||......   |||||
    |||||||.....|||||||
    |||||||||.|||||||||
    |||||||  .  |||||||
    |||||..       |||||
    |||.............|||
    ||...............||
    |.................|
    |||||||||||||||||||

1
ยินดีต้อนรับสู่ PPCG! ฉันเห็นว่าคุณเล่นกอล์ฟมาแล้วเล็กน้อย แต่ยังมีพื้นที่สีขาวที่ไม่จำเป็นเหลืออยู่เช่น ++ที่ล้อมรอบ นอกจากนี้คุณอาจจะช่วยไบต์บางอย่างโดย predefining และlength reverse
Laikoni

1

C #, 382 410

มันอาจจะเป็นไปได้ที่จะลดลงเพียงไม่กี่ไบต์ ...

class Program{static void Main(){int u=60-22,d=u,i,j,k,l,m;var c=new char[260];var r=new int[]{0,17,15,13,9,5,1,5,9,13,15,17,0,54,45,32,17,0};for(i=0;i<13;){m=0;l=(19-r[i])/2-1;for(j=19;j>=0;){k=i*20+j--;var b=j>=l&&j<r[i]+l;if(i>6&b)c[k-r[i]+m++ +m]=r[i+6]<d&&d-->0||j==8&r[i+6]>d&&d-->0?'.':' ';else c[k]=i<7&b?u-->1?' ':'.':'█';}c[++i*20-1]='\n';}System.Console.WriteLine(c);}}

พู้ทำเล่น - 38sec


เย็น! มันจะนำเข้าอย่างไร
isaacg

@isaacg, โอ๊ะฉันจะแก้ไขในภายหลังว่าวันนี้ฉันรู้ว่ามันสั้นเกินไปสำหรับการแก้ปัญหา # ac :-) สำหรับตอนนี้เปลี่ยน U = 60-22 เพื่ออะไร
Fredou

ทำไมคุณใช้int u=60-22และไม่ใช่แค่int u=38?
dev-masih

1

ทับทิม: 196 190 186 185 184 ตัวอักษร

u=[0,17,15,13,9,5].map{|i|(?.*i).center 19,?#}*$/
(?1..$*[0]).map{u[?.]=' '}
l=u.reverse
5.times{|i|l[p=i*20+9]==?.&&l[' ']&&(l[p]=?|)&&l[' ']=?.}
puts u,?#*9+?.+?#*9,l.tr('. | ',' .')

CW เพราะไม่สอดคล้องกับตัวอย่างที่โพสต์เนื่องจากการใช้ทรายเริ่มต้นจากด้านซ้าย ส่วนใหญ่เป็นเพียงการสาธิตString.[]=วิธีการ

วิ่งตัวอย่าง:

bash-4.3$ ruby hg.rb 38
###################
#                 #
##               ##
###      .......###
#####.........#####
#######.....#######
#########.#########
#######  .  #######
#####    .    #####
###      .   ...###
##...............##
#.................#
###################

Ruby: 215 ตัวอักษร

นี่คือการสร้างผลลัพธ์ที่ต้องการแน่นอน:

u=[0,17,15,13,9,5].map{|i|(?.*i).center 19,?#}*$/
(?1..$*[0]).map{u[?.]=' '}
l=u.reverse
5.times{|i|l[p=i*20+9]==?.&&l[' ']&&(l[p]=?|)&&l[' ']=?.}
puts ([u,?#*9+?.+?#*9,l.tr('. | ',' .')]*$/).split($/).map &:reverse

วิ่งตัวอย่าง:

bash-4.3$ ruby hg.rb 38
###################
#                 #
##               ##
###.......      ###
#####.........#####
#######.....#######
#########.#########
#######  .  #######
#####    .    #####
###...   .      ###
##...............##
#.................#
###################
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.