คำนวณสี่เหลี่ยมทั้งหมดจนถึง x โดยใช้การบวกและการลบเท่านั้น


11

เป้าหมายคือการคำนวณกำลังสองทั้งหมดxด้วยการบวกและการลบ

กฎ:

  1. รหัสจะต้องเป็นฟังก์ชั่นที่ใช้จำนวนสแควร์สทั้งหมดในการสร้างและส่งกลับอาร์เรย์ที่มีสแควร์ทั้งหมด
  2. คุณไม่สามารถใช้สตริงโครงสร้างการคูณการหารหรือฟังก์ชันในตัวสำหรับการคำนวณกำลังสอง
  3. คุณสามารถใช้อาร์เรย์จำนวนเต็ม (จำนวนเต็ม) การบวกการลบเท่านั้น ไม่มีผู้ให้บริการรายอื่นอนุญาต!

นี่เป็นคำถามเกี่ยวกับดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!


นี่คืออัลกอริธึมที่เหมาะสมที่สุดสำหรับการเพิ่มกำลังสอง - หรืออย่างน้อยก็จะได้คำตอบที่เหมือนกัน
Peter Taylor

2
@PeterTaylor ไม่มันไม่เหมือนกันเพราะนั่นเป็นอัลกอริธึมที่เหมาะสมที่สุดสำหรับการเพิ่มกำลังสอง แต่คำถามของฉันจะถามเฉพาะการบวกและการลบเท่านั้น
แปรงสีฟัน

ซึ่งเป็นสิ่งเดียวกัน ในฐานะที่เป็นพยาน: คำตอบปัจจุบันของคำถามนี้จะเหมือนกับคำตอบส่วนใหญ่ของคำถามก่อนหน้า
Peter Taylor

@ PeterTaylor ฉันอาจจะลำเอียง แต่ฉันไม่คิดว่ามันจะเหมือนกัน
แปรงสีฟัน

3
คำถามนี้อาจมีคำตอบอยู่ที่อื่นแล้ว แต่นั่นไม่ได้ทำให้คำถามนั้นซ้ำกับคำถามอื่น
Blacklight Shining

คำตอบ:



6

C, 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ทุกครั้งที่ทำซ้ำ

แก้ไข

4 ตัวอักษรสามารถบันทึกได้โดยใช้การประกาศ int โดยนัย (> C99) แต่ค่าใช้จ่ายนี้เป็น 1 ถ่านเพราะตัวforเริ่มต้นไม่สามารถมีการประกาศใน> 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
ตรรกะนั้นยอดเยี่ยม! คุณสมควรได้รับ +1
Mukul Kumar

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

Windows รุ่นที่ 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 และส่งออกรายการไปยังคอนโซล ใช้จำนวนของช่องสี่เหลี่ยมในการสร้างจากอาร์กิวเมนต์บรรทัดคำสั่งแรก ส่วนใหญ่จะใช้&แทนการขึ้นบรรทัดใหม่ แต่ก็ยังจำเป็นต้องใช้และจะนับเป็นสองไบต์

cmd /v:onมันต้องขยายตัวตัวแปรล่าช้าเปิดใช้งานนี้สามารถทำได้ด้วย สมมติว่ามันไม่setlocal enabledelayedexpansion&จำเป็นต้องมีสิ่งพิเศษในตอนเริ่มต้น (โดยไม่มีสคริปต์คือ 83 ไบต์)



4

Perl, 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
        ];

การแก้ไข:

  • ฟังก์ชั่นไม่ระบุชื่อ (−2 ไบต์ขอบคุณskibrianski )
  • popแทนshift(−2 ไบต์ขอบคุณskibiranski )

ฉันไม่เห็นเหตุผลที่คุณต้องตั้งชื่อย่อยของคุณ IOW "sub {map {$ a + = $ _ + $ _- 1} 1..shift}" ดูเหมือนจะถูกต้องสำหรับฉันและช่วยให้คุณประหยัดสองตัวอักษร
skibrianski

@skibrianski: ฟังก์ชั่นที่ไม่ระบุชื่อเป็นฟังก์ชั่น ข้อเสียคือการเรียกใช้ฟังก์ชั่นนั้นยุ่งยากกว่าเดิมเล็กน้อย
Heiko Oberdiek

