केवल जोड़ और घटाव का उपयोग करके x तक सभी वर्गों की गणना करें


11

लक्ष्य सभी वर्गों की गणना xऔर घटाव के साथ करना है।

नियम:

  1. कोड एक फ़ंक्शन होना चाहिए जो उत्पन्न करने के लिए वर्गों की कुल संख्या लेता है, और उन सभी वर्गों वाले सरणी देता है।
  2. वर्गों की गणना के लिए आप स्ट्रिंग्स, संरचनाओं, गुणन, विभाजन या अंतर्निहित कार्यों का उपयोग नहीं कर सकते ।
  3. आप केवल सरणियों, पूर्णांकों (संपूर्ण संख्याओं), जोड़, घटाव का उपयोग कर सकते हैं। किसी अन्य ऑपरेटर ने अनुमति नहीं दी!

यह एक प्रश्न है, इसलिए बाइट्स में सबसे छोटा कोड जीतता है!


यह अनिवार्य रूप से वेतन वृद्धि वर्गों के लिए सबसे अनुकूलित एल्गोरिथ्म है - या, कम से कम, बहुत अधिक समान उत्तर मिलेंगे।
पीटर टेलर

2
@PeterTaylor नहीं, यह समान नहीं है, क्योंकि यह वृद्धिशील वर्गों के लिए सबसे अनुकूलित एल्गोरिथ्म के लिए है, लेकिन मेरा प्रश्न केवल जोड़ और घटाव के लिए पूछता है।
टूथब्रश

जो एक ही बात है। साक्षी के रूप में: इस प्रश्न का वर्तमान उत्तर ठीक वैसा ही है जैसा कि पिछले प्रश्न के उत्तर के विशाल बहुमत का है।
पीटर टेलर

@PeterTaylor मैं पक्षपाती हो सकता हूं, लेकिन मुझे नहीं लगता कि यह बिल्कुल भी समान है।
टूथब्रश

3
इस प्रश्न के उत्तर पहले से ही हो सकते हैं, लेकिन यह प्रश्न को अन्य प्रश्न का दोहराव नहीं बनाता है ।
ब्लैकलाइट शाइनिंग

जवाबों:



6

सी, 55 52 बाइट्स

int s(int n,int*r){for(int i=0,j=-1;n--;*r++=i+=j+=2);}

बस विषम संख्या में रकम

  • n: गणना करने के लिए वर्गों की संख्या
  • r: परिणाम संग्रहीत करने के लिए आउटपुट सरणी
  • j: क्रमिक 1, 3, 5, 7, ... लेता है
  • i: jप्रत्येक पुनरावृत्ति पर वेतन वृद्धि होती है

संपादित करें

अंतर्निहित इंट डिक्लेरेशन (> C99) का उपयोग करके 4 वर्णों को बचाया जा सकता है, लेकिन इसमें 1 char की लागत होती है क्योंकि forinitializers में> C99 में घोषणा नहीं हो सकती है। फिर कोड बन जाता है

s(int n,int*r){int i=0,j=-1;for(;n--;*r++=i+=j+=2);}

प्रयोग

void main() {
    int r[20];
    s(20, r);
    for (int i = 0; i < 20 ; ++i) printf("%d\n", r[i]);
}  

उत्पादन

1
4
9
16
25
36
49
(...)
361
400

1
यह तर्क बहुत बढ़िया है! आप पात्र हैं
मुकुल कुमार

5

GolfScript, 17 अक्षर

