Thử thách đồng hồ cát


43

Đồng hồ cát

Đồng hồ cát này có 60 "cát thời gian", và nó hoàn toàn lấp đầy từng buồng. Đồng hồ rộng 19 ký tự và cao 13 ký tự. Mỗi buồng có 5 hàng cát và có một hàng ở trung tâm có thể chứa 1 cát. Hàng trên cùng có thể chứa 17 cát, 15 hàng tiếp theo và cứ thế (xem bên dưới). Cát rơi vào khoang dưới cùng với tốc độ một cát mỗi giây.

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

Các thách thức

Hiển thị đồng hồ cát (không yêu cầu số hoặc tiêu đề) sau một khoảng thời gian nhất định (0 ≤ t 60).

Quy tắc mã hóa

  1. Đồng hồ cát nên nhìn chính xác như được hiển thị ở đây. Bạn có thể thay thế ký tự và / hoặc .ký tự bằng bất cứ thứ gì bạn muốn để phù hợp với ngôn ngữ của bạn (các vấn đề tương thích Unicode, ASCII).
  2. Đầu vào phải là một số như 45 hoặc 7. Hiển thị đồng hồ sau nhiều giây này.
  3. Đầu ra có thể được hiển thị hoặc lưu vào một tập tin. Không có văn bản hoặc nhãn phụ như được hiển thị ở trên là bắt buộc - chỉ cần đồng hồ cát là tất cả những gì chúng ta cần.
  4. Nếu người dùng nhập t> 60, bạn không phải xử lý lỗi.

Điểm

  1. Mã ngắn nhất sẽ thắng.

Tôi không biết nếu đó chỉ là tôi, nhưng đồng hồ bấm giờ trông hoàn toàn khác trong trình chỉnh sửa so với trong bài đăng. Điều đó có thể là do ký tự doesn't không được hiển thị với độ rộng phù hợp.
Dennis

1
Liệu một hạt cát chạm vào lớp hiện tại, sau đó căn chỉnh sang trái một giây sau?
xnor

2
Điều gì sẽ là đầu ra cho t == 59?
edc65

3
Chúc mừng bạn đã tạo được danh sách Câu hỏi về Mạng nóng của Stack Exchange!
Alex A.

1
Đây không thực sự là một câu trả lời, vì nó không phù hợp với thông số kỹ thuật, nhưng hãy xem ở đây để gửi bài trong Desmos. (Nhấn nút phát và đặt tốc độ thành 0,15x cho ~ 1 đơn vị / giây)
Conor O'Brien

Câu trả lời:


27

JavaScript ( ES6 ), 203 208 233 270 256 ký tự

Chỉnh sửa Sửa đổi bằng cách sử dụng một vòng lặp thay vì một chuỗi các cuộc gọi.

Chỉnh sửa Đã thêm hàng trên cùng và dưới cùng bị thiếu.

Một hàm trả về đầu ra. Chạy đoạn trích trong Firefox để kiểm tra.

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
Vì sự tò mò của tôi, tại sao điều này lại bị hạ thấp hai lần? Tôi có thể tìm thấy không có vấn đề với nó.
manatwork

Câu trả lời này thật tuyệt vời ! Mở nó trong Firefox, mọi người!
Cristian Lupascu

1
Câu trả lời tốt, nhưng đầu và cơ sở của đồng hồ cát dường như bị thiếu.
Renae Lider

@manatwork không chắc chắn (tất nhiên) nhưng thực sự có một lỗ hổng
edc65

Vui lòng tạo một setInterval (), javascript sẽ rất tuyệt cho điều đó:setTimeout( tick, 1000);
Martijn

18

Con trăn 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 đã tạo một phiên bản 197 byte trong trò chuyện .

Tôi sẽ đăng một lời giải thích, nhưng tôi đã quên mất cách nó thực sự hoạt động ...

Ngoài ra, đây là một phiên bản hoạt hình với những lời nguyền:

đồng hồ cát

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
kudos, Bạn làm cho tôi phát hiện ra rằng các chuỗi có một phương thức centre ()!
ăn kiêng

13

Con trăn 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]

đồng hồ cát

Đầu ra ở 38 giây:

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