ใช่ แต่นั่นคือผู้โทร มีรายการในภาษาอื่น ๆ ที่กำหนดผู้ใต้บังคับบัญชาที่ไม่ระบุชื่อดังนั้นฉันคิดว่าคุณปลอดภัย =)
skibrianski

และคุณสามารถบันทึกอีก 2 ตัวอักษรโดยใช้ pop () แทน shift () เนื่องจากมีเพียงอาร์กิวเมนต์เดียว
skibrianski

@skibrianski: ถูกต้องขอบคุณ
Heiko Oberdiek

4

JavaScript - 32 ตัวอักษร

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

ถือว่าตัวแปรxที่มีอยู่และสร้างอาร์เรย์ของสี่เหลี่ยมสำหรับค่าa1..x

ECMAScript 6 - 27 ตัวอักษร

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

โทรf(x)จะเติมอาร์เรย์ที่มีสี่เหลี่ยมสำหรับค่าb0..x


ฉันต้องถาม ... i+++iในตอนท้าย ... ?
WallyWest

2
k+=i+++iเป็นเช่นเดียวกับk += i + (++i)ที่เป็นเช่นเดียวกับk+=i+i+1ตามด้วยi=i+1
MT0

โอ้นั่นคืออัจฉริยะ ... ข้าต้องใช้มันใน codegolf ตัวต่อไปถ้าจำเป็น! :)
WallyWest

คุณสามารถบันทึกอักขระหนึ่งตัวได้โดยเลื่อนการประกาศฟังก์ชันไปยังภายในอาร์เรย์ (เช่นb=[f=i=>b[i]=i&&i+--i+f(i)])
แปรงสีฟัน

ขอบคุณ - บันทึกหนึ่งตัวอักษรที่คำตอบด้านบนด้วยการย้ายสิ่งต่าง ๆ เพื่อลบเซมิโคลอน
MT0

4

Julia - 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! คำตอบที่กระชับ ไม่เคยได้ยินเกี่ยวกับจูเลีย แต่มันดูน่าสนใจ
Jonathan Van Matre

ไม่ใช่ "2x" การคูณใน Julia ใช่ไหม คุณสามารถพูด x + x แทนซึ่งจะทำให้คุณเสียค่าใช้จ่ายเพียงหนึ่งไบต์
Glenn Randers-Pehrson

คุณถูกต้อง (ไม่ได้แจ้งให้ทราบล่วงหน้า) แก้ไข
CCP

ฉันยังไม่คุ้นเคยกับ julia แต่ค้นหาในคู่มือออนไลน์ที่docs.julialang.org/en/release-0.2และพบ "สัมประสิทธิ์ตัวอักษรตัวเลข: เพื่อให้สูตรตัวเลขและนิพจน์ทั่วไปชัดเจนขึ้นจูเลียอนุญาตให้มีตัวแปร จะถูกนำหน้าด้วยตัวอักษรที่เป็นตัวเลขทันทีโดยนัยคูณ " ใช่แล้ว 2x เป็นการคูณ
Glenn Randers-Pehrson

2

C ++ 99 81 78 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;}  

ความพยายามครั้งแรกของฉันในการเล่นกอล์ฟ

รหัสนี้ขึ้นอยู่กับ
a = 2 xn - 1
โดยที่nคือจำนวนคำและaคือคำที่nในชุดต่อไปนี้
1, 3, 5, 9, 11, 13, 13, .....
ผลรวมของ 2 เทอมแรก = 2 ยกกำลังสอง

ผลรวมของ 3 เทอมแรก = 3 กำลังสอง
และต่อไป ...


2
ฉันคิดว่าคุณสามารถลบวงเล็บปีกกา{}หลังจากforวนเนื่องจากมีเพียงคำสั่งเดียว วิธีนี้สามารถลดจำนวนถ่านของคุณได้ 2
user12205

1
หากคุณประกาศอาร์เรย์ที่มีขนาดไม่คงที่ในฟังก์ชั่นอื่นที่ไม่ใช่ main () แสดงว่าเป็นที่ยอมรับ
Mukul Kumar

1
รหัสนี้มีพฤติกรรมที่ไม่ได้กำหนด
Kerrek SB

1
และส่งกลับตัวชี้ไปยังข้อมูลบนสแต็คที่ถูกทำลายระหว่างการส่งคืน
VX