{[,{.+(1$+}*]}:F;

उपयोग (उदाहरण भी ऑनलाइन देखें ):

10 F     # => [0 1 4 9 16 25 36 49 64 81]

नोट: * एक लूप है और गुणन ऑपरेटर नहीं।


ठीक; यह कैसे काम करता है?
टूथब्रश

@toothbrush ,इनपुट लेता है और इसे सरणी में परिवर्तित करता है [0 1 ... n-1]। फिर *दिए गए कोड-ब्लॉक को सरणी में इंजेक्ट करता है। यह ब्लॉक पहले वर्तमान आइटम को दोगुना करता है ( .+) एक घटाता है ( () और फिर पिछला परिणाम 1$+(दूसरे शब्दों में, 2j-1पिछले वर्ग संख्या में जोड़ें ) जोड़ता है । []एक नई सरणी वापस करने के लिए सब कुछ संलग्न करता है।
हावर्ड

महान! मैं GolfScript नहीं जानता, इसलिए मैंने सोचा कि यह कैसे काम करता है।
टूथब्रश

5

विंडोज बैच, 115 बाइट्स

setlocal enabledelayedexpansion&for /l %%i in (1 1 %1)do (set a=&for /l %%j in (1 1 %%i)do set /a a+=%%i
echo.!a!)

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

यह सक्षम चर विस्तार में देरी की जरूरत है, यह साथ किया जा सकता है cmd /v:on। यह मानकर नहीं setlocal enabledelayedexpansion&कि शुरुआत में एक अतिरिक्त की आवश्यकता थी (इसके बिना स्क्रिप्ट 83 बाइट्स है)।


4

हास्केल - 30

f n=scanl1(\x y->x+y+y-1)[1..n]

यह इस तथ्य का उपयोग करता है कि (n+1)^2=n^2+2n+1


4

पर्ल, 27 बाइट्स

sub{map{$a+=$_+$_-1}1..pop}

गणित:

गणित

10 वर्गों को मुद्रित करने के लिए फ़ंक्शन को कॉल करने के लिए स्क्रिप्ट:

#!/usr/bin/env perl
$square = sub{map{$a+=$_+$_-1}1..pop};
use Data::Dumper;
@result = &$square(10);
print Dumper \@result;

परिणाम:

$VAR1 = [
          1,
          4,
          9,
          16,
          25,
          36,
          49,
          64,
          81,
          100
        ];

संपादन:


मुझे कोई कारण नहीं है कि आपको अपने उप का नाम क्यों देना चाहिए। IOW "उप {मानचित्र {$ a + = $ _ + $ _- 1} 1..shift}" मेरे लिए कानूनी लगता है, और आपको दो वर्ण बचाता है।
skibrianski

@skibrianski: एक अनाम फ़ंक्शन भी एक फ़ंक्शन है। नकारात्मक पक्ष यह है कि फ़ंक्शन की कॉलिंग थोड़ी अधिक बोझिल है।
हेइको ओबर्डिएक

सही है, लेकिन यह फोन करने वाले पर है। अन्य भाषाओं में प्रविष्टियाँ हैं जो अनाम उप-परिभाषा को परिभाषित करती हैं, इसलिए मुझे लगता है कि आप सुरक्षित हैं =)
skibrianski

और आप शिफ्ट () के बजाय पॉप () का उपयोग करके अन्य 2 वर्णों को बचा सकते हैं क्योंकि केवल एक ही तर्क है।
skibrianski

@skibrianski: सही है, धन्यवाद।
हाइको ओबेरडिएक

4

जावास्क्रिप्ट - 32 वर्ण

for(a=[k=i=0];i<x;)a[i]=k+=i+++i

मान लेता है कि एक चर xमौजूद है और aमूल्यों के लिए वर्गों की एक सरणी बनाता है 1..x

ECMAScript 6 - 27 वर्ण

b=[f=i=>b[i]=i&&i+--i+f(i)]

कॉलिंग मानों के लिए वर्गों के साथ f(x)सरणी को पॉप्युलेट करेगा ।b0..x


मुझे पूछना है ... i+++iआखिर में ...?
वैलीवेस्ट

2
k+=i+++iवही है k += i + (++i)जो उसी के k+=i+i+1बाद हैi=i+1
MT0

ओह, यह प्रतिभाशाली है ... मुझे लगता है कि जरूरत पड़ने पर मेरे अगले कोडगॉफ़ में इसे लागू करना होगा! :)
वॉलीवेस्ट

