나무 반지 나이 표시


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. 때문에 int와 char*반드시 같은 크기의하지 않은, 잘못된 포인터에 기록 될 수 있습니다 c. 대부분의 32 비트 시스템에서 모두 char*와 int같은 크기를 가지고 있지만, 이것은 64 비트 시스템에 대한 사실이 아니다.

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