1
@MukulKumar addition, subtractionฉันแค่ใช้มันเท่านั้น
mniip

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

จำนวนที่คาดว่าจะอยู่ในการลงทะเบียน X และการลงทะเบียนอื่น ๆ คาดว่าจะเป็น 0 ผลลัพธ์จะถูกผลักไปยังกองซ้อนมันจะแตกเมื่อถึง 65535 เนื่องจากสถาปัตยกรรม 16 บิต คุณอาจต้องการเพิ่มSUB PC, 1การสิ้นสุดเพื่อทดสอบ คอมไพล์โปรแกรมควรมีขนาด 20 ไบต์ (10 คำ)


2

Haskell

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 เล็กน้อยได้หรือไม่?
Glenn Randers-Pehrson

2

Haskell, 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

Javascript 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 f=(n,a)=>a[n]=n?f(n-1,a)+n+n-1:06:
แปรงสีฟัน

1
ฉันไม่สามารถรอ ECMAScript 6 เพื่อเข้าสู่การใช้งานหลักได้ นั่นจะเป็นข้อแก้ตัวที่สมบูรณ์แบบในการเรียนรู้
Isiah Meadows

1
ส่วนฟังก์ชั่นลูกศรของข้อมูลจำเพาะ ECMAScript 6 อยู่ใน FireFox ตั้งแต่รุ่น 22
MT0

1

สมอลทอล์ค, 52

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

ส่งคืนอาร์เรย์ใหม่ (เช่นไม่เติมหรือเพิ่มลงในอาร์เรย์ที่มีอยู่)

โทร:

ค่า f: 10

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

แก้ไข: ฉันแทนที่ลูปภายในด้วยอัลกอริทึมจากโซลูชัน Haskell ของ @ mniip


1

วิธีการเดียวกับข้างต้นใน APL และ J:

APL: F←{+\1+V+V←¯1+⍳⍵}(17 ตัวอักษร) ทำงานได้กับตัวแปร APL ส่วนใหญ่ (ลองที่นี่ )

และแม้แต่น้อย (เพียง 14 ตัวอักษร) ด้วย NGN APL: F←{+\1+V+V←⍳⍵}(ดูที่นี่ )

J: f=:+/\@(>:@+:@:i.)(18 ตัวอักษร)

แก้ไข:ทางออกที่ดีกว่าใน APL: F←{+\¯1+V+V←⍳⍵}(15 ตัวอักษร)



1

C # - 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องค์ประกอบ th


คุณลองลบช่องว่างระหว่างint[]และsq? ฉันไม่รู้ C # แต่ฉันคิดว่ามันควรจะใช้ได้
user12205

ไม่มันไม่ทำงาน แรก int [] เป็นชนิดส่งคืนของวิธีการ "sq" ฉันจะสามารถลดชื่อวิธีการที่จะอาจจะเป็นเพียง "S" :)
Rajesh

ผมหมายถึงใช้int[]sqแทนint[] sqและแทนint[]res int[] resวิธีนี้ช่วยให้คุณประหยัดสองตัวอักษรและฉันไม่ได้รับข้อผิดพลาดในการรวบรวมด้วย นอกจากนี้คุณควรใช้ตัวระบุอักขระเดียวsqและresตามที่คุณแนะนำ
user12205

ดูเหมือนว่ามีบางอย่างผิดปกติกับคำตอบของคุณ
user12205

การเยื้องรหัสที่มีช่องว่าง 4 เพื่อวางไว้ในบล็อกรหัสด้วยตัวอักษร monospace
luser droog

1

Fortran 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

แก้ไข: ลบวงด้านในออกและใช้อัลกอริทึม Haskell ของ @ mniip แทน

แก้ไข: ตรวจสอบว่ารูทีนย่อยและไดรเวอร์เป็น Fortran 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 ขอบคุณฉันแทนที่วงในของฉันด้วยรหัสของคุณ
Glenn Randers-Pehrson

1

Python - 51

ที่นี่ฉันกำลังกำหนดหน้าที่ตามกฎที่ร้องขอ

การใช้sumตัวเลขคี่:

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

นี้ใช้เท่านั้นsum(builtin ซึ่งดำเนินการเพิ่ม) และrange(builtin ซึ่งสร้างอาร์เรย์โดยใช้การเพิ่ม) หากคุณคัดค้าน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 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.