आप फ़ंक्शन घोषणा को सरणी (जैसे b=[f=i=>b[i]=i&&i+--i+f(i)]) के अंदर ले जाकर एक चरित्र को बचा सकते हैं ।
टूथब्रश

धन्यवाद - अर्ध-बृहदान्त्र को हटाने के लिए चीजों को गोल करके शीर्ष उत्तर पर एक चरित्र को भी बचाया।
MT0

4

जूलिया - 33

किसी भी वर्ग संख्या को विषम संख्याओं के योग द्वारा लिखा जा सकता है:

julia> f(x,s=0)=[s+=i for i=1:2:(x+x-1)];f(5)
5-element Array{Int64,1}:
  1
  4
  9
 16
 25

नमस्ते, और CG.se में आपका स्वागत है! अच्छा, संक्षिप्त जवाब। जूलिया के बारे में कभी नहीं सुना, लेकिन यह पेचीदा लग रहा है।
जोनाथन वान मैट्रे

जूलिया में "2x" गुणा नहीं है? आप इसके बजाय x + x कह सकते हैं, जो आपको केवल एक बाइट का खर्च देगा।
ग्लेन रैंडर्स-पीहरसन

आप सही हैं (ध्यान नहीं दिया), संपादित किए गए।
सीसीपी

मैं जूलिया से परिचित नहीं हूँ (अभी तक), लेकिन इसे ऑनलाइन मैनुअल में docs.julialang.org/en/release-0.2 पर देखा और पाया "न्यूमेरिक लिटरल गुणांक: सामान्य संख्यात्मक सूत्र और भाव स्पष्ट करने के लिए, जूलिया वैरिएबल की अनुमति देता है एक सांख्यिक शाब्दिक से पहले, गुणन का अर्थ है। " तो हाँ, 2x एक गुणा है।
ग्लेन रैंडर्स-पीरसन

2

सी ++ 99 81 78 80 80 78

int* f(int x){int a[x],i=1;a[0]=1;while(i<x)a[i++]=a[--i]+(++i)+i+1;return a;}  

कोड-गोल्फ में मेरी पहली कोशिश

इस कोड पर आधारित है
एक = 2 xn - 1
जहां n अवधि गिनती है और एक है n श्रृंखला के बाद में वें अवधि
1, 3, 5, 9, 11, 13, .....
पहले 2 मामले = 2 की राशि वर्ग

पहले 3 शब्द = 3 वर्ग
और इतने पर ...


2
मुझे लगता है कि आप लूप के {}बाद ब्रेसिज़ निकाल सकते हैं for, क्योंकि केवल एक बयान है। यह आपके char count को 2 से कम कर सकता है
user12205

1
यदि आप मुख्य () के अलावा किसी अन्य समारोह में गैर-स्थिर आकार के सरणियों की घोषणा करते हैं, तो यह स्वीकार्य है
मुकुल कुमार

1
इस कोड में अपरिभाषित व्यवहार है।
केरेके एसबी

1
और रिटर्न के दौरान स्टैक नष्ट होने के डेटा पर सूचक लौटाता है।
वीएक्स

1
@ मुकुलकुमार addition, subtraction, मैं केवल उन का उपयोग कर रहा हूँ
17

2

DCPU-16 विधानसभा (90 बाइट्स)

मैंने इसे एक काल्पनिक प्रोसेसर के लिए विधानसभा में लिखा था, क्योंकि क्यों नहीं?

:l
ADD I,1
SET B,0
SET J,0
:m
ADD J,1
ADD B,I
IFL J,I
SET PC,m
SET PUSH,B
IFL I,X
SET PC,l