2
Đó là loại mã Python nào? Tôi rất thích học cách viết mã như họ. Hãy hướng dẫn đúng hướng.
Rajat Saxena

1
Tôi không chắc đây có phải là một câu trả lời hợp lệ không. Nếu bạn nhìn vào ví dụ anh ấy thực hiện trong 38 giây, bạn có thể thấy rằng chấm thấp nhất vẫn đang rơi không nằm trong dòng mà các chấm thẳng hàng. (ở dòng thứ 4 từ dưới lên, ở giữa)
RononDex

3
@RononDex: Như đã giải thích trong các bình luận của câu hỏi, thứ tự làm đầy không quá nghiêm ngặt - việc thực hiện của tôi dán các hạt cát sang trái theo cách hơi khác so với câu hỏi, nhưng vẫn hợp lệ
ăn kiêng

3

C 544

Đây là những gì tôi có cho đến nay cho một giải pháp 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);}

Được biên dịch bằng lệnh sau:

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.

Phải thừa nhận rằng, ngôn ngữ này có rất nhiều - bao gồm câu lệnh là một chút bất lợi sắp ra khỏi khối, nhưng tôi thực sự chỉ tìm kiếm một cái cớ để thực hành sử dụng C.

Tôi hy vọng bạn thích giải pháp của tôi, và cho tôi biết nếu bạn thấy cách cải thiện.


2
Có rất nhiều cách để cải thiện, làm cho C tồi tệ hơn nhưng ngắn hơn rất nhiều.
edc65

1
Gợi ý: forthay vì where, ?:thay vì if else, các biến int toàn cầu không cần int, includekhông cần. (Tôi thích môn toán của bạn)
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);}(hãy cẩn thận, những ký tự vô hình kỳ lạ được thêm vào những bình luận dài như thế này)
edc65

3

Matlab, 252 byte

Ý tưởng đang xây dựng một ma trận trông như thế này:

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

Từ đó, dễ dàng điền vào các mục với chuỗi phụ thuộc vào n(điền tất cả các mục lớn hơn nvà nhỏ hơn n+60bằng dấu chấm)

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

Đối với n=38chúng tôi nhận được đầu ra này:

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

2

Java, 712

Đầu vào được lấy từ dòng lệnh. Xử lý cả các giá trị âm cho thời gian cũng như lớn hơn yêu cầu.

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

đầu ra:

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

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

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

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

Nó lấp đầy cát từ trung tâm mở rộng ra bên ngoài. Tôi có thể chơi golf nhiều hơn nếu tôi lười biếng với cách nó lấp đầy nửa dưới và làm trống nửa trên. Nhưng bây giờ tôi khá thích nó.


2

Haskell 512 byte

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#'|'] 

Đầu vào m 55

Đầu ra

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

Đầu m 48 ra đầu vào

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

1
Chào mừng đến với PPCG! Tôi thấy bạn đã chơi golf này khá nhiều, nhưng vẫn còn rất nhiều khoảng trắng không cần thiết, vd. xung quanh ++. Ngoài ra, bạn có thể lưu một số byte bằng cách xác định trước lengthreverse.
Laikoni

1

C #, 382 410

vẫn có thể giảm được vài byte ...

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

Fiddler - 38 giây


Mát mẻ! Làm thế nào để nó đầu vào?
isaacg

@isaacg, rất tiếc, tôi sẽ sửa nó vào ngày hôm nay, tôi biết rằng nó quá ngắn cho giải pháp ac # :-) bây giờ thay đổi u = 60-22 thành một cái gì đó khác
Fredou

Tại sao bạn sử dụng int u=60-22và không chỉ int u=38??
dev-masih

1

Ruby: 196 190 186 185 184 ký tự

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 vì không phù hợp chính xác với các mẫu được đăng vì điều này tiêu thụ cát bắt đầu từ bên trái. Chủ yếu chỉ là một minh chứng của String.[]=phương pháp.

Chạy mẫu:

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

Ruby: 215 ký tự

Điều này tạo ra đầu ra chính xác yêu cầu:

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

Chạy mẫu:

bash-4.3$ ruby hg.rb 38
###################
#                 #
##               ##
###.......      ###
#####.........#####
#######.....#######
#########.#########
#######  .  #######
#####    .    #####
###...   .      ###
##...............##
#.................#
###################
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.