모래 시계 도전


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. 모래 시계는 여기에 표시된 것과 정확히 같아야합니다. 문자 및 / 또는 .문자를 사용자의 언어에 맞는 것으로 바꿀 수 있습니다 (유니 코드, ASCII 호환성 문제).
  2. 입력은 45 또는 7과 같은 숫자 여야합니다. 몇 초 후에 시계를 표시하십시오.
  3. 출력은 파일로 표시되거나 저장 될 수 있습니다. 위에 표시된 것처럼 추가 텍스트 나 레이블이 필요하지 않습니다. 모래 시계 만 있으면됩니다.
  4. 사용자가 t> 60을 입력하면 오류를 처리 할 필요가 없습니다.

포인트들

  1. 가장 짧은 코드가 승리합니다.

나는 그것이 단지 나인지 모르겠지만 모래 시계는 게시물 자체와 편집기에서 완전히 다르게 보입니다. 아마도 █ 문자가 적절한 너비로 표시되지 않기 때문일 수 있습니다.
Dennis

1
모래 알갱이가 현재 레이어에 닿은 다음 1 초 후에 왼쪽에 정렬됩니까?
xnor

2
t == 59의 출력은 무엇입니까?
edc65

3
Stack Exchange 핫 네트워크 질문 목록을 작성하신 것을 축하합니다!
Alex A.

1
이것은 사양에 맞지 않기 때문에 실제로 대답은 아니지만 Desmos의 제출물을 여기 에서 살펴보십시오 . (재생 버튼을 누르고 ~ 1 단위 / 초 동안 속도를 0.15x로 설정)
Conor O'Brien

답변:


27

자바 스크립트 ( 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
나의 호기심을 위해 왜 이것이 두 번 하향 조정 되었습니까? 나는 그것에 문제가 없습니다.
manatwork

이 답변은 굉장합니다 ! Firefox에서 열어보세요!
Cristian Lupascu

1
좋은 대답이지만 모래 시계의 상단과 하단이 누락 된 것 같습니다.
Renae Lider

@manatwork (물론) 확실하지 않지만 실제로 결함이 있었다
edc65

setInterval ()을 만드십시오. 자바 스크립트는 다음과 같은 setTimeout( tick, 1000);
이점

18

파이썬 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
kudos, 문자열에 center () 메소드가 있음을 알게되었습니다!
Dieter

13

파이썬 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
어떤 종류의 파이썬 코드입니까? 나는 그들과 같은 코드를 배우고 싶습니다. 올바른 방향으로 안내하십시오.
Rajat Saxena 2016 년

1
이것이 올바른 답변인지 확실하지 않습니다. 그가 38 초 동안 만든 예제를 보면, 여전히 떨어지는 가장 낮은 점이 점들이 정렬되는 선에 있지 않다는 것을 알 수 있습니다. (중앙에서 아래에서 4 번째 줄)
RononDex

3
@RononDex :으로 질문의 의견에 설명, 충전 순서는 그렇게 엄격하지 않다 - 내 구현이 질문 약간 다른 방식으로 떠났지만 여전히 유효에 모래알 스틱
다이어트

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.

분명히,이 언어는 대량의 문장을 포함하고 있습니다.이 문장은 블록에서 나오는 약간의 핸디캡이지만 C를 사용하여 연습 할 변명을 찾고있었습니다.

내 솔루션이 마음에 들기를 바랍니다. 개선 방법이 있는지 알려주세요.


2
개선 할 수있는 방법이 많이 있으므로 C를 악화 시키지만 훨씬 짧게 만듭니다.
edc65

1
힌트 : for대신 where, ?:대신 if else, 글로벌 INT 변수가 필요하지 않은 int, include필요하지 않습니다. (나는 당신의 수학을 좋아합니다)
edc65 2016 년

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);}(이상한 보이지 않는 문자가 이와 같이 긴 주석에 추가됨)
edc65

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

자바, 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

하스켈 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에 오신 것을 환영합니다! 나는 당신이 이미 이것을 약간 골프화 시켰지만, 예를 들어 여전히 불필요한 공백이 많이 남아 있습니다. 주변 ++. 또한 사전 정의 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 2016 년

@isaacg, 죄송합니다, 오늘 나중에 고칠 것입니다, 나는 그것이 AC # 솔루션에 비해 너무 짧다는 것을 알았습니다 :-) 지금 u = 60-22를 다른 것으로
바꾸십시오

왜 당신이 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
###################
#                 #
##               ##
###      .......###
#####.........#####
#######.....#######
#########.#########
#######  .  #######
#####    .    #####
###      .   ...###
##...............##
#.................#
###################

루비 : 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.