संख्या एक्स रजिस्टर में होने की उम्मीद है, और अन्य रजिस्टरों की उम्मीद है। 0. परिणाम स्टैक को धकेल दिया जाता है, यह 16 बिट आर्किटेक्चर के कारण 65535 तक पहुंचने के बाद टूट जाएगा। आप SUB PC, 1इसे परीक्षण करने के लिए अंत में जोड़ना चाह सकते हैं । संकलित, कार्यक्रम 20 बाइट्स (10 शब्द) होना चाहिए।


2

हास्केल

f x=take x [iterate (+y) 0 !! y | y<- [0..]]

यह मूल रूप से गुणन को आमंत्रित करता है, इसे स्वयं उपयोग करता है, और सभी नंबरों पर इसे मैप करता है। f 10= [0,1,4,9,16,25,36,49,64,81]। इसके अलावा f 91= [0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361,400,441,484,529,576,625,676,729,784,841,900,961,1024,1089,1156,1225,1296,1369,1444,1521,1600,1681,1764,1849,1936,2025,2116,2209,2304,2401,2500,2601,2704,2809,2916,3025,3136,3249,3364,3481,3600,3721,3844,3969,4096,4225,4356,4489,4624,4761,4900,5041,5184,5329,5476,5625,5776,5929,6084,6241,6400,6561,6724,6889,7056,7225,7396,7569,7744,7921,8100]


क्या आप डेमो को 10 से थोड़ा बड़ा कर सकते हैं?
ग्लेन रैंडर्स-पीरसन

2

हास्केल, 34/23

n#m=m+n:(n+2)#(m+n)
f n=take n$1#0

या, यदि आयात ठीक हैं:

f n=scanl1(+)[1,3..n+n]

आउटपुट:

λ> f 8
[1,4,9,16,25,36,49,64]

1

जावास्क्रिप्ट 47

function f(n,a){return a[n]=n?f(n-1,a)+n+n-1:0}

r=[];f(12,r);console.log(r) रिटर्न:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144]


महान! में ECMAScript 6: f=(n,a)=>a[n]=n?f(n-1,a)+n+n-1:0
टूथब्रश

1
मैं वास्तव में ECMAScript 6 के लिए वास्तव में मुख्यधारा के उपयोग में प्रवेश करने की प्रतीक्षा नहीं कर सकता। इसे सीखने का यह सही बहाना होगा।
ईशाय मीडोज

1
ECMAScript 6 विनिर्देश के तीर समारोह हिस्सा संस्करण 22 के बाद से फ़ायर्फ़ॉक्स में रहा है
MT0

1

स्मालटाक, 52

f:=[:n||s|(s:=1)to:n collect:[:i|x:=s.s:=s+i+i+1.x]]

एक नया सरणी लौटाता है (यानी किसी मौजूदा को भरता या जोड़ता नहीं है)।

फोन:

च मान: १०

-> # (1 4 9 16 25 36 49 64 81 100)


1

अजगर - 39

a=0
for i in range(5):a+=i+i+1;print(a)

5किसी भी मान से बदलें । कोई सुझाव?


1

दे घुमा के - 92 85 62 61 59 57

declare -i k=1;for((i=0;i++<$1;k+=i+i+1));do echo $k;done

परिणाम:

$ ./squares.sh 10
1
4
9
16
25
36
49
64
81
100

संपादित करें: मैंने @ mipip के हास्केल समाधान से एल्गोरिथ्म के साथ आंतरिक लूप को बदल दिया।


1

एपीएल और जे में उपरोक्त विधि:

APL: F←{+\1+V+V←¯1+⍳⍵}(17 अक्षर) सबसे एपीएल वेरिएंट के साथ काम करता है (इसे यहां देखें )

और भी कम (केवल 14 वर्ण) एनजीएन एपीएल के साथ: F←{+\1+V+V←⍳⍵}( यहां देखें )

जे: f=:+/\@(>:@+:@:i.)(18 अक्षर)

संपादित करें: एपीएल में बेहतर समाधान: F←{+\¯1+V+V←⍳⍵}(15 अक्षर)



1

सी # - 93

int[]s(int l){int[]w=new int[l];while(l>=0){int i=0;while(i<l){w[l-1]+=l;i++;}l--;}return w;}

