나무 반지 나이 표시


24

소개

어제 나는 생일 퍼즐을 보았다 . 축하합니다 !!

또한 이번 주 에는 죽은 나무가 나무 밑에 묻힌 TV 쇼 본즈 에피소드를 보았습니다 . 사망 시간을 계산하기 위해 나무 고리를 세었습니다.

나무는 겨울에는 나무가 느리게, 여름에는 더 빨리 자라기 때문에 형성됩니다. 따라서 고리를 세어 나무의 나이를 계산할 수 있습니다. 또한 우기 또는 건기 같은 자연 현상을 볼 수 있습니다.

여기에 이미지 설명을 입력하십시오

도전

n >= 1입력 으로 정수가 주어지면 트리 에이지 링을 출력하는 전체 프로그램을 작성하십시오.

고리 모양이 변할 수 있기 때문에 기후 사이클을 표시하기 위해 세 가지 다른 문자 ( '0', '*', '+')를 사용합니다.

나이 1

0

2 세

***
*0*
***

3 세

+++++
+***+
+*0*+
+***+
+++++

4 세

0000000
0+++++0
0+***+0
0+*0*+0
0+***+0
0+++++0
0000000

나무의 크기는 변의 정사각형입니다 2*n - 1

승리

바이트 단위의 최단 코드가 이깁니다.


나이 = 5 인 경우는 어떻습니까?
Blue

3
링에는 3 단계 사이클이 있습니다. ('0', '*', '+')5 년은*
Juan Carlos Oropeza

@vihan은 질문을 이해하지 못합니다.
Juan Carlos Oropeza

@vihan 죄송하지만 여전히 2로 나누면 문제가 어떻게 해결되는지 이해하지 못합니다. 당신이 그것을 해결하기 위해 해킹이 있다면, 나는 아마 그것에 대해 알고 해달라고
후안 카를로스 Oropeza에게

크기는 면적, 둘레 또는 길이입니까?
Beta Decay

답변:


6

K5, 27 30 26 25 22 바이트

"0"{4(|+y,)/x}/"0*+"3!1_!

이 접근 방식은 "0"다른 문자 ( {4(|+y,)/x})를 사용하여 4면 모두 에서 코어를 반복적으로 "포장"합니다 . 계절 포장의 순서는 모듈로 3 ( 3!) 순서에 의해 결정됩니다 . 기본 사례를 올바르게 정렬하는 것이 약간 어리 석습니다.

편집하다:

"0*+"3!u|\:u:t,1_|t:|!

이 대안은 제공된 배타적 범위 ( !)에서 항목 전체를 떨어 뜨린 후 자신과 결합 된 독점 범위 ( ) 에서 한 번에 전체 직사각형 배열을 만듭니다 t,1_|t:|. 그런 다음 직교 곱 최대 값 ( u|\:u:)을 취하고 전체 행렬 모듈로 3 ( 3!)을 가져와 문자 배열로 색인합니다.

실제로 :

  "0*+"3!u|\:u:t,1_|t:|!1
,,"0"

  "0*+"3!u|\:u:t,1_|t:|!3
("+++++"
 "+***+"
 "+*0*+"
 "+***+"
 "+++++")

  "0*+"3!u|\:u:t,1_|t:|!5
("*********"
 "*0000000*"
 "*0+++++0*"
 "*0+***+0*"
 "*0+*0*+0*"
 "*0+***+0*"
 "*0+++++0*"
 "*0000000*"
 "*********")

나는 K를 모르지만 이것은 단순한 기능이 아니라 완전한 프로그램입니까?
Alex A.

그것은 완전한 프로그램이자 기능입니다. 이것은 "묵음 정의"라고하는 것의 예입니다. 어쨌든 구별은 매우 임의적입니다.
JohnE

11

BBC 기본, 93 바이트

1I.r:r=r-1:F.i=-r TOr:F.j=-r TOr:p=ABS(i):q=ABS(j):IFp<q TH.p=q
2V.48-(p MOD3)*6MOD7:N.:P.:N.

