पेड़ के छल्ले उम्र दिखाओ


24

परिचय

कल मैंने जन्मदिन की पहेली देखी । बधाई!!

इस सप्ताह भी मैंने टीवी शो बोन्स का एक एपिसोड देखा, जहां एक पेड़ के नीचे एक शव को दफनाया गया था। मृत्यु के समय की गणना करने के लिए, उन्होंने पेड़ के छल्ले गिने।

ट्री रिंग्स बनते हैं क्योंकि पेड़ सर्दियों के दौरान धीमी गति से बढ़ते हैं और गर्मियों के दौरान तेजी से बढ़ते हैं। इस प्रकार आप छल्ले की गिनती करके पेड़ की उम्र की गणना कर सकते हैं। इसके अलावा आप बारिश या शुष्क मौसम जैसी प्राकृतिक घटनाओं को देख सकते हैं।

यहाँ छवि विवरण दर्ज करें

चुनौती

एक पूर्णांक n >= 1को इनपुट के रूप में देखते हुए , पेड़ की उम्र के छल्ले के उत्पादन के लिए एक पूरा कार्यक्रम लिखें।

क्योंकि रिंग साइज बदल सकते हैं, जलवायु चक्र दिखाने के लिए तीन अलग-अलग अक्षरों ('0', '*', '+') का उपयोग करते हैं।

आयु १

0

आयु २

***
*0*
***

आयु ३

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

आयु 4

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

पेड़ का आकार पक्षों का एक वर्ग है 2*n - 1

जीतना

बाइट्स में सबसे छोटा कोड जीतता है।


उम्र = 5 के बारे में क्या?
ब्लू

3
अंगूठियां एक तीन चरणों चक्र है। ('0', '*', '+')तो 5 साल का समय है*
जुआन कार्लोस ओरोपेज़ा

@vihan सवाल नहीं समझते।
जुआन कार्लोस ओरोपेज़ा

@vihan सॉरी अभी भी समझ में नहीं आता कि कैसे दो समस्याओं से भागते हैं। यदि आपके पास इसे हल करने के लिए एक हैक है, तो मुझे शायद इसके बारे में पता नहीं है
जुआन कार्लोस ओरोपेज़ा

आकार हर क्षेत्र, परिधि या प्रत्येक पक्ष की लंबाई है?
बीटा क्षय

जवाबों:


6

K5, 27 30 26 25 22 बाइट्स

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

यह दृष्टिकोण "0"कुछ अन्य चरित्र ( {4(|+y,)/x}) का उपयोग करते हुए सभी पक्षों पर एक कोर (शुरुआत के साथ ) को "लपेटता" है । मौसमी आवरणों का क्रम एक modulo 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*"
 "*********")

मैं के को नहीं जानता, लेकिन क्या यह एक पूर्ण कार्यक्रम है और केवल एक समारोह नहीं है?
एलेक्स ए।

यह एक पूर्ण कार्यक्रम और एक फ़ंक्शन दोनों है। यह एक उदाहरण है जिसे "टैसिट परिभाषा" कहा जाता है। भेद वैसे भी अत्यंत मनमाना है।
जॉन सिप

11

बीबीसी बेसिक, 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)

यहाँ यह एक मैक पर BeebEm3 में चल रहा है:

यहाँ छवि विवरण दर्ज करें


आप उस gif को कैसे बनाते हैं?
जुआन कार्लोस ओरोपेज़ा

9
@JuanCarlosOropeza बहुत कुशलता से नहीं। मैं स्क्रीन पर कब्जा करने के लिए क्विकटाइम प्लेयर का उपयोग करता था, वीडियो को निर्यात करने के लिए पीएनजी छवियों, ग्राफिककॉर्टर को उन्हें GIF में बदलने के लिए क्विकटाइम 7, और परिणामों को अनुकूलित करने के लिए ezgif.com
स्क्वीश ossifrage

7

सीजेएम, 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

मतलाब, 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, हम उस पंक्ति में प्रतीकों को जोड़ते हैं और प्रिंट करते हैं।


आप रेंज स्टेटमेंट को सीधे तीसरी पंक्ति में रखकर इसे छोटा कर सकते हैं।
एथन ब्रूवर

@EthanBrouwer मैं Rदो बार उपयोग कर रहा हूं , और यह 5 वर्णों से अधिक लंबा है, इसलिए असाइनमेंट जीत जाता है।
xnor

टच! मैंने केवल पहली बार देखा। मेरी गलती। :)
एथन ब्रोवर

5

पायथ, 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 बाइट्स दाढ़ी में मदद करने के लिए लुइस मेंडो!

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 में चलाया जा सकता है। ऑक्टेव (IIRC) bwdistअभी तक लागू नहीं हुआ है इसलिए इसे ऑक्टेव में नहीं चलाया जा सकता है।


आप कुछ बाइट्स बचा सकते हैं: "बीज" मैट्रिक्स उत्पन्न करने के लिए eyeइसके rot90'एड वर्जन' द्वारा तत्व-वार का उपयोग करें और गुणा करें :I=eye(2*input('')-1);a='0*+';a(mod(bwdist(I.*rot90(I),'chessboard'),3)+1)
लुइस मेंडू सेप

ओह बढ़िया! धन्यवाद @LuisMendo
रायरेंग -

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

मतलब 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

सेड, 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

जावास्क्रिप्ट (ईएस 6), 114

आउटपुट के लिए अलर्ट का उपयोग करना - खराब आनुपातिक फ़ॉन्ट और परिणाम बदसूरत है। अलर्ट के नीचे स्निपेट में स्निप बॉडी पर पुनर्निर्देशित किया जाता है, जिससे बेहतर परिणाम मिलता है। बैकटिक्स के अंदर की नई लाइन महत्वपूर्ण और गिनी जाती है।

फ़ायरफ़ॉक्स में स्निपेट का परीक्षण करें।

/* 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>


मैं कोड स्निपेट चलाने की कोशिश करता हूं, लेकिन कुछ नहीं होता है। पता नहीं है कि क्या है क्योंकि मैं क्रोम में ढेर अतिप्रवाह खोलता हूं?
जुआन कार्लोस ओरोपेज़ा

@JuanCarlosOropeza शायद कि। मैंने लिखा है: Test running the snippet in Firefoxलेकिन जाहिर है कि मैं सिर्फ मजाक कर रहा था, क्रोम (क्रोम का कोई संस्करण नहीं) एक्मासक्रिट 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

सी, 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लेने एक पूर्णांक पैरामीटर - उम्र।

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के लिए डिफ़ॉल्ट होगा int। क्योंकि intऔर char*आवश्यक रूप से एक ही आकार के नहीं हैं, इसलिए एक अमान्य सूचक को लिखा जा सकता है c। अधिकांश 32-बिट सिस्टम में दोनों char*का intआकार समान है, लेकिन 64-बिट सिस्टम के लिए यह सच नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.