- जब एक ही कक्षा का एक और तरीका से कहा जाता है, सरणी वापस आ जाएगी [1,4,9,16,25,36...]करने के लिए, lवें तत्व।


क्या आप के बीच रिक्त स्थान को हटाने की कोशिश की int[]और sq? मैं C # नहीं जानता, लेकिन मुझे लगता है कि इसे काम करना चाहिए।
user12205

नहीं, वह काम नहीं करेगा। पहला int [] विधि का प्रकार "sq" है। मैं विधि का नाम कम कर सकता हूं "s" :)
राजेश

मेरा मतलब int[]sqइसके बजाय int[] sqऔर के int[]resबजाय का उपयोग करना है int[] res। यह आपको दो वर्णों को बचाने में मदद करता है, और मुझे इसके साथ कोई संकलन त्रुटि नहीं मिली। इसके अलावा, आप के लिए एक वर्ण पहचानकर्ता का उपयोग करना चाहिए sqऔर resआप सुझाव के रूप में।
user12205

ऐसा लगता है कि आपके उत्तर में कुछ गड़बड़ है
user12205

4 कोड के साथ इंडेंट कोड इसे मोनोस्पेस फ़ॉन्ट के साथ कोड-ब्लॉक में रखने के लिए।
लूजर ने

1

फोरट्रान II | IV | 66 | 77 | 134 122 109 105

  SUBROUTINES(N,M)
  INTEGERM(N)
  K=0
  DO1I=1,N
  K=K+I+I-1
1 M(I)=K
  END

संपादित करें: आंतरिक लूप को हटा दिया गया और इसके बजाय @ mniip के हास्केल एल्गोरिथम का उपयोग किया गया।

संपादित करें: सत्यापित करें कि सबरूटीन और ड्राइवर फ़ोर्ट्रन II और IV मान्य हैं

चालक:

  INTEGER M(100)
  READ(5,3)N
  IF(N)5,5,1
1 IF(N-100)2,2,5
2 CALLS(N,M)
  WRITE(6,4)(M(I),I=1,N)
3 FORMAT(I3)
4 FORMAT(10I6)
  STOP  
5 STOP1
  END

परिणाम:

$ echo 20 | ./a.out
   1     4     9    16    25    36    49    64    81   100
 121   144   169   196   225   256   289   324   361   400

@mniip, धन्यवाद, मैंने अपने कोड के साथ मेरे आंतरिक लूप को बदल दिया।
ग्लेन रैंडर्स-पीरसन

1

अजगर - 51

यहां मैं एक फ़ंक्शन को नियमों के अनुसार अनुरोध करने के लिए परिभाषित कर रहा हूं।

sumविषम संख्याओं का उपयोग :

f=lambda n:[sum(range(1,i+i+3,2))for i in range(n)]

यह केवल sum(एक बिलिन जो अतिरिक्त करता है) का उपयोग करता है और range(एक बिलिन जो अतिरिक्त का उपयोग करके एरेज़ बनाता है)। यदि आपको आपत्ति है sum, तो हम इसके साथ कर सकते हैं reduce:

def g(n):v=[];reduce(lambda x,y:v.append(x) or x+y,range(1,i+i+3,2));return v

1

PHP, 92 बाइट्स

इसके लिए "शॉर्ट टैग्स" विकल्प को सक्षम करने की आवश्यकता है, निश्चित रूप से (शुरुआत में 3 बाइट्स को बंद करने के लिए)।

<? $x=100;$a=1;$r=0;while($r<=$x){if($r){echo"$r ";}for($i=0,$r=0;$i<$a;$i++){$r+=$a;}$a++;}

आउटपुट:

1 4 9 16 25 36 49 64 81 100 

1

फोर्थ - 48 बाइट्स

: f 1+ 0 do i 0 i 0 do over + loop . drop loop ;

उपयोग:

7 f

आउटपुट:

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