年輪の年齢を表示


24

前書き

昨日バースデーパズルを見ました。おめでとうございます!!

また今週、私はテレビ番組「ボーンズ」のエピソードを見ました。そこでは死体が木の下に埋められているのが見つかりました。死の時間を計算するために、彼らは年輪を数えました。

木は冬には成長が遅く、夏には速く成長するため、年輪が形成されます。したがって、リングを数えることにより、ツリーの年齢を計算できます。また、雨季や乾季などの自然現象を見ることができます。

ここに画像の説明を入力してください

チャレンジ

n >= 1入力として整数を指定し、ツリーの年齢リングを出力する完全なプログラムを作成します。

リングは形状が変化する可能性があるため、3つの異なる文字(「0」、「*」、「+」)を使用して気候サイクルを示します。

1歳

0

2歳

***
*0*
***

3歳

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

4歳

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

木のサイズは辺の正方形です 2*n - 1

勝ち

バイト単位の最短コードが優先されます。


age = 5の場合はどうですか?
ブルー

3
リングには3ステップのサイクルがあります。('0', '*', '+')5年は*
フアンカルロスオロペサ

@vihanは質問を理解していません。
フアンカルロスオロペサ

@vihan申し訳ありませんが、2で割ると問題がどのように解決されるか理解できません。あなたがそれを解決するためのハックを持っている場合、私はおそらくそれについて知らない
フアンカルロスオロペザ

サイズは、各辺の面積、周囲、または長さですか?
ベータ崩壊

回答:


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はわかりませんが、これは完全なプログラムであり、単なる関数ではありませんか?
アレックスA.

それは完全なプログラムと機能の両方です。これは、「暗黙の定義」と呼ばれるものの例です。とにかく区別は非常にarbitrary意的です。
ヨーネ

11

BBC Basic、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に相当putchar())を使用して各文字を印刷しています。これはよりもはるかに効率的ですP.MID$("0*+",p MOD3+1,1)

ここでは、Mac上のBeebEm3で実行されています。

ここに画像の説明を入力してください


そのgifを作成する方法は?
フアンカルロスオロペサ

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

Python 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:]

行ごとに印刷します。各行は3つの部分に分割されます。

  • 最初の繰り返し文字を含む左側のサイクリングパーツ。
  • 繰り返し中央部
  • 適切なサイクリングパーツ。

のためにn=4

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

のように左の部分を逆に生成し、w最後の文字を複製し2*i、最初の文字なしで元のバージョンを追加します。


5

Python 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)

ツリーを座標グリッドと考えると、シンボルat (i,j)はによってmax(abs(i),abs(j))%3、または同等に決定されmax(i,-i,j,-j)%3ます。各行についてi、その行のシンボルを結合して印刷します。


範囲ステートメントを3行目にまっすぐ置くことで、これを短縮できます。
イーサンブルーワー

@EthanBrouwer私はR2回使用していますが、5文字より長いため、割り当てが優先されます。
XNOR

タッチ!私は最初のものを見ました。私の悪い。:)
イーサンブルーワー

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で実行できません。


使用:あなたは数バイト節約することができeye、そのことにより、および乗算要素単位rot90: 『シード』マトリックスを生成するための「EDバージョンI=eye(2*input('')-1);a='0*+';a(mod(bwdist(I.*rot90(I),'chessboard'),3)+1)
ルイスMendo

かっこいい、イケてる!ありがとう@LuisMendo
rayryeng-モニカーの復活

2

Python 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

Perl、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

JavaScript(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>


コードスニペットを実行しようとしましたが、何も起こりません。それがChromeでスタックオーバーフローを開いているためかどうかわからないのですか?
フアンカルロスオロペザ

@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

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

t1つの整数パラメーターを取得する関数-年齢。

Ungolfed(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がデフォルトですintintchar*は必ずしも同じサイズではないため、無効なポインターがに書き込まれる可能性がありますc。ほとんどの32ビットシステムの両方のchar*int同じ大きさを有しているが、これは、64ビットシステムには当てはまりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.