축약 된 키워드는 여기서 많은 도움이됩니다. 2 행에서 각 문자를 인쇄 하는 VDU명령 (C 's와 동일 putchar())을 사용하고 있습니다. 이것은보다 훨씬 효율적 P.MID$("0*+",p MOD3+1,1)입니다.

여기 Mac의 BeebEm3에서 실행됩니다.

여기에 이미지 설명을 입력하십시오


그 gif를 어떻게 만드나요?
Juan Carlos Oropeza

9
@JuanCarlosOropeza 매우 효율적이지 않습니다. QuickTime Player를 사용하여 화면을 캡처하고, QuickTime Player 7을 사용하여 비디오를 PNG 이미지로 내보내고, GraphicConverter를 사용하여 GIF로, ezgif.com 을 사용하여 결과를 최적화했습니다.
squeamish ossifrage

7

CJam, 25 바이트

q~,_1>W%\+_ff{e>"0*+"=}N*

여기에서 테스트하십시오.

설명

q~,       e# Read input N, turn into range [0 1 ... N-1]
_1>       e# Duplicate and cut off the zero.
W%        e# Reverse.
\+        e# Prepend to original range to give [N-1 ... 1 0 1 ... N-1]
_         e# Duplicate
ff{       e# Nested map for each pair of elements in that array.
  e>      e# Take the maximum, i.e. chessboard distance from the centre.
  "0*+"=  e# Select the right character using cyclic indexing into this string.
}
N*        e# Join the lines with line feeds.

5

Matlab, 63 바이트

n=input('')-1;x='0*+';t=abs(-n:n);x(mod(bsxfun(@max,t,t'),3)+1)

예:

>> n=input('')-1;x='0*+';t=abs(-n:n);x(mod(bsxfun(@max,t,t'),3)+1)
5
ans =
*********
*0000000*
*0+++++0*
*0+***+0*
*0+*0*+0*
*0+***+0*
*0+++++0*
*0000000*
*********

5

파이썬 2, 83 바이트

I=n=input()
while I+n-1:I-=1;i=abs(I);w=("O*+"*n)[i:n];print w[::-1]+w[0]*2*i+w[1:]

한 줄씩 인쇄합니다. 각 줄은 세 부분으로 잘립니다.

  • 첫 번째 반복 문자를 포함하여 왼쪽 순환 부분.
  • 반복 중심 부분
  • 올바른 자전거 부분.

의 경우 n=4:

0    000000    
0+    ++++    0
0+*    **    +0
0+*0        *+0
0+*    **    +0
0+    ++++    0
0    000000    

왼쪽 부분을로 w바꾸고 마지막 문자 2*i시간을 복제 한 다음 첫 번째 문자없이 원래 버전을 추가합니다.


5

파이썬 2, 83 바이트

n=input()
R=range(1-n,n)
for i in R:print''.join('0*+'[max(i,-i,j,-j)%3]for j in R)

우리가 좌표 격자로 나무를 생각하면 기호에 (i,j)의해 결정된다 max(abs(i),abs(j))%3, 또는 동등 max(i,-i,j,-j)%3. 각 행마다 i해당 행의 기호를 결합하고 인쇄합니다.


range 문을 세 번째 줄에 똑바로 두어이를 줄일 수 있습니다.
Ethan Brouwer

@EthanBrouwer R두 번 사용 하고 있으며 5 자를 초과하므로 할당이 잘됩니다.
xnor

감동! 나는 첫 번째 것을 보았다. 내 잘못이야. :)
Ethan Brouwer 2

5

Pyth, 23 바이트

VK+_StQUQsm@"0*+"eS,dNK

온라인으로 사용해보십시오 : 데모

설명:

VK+_StQUQsm@"0*+"eS,dNK   implicit: Q = input number
    StQ                   the list [1, 2, ..., Q-1]
   _                      reverse it [Q-1, ..., 2, 1]
       UQ                 the list [0, 1, ..., Q-1]
  +                       combine them [Q-1, ..., 1, 0, 1, ..., Q-1]
 K                        and store in K
VK                        for each N in K:
          m           K      map each element d in K to:
                 eS,dN          the maximum of d and N
           @"0*+"               and pick the corresponded char (modulo 3)
         s                   join the chars to a string and print

3

MATLAB, 80 78 73 바이트

5 바이트를 면도하는 데 도움을 준 Luis Mendo에게 감사합니다!

A=eye(2*input('')-1);a='0*+';a(mod(bwdist(A.*rot90(A),'chessboard'),3)+1)

>> A=eye(2*input('')-1);a='0*+';a(mod(bwdist(A.*rot90(A),'chessboard'),3)+1)

5

ans =

*********
*0000000*
*0+++++0*
*0+***+0*
*0+*0*+0*
*0+***+0*
*0+++++0*
*0000000*
*********

언 골프 및 코드 설명

%// Accepts an integer n from the user and creates a 2*n - 1 x 2*n - 1 identity matrix
A=eye(2*input('')-1);

%// Creates an array of three characters to print each level of the ring
a='0*+';

%// By taking the identity matrix and element-wise multiplying with its 90 degree rotated 
%// version of itself, this creates a zero matrix except for the centre most
%// value, which is 1
%// This takes the distance transform via the chessboard / Chebyshev distance
%// from the centre element
%// This mirrors what "level" each square would be at
%// 1: https://en.wikipedia.org/wiki/Distance_transform
%// 2: https://en.wikipedia.org/wiki/Chebyshev_distance
b = bwdist(A.*rot90(A),'chessboard');

%// Because each level cycles through each of the characters in the
%// character array a, we need to perform a mod operation so that
%// all of the values cycle from 1 to 3
%// This changes the distance transform output so that we range
%// from 1 to 3 instead
c = mod(b,3) + 1;

%// The values in the matrix c correspond exactly to the locations
%// we need to sample from the array a and we display our result
a(c)

미성년자

bwdist이미지 처리 도구 상자의 일부인 함수이며 MATLAB에서만 실행할 수 있습니다. Octave (IIRC)는 bwdist아직 구현되지 않았으므로 Octave에서 실행할 수 없습니다.


몇 바이트를 절약 할 수 있습니다 . "seed"매트릭스를 생성하기 eye위해 rot90'ed'버전을 사용 하여 요소별로 곱 하십시오.I=eye(2*input('')-1);a='0*+';a(mod(bwdist(I.*rot90(I),'chessboard'),3)+1)
Luis Mendo

오 쿨! 감사합니다 @LuisMendo
rayryeng-Reinstate Monica

2

파이썬 2, 134 바이트

def l(x,c=1):
 p="\n\x1b[%d"%c;d=p+";%dH"%c
 if x:s=x*2-1;d+=(p+"G").join(["0*+"[(x+1)%3]*s]*s)+l(x-1,c+1)
 return d
print l(input())

2

펄, 118 바이트

더 많은 것을 할 것이지만 지금은 기본 버전입니다. 이제 맛있는 추가 사양 준수.

for$i(0..($-=<>-1)){substr$a[$_],$i,$}=2*($--$i)+1,(0,'*','+')[($--$i)%3]x$}for$i..$-}$,=$/;print@a,reverse@a[0..$--1]

용법:

perl -e 'for$i(0..($-=<>-1)){substr$a[$_],$i,$}=2*($--$i)+1,(0,'*','+')[($--$i)%3]x$}for$i..$-}$,=$/;print@a,reverse@a[0..$--1]' <<< 9
+++++++++++++++++
+***************+
+*0000000000000*+
+*0+++++++++++0*+
+*0+*********+0*+
+*0+*0000000*+0*+
+*0+*0+++++0*+0*+
+*0+*0+***+0*+0*+
+*0+*0+*0*+0*+0*+
+*0+*0+***+0*+0*+
+*0+*0+++++0*+0*+
+*0+*0000000*+0*+
+*0+*********+0*+
+*0+++++++++++0*+
+*0000000000000*+
+***************+
+++++++++++++++++

1

MATLAB 92

input('')-1;x=ones(2*n+1,1)*abs(-n:n);z=mod(max(x,x'),3);z(z>1)=2;z(z<1)=7;disp([z+41,''])

1

Sed, 277,252

(251 문자 코드 + 1 문자 명령 행 옵션)

단항 형식의 입력이 필요 합니다.

:m
s/1/0/
s/1/*/
s/1/+/
tm
h
s/^/:/
:r
s/(.*):(.)/\2\1:/
tr
s/://
G
s/\n.//
h
:
/^(.)\1*$/ba
s/(.)(.)(\2*)\1/\1:\2\3:\1/
:c
s/(:_*)[^_](.*:)/\1_\2/
tc
:u
s/(.)(:\1*)_/\1\2\1/
tu
s/://g
H
b
:a
g
s/[^\n]+/:/
:f
s/(.*):(\n[^\n]+)/\2\1:/
tf
s/://
G
s/\n//

샘플 실행 :

bash-4.3$ sed -rf treering.sed <<< 1
0

bash-4.3$ sed -rf treering.sed <<< 11
***
*0*
***

bash-4.3$ sed -rf treering.sed <<< 111
+++++
+***+
+*0*+
+***+
+++++

bash-4.3$ sed -rf treering.sed <<< 1111
0000000
0+++++0
0+***+0
0+*0*+0
0+***+0
0+++++0
0000000

0

자바 스크립트 (ES6), 114

출력에 경고를 사용하면 비례 글꼴이 잘못되어 결과가 추악합니다. 아래 스 니펫에서 경고는 스니핑 된 바디로 리디렉션되어 더 나은 결과를 제공합니다. 백틱 내부의 줄 바꿈은 중요하며 계산됩니다.

Firefox에서 스 니펫 실행을 테스트하십시오.

/* Redefine alert for testing purpose */ alert=x=>O.innerHTML=x;

[...'*+0'.repeat(n=prompt()-1)].map((c,i)=>i<n?b=[z=c.repeat(i-~i),...b,z].map(r=>c+r+c):0,b=[0]);alert(b.join`
`)
<pre id=O></pre>


코드 스 니펫을 실행하려고하지만 아무 일도 일어나지 않습니다. 크롬에서 스택 오버플로를 열었 기 때문인지 모르겠습니까?
Juan Carlos Oropeza

@JuanCarlosOropeza 어쩌면. 나는 썼다 : Test running the snippet in Firefox그러나 분명히 나는 ​​농담했다 .Chrome (Chrome의 버전 없음)은 EcmaScritpt 6 호환이 아니며 =>기능이 누락되었습니다 .
edc65

@JuanCarlosOropeza 나는 스스로를 수정해야합니다. 최신 Chrome 릴리스에는 화살표 기능이 있지만 스프레드 연산자를 이해하지 못합니다 .... ES6에서 아직 멀다
edc65

0

루비, 85 자

puts (m=0..(n=gets.to_i-1)*2).map{|i|m.map{|j|"0*+"[[(i-n).abs,(j-n).abs].max%3]}*""}

샘플 실행 :

bash-4.3$ ruby -e 'puts (m=0..(n=gets.to_i-1)*2).map{|i|m.map{|j|"0*+"[[(i-n).abs,(j-n).abs].max%3]}*""}' <<< 4
0000000
0+++++0
0+***+0
0+*0*+0
0+***+0
0+++++0
0000000

0

Moonscript-104 바이트

m=io.read!
n=2*m-1
for y=1,n
 io.write ({'0','*','+'})[(math.max y-m,x-m,m-y,m-x)%3+1]for x=1,n
 print!

0

C, 138 바이트

j,k,l;t(i){l=2*i;char*c=calloc(l,l);memset(c,10,l*(l-2));for(;k<i;++k)for(j=k;j<l-1-k;)memset(c+j++*l+k,"+0*"[(i-k)%3],l-2*k-1);puts(c);}

t하나의 정수 매개 변수-나이를 취하는 함수 .

언 골프 ( main위의 것을 쉽게 실행할 수 있는 기능) :

#include "stdlib.h" /* calloc - only necessary for 64-bit system */
j,k,l;t(i)
{
    l=2*i;
    char*c=calloc(l,l);
    memset(c,10,l*(l-2)); /* fill with '\n' */
    for(;k<i;++k)for(j=k;j<l-1-k;)memset(c+j++*l+k,"+0*"[(i-k)%3],l-2*k-1);
    puts(c);
}

main(int c,char**v)
{
    t(atoi(v[1]));
}

stdlib.h그것없이 선언되지 않은 함수의 반환 유형이 있기 때문에, 일부 시스템에 필요할 수 있습니다 calloc에 기본 것이다 int. 때문에 intchar*반드시 같은 크기의하지 않은, 잘못된 포인터에 기록 될 수 있습니다 c. 대부분의 32 비트 시스템에서 모두 char*int같은 크기를 가지고 있지만, 이것은 64 비트 시스템에 대한 사실이 아니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.