Berechnen Sie alle Quadrate bis x nur mit Addition und Subtraktion


11

Ziel ist es, alle Quadrate bis xmit Addition und Subtraktion zu berechnen .

Regeln:

  1. Der Code muss eine Funktion sein, die die Gesamtzahl der zu generierenden Quadrate verwendet und ein Array zurückgibt, das alle diese Quadrate enthält.
  2. Sie können keine Zeichenfolgen, Strukturen, Multiplikations-, Divisions- oder integrierten Funktionen zum Berechnen von Quadraten verwenden.
  3. Sie können nur Arrays, Ganzzahlen (ganze Zahlen), Additionen und Subtraktionen verwenden. Keine anderen Betreiber erlaubt!

Dies ist eine Frage, also gewinnt der kürzeste Code in Bytes!


Dies ist im Wesentlichen der am meisten optimierte Algorithmus zum Inkrementieren von Quadraten - oder erhält zumindest ziemlich identische Antworten.
Peter Taylor

2
@PeterTaylor Nein, es ist nicht dasselbe, da dies für den am besten optimierten Algorithmus zum Inkrementieren von Quadraten gilt, aber meine Frage verlangt nur Addition und Subtraktion.
Zahnbürste

Welches ist das gleiche. Als Zeuge: Die vorliegende Antwort auf diese Frage entspricht genau der überwiegenden Mehrheit der Antworten auf die vorherige Frage.
Peter Taylor

@ PeterTaylor Ich bin vielleicht voreingenommen, aber ich glaube wirklich nicht, dass es überhaupt gleich ist.
Zahnbürste

3
Diese Frage hat möglicherweise bereits an anderer Stelle Antworten, aber das macht die Frage nicht zu einem Duplikat der anderen Frage.
Blacklight Shining

Antworten:



6

C, 55 52 Bytes

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

summiert einfach ungerade Zahlen

  • n: Anzahl der zu berechnenden Quadrate
  • r: Ausgabearray zum Speichern der Ergebnisse
  • j: nimmt die aufeinanderfolgenden Werte 1, 3, 5, 7, ...
  • i: wird jbei jeder Iteration um erhöht

Bearbeiten

Mit der impliziten int-Deklaration (> C99) können 4 Zeichen gespeichert werden. Dies kostet jedoch 1 Zeichen, da forInitialisierer in> C99 keine Deklaration enthalten können. Dann wird der Code

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

Verwendung

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

Ausgabe

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

1
Diese Logik ist ausgezeichnet! Sie verdienen +1
Mukul Kumar

5

GolfScript, 17 Zeichen

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

Verwendung (siehe auch Beispiele online ):

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

Hinweis: * ist eine Schleife und nicht der Multiplikationsoperator.


IN ORDNUNG; wie funktioniert es?
Zahnbürste

@toothbrush ,nimmt die Eingabe und konvertiert sie in das Array [0 1 ... n-1]. Dann *spritzt den gegebenen Code-Block in das Array. Dieser Block verdoppelt zuerst das aktuelle Element ( .+), subtrahiert eins ( () und addiert dann das vorherige Ergebnis 1$+(mit anderen Worten, addiert 2j-1zur vorherigen quadratischen Zahl). []schließt alles ein, um ein neues Array zurückzugeben.
Howard

Groß! Ich kenne GolfScript nicht und habe mich gefragt, wie es funktioniert.
Zahnbürste

5

Windows Batch, 115 Byte

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

Dies sollte in einer Batchdatei abgelegt werden, anstatt von cmd ausgeführt zu werden, und es gibt die Liste an die Konsole aus. Es wird die Anzahl der Quadrate benötigt, die aus dem ersten Befehlszeilenargument erstellt werden sollen. Zum größten Teil wird &anstelle von Zeilenumbrüchen eine verwendet , eine wird jedoch weiterhin benötigt und zählt als zwei Bytes.

Es muss eine verzögerte Variablenerweiterung aktiviert sein, dies kann mit erfolgen cmd /v:on. Vorausgesetzt, dies ist nicht der Fall, setlocal enabledelayedexpansion&wurde zu Beginn ein zusätzliches benötigt (ohne dieses Skript beträgt das Skript 83 Byte).


4

Haskell - 30

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

Dies nutzt die Tatsache, dass (n+1)^2=n^2+2n+1


4

Perl, 27 Bytes

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

Mathematik:

Mathematik

Skript zum Aufrufen der Funktion zum Drucken von 10 Quadraten:

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

Ergebnis:

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

Bearbeitungen:


Ich sehe keinen Grund, warum Sie Ihr Sub benennen müssen. IOW "sub {map {$ a + = $ _ + $ _- 1} 1..shift}" scheint mir legitim zu sein und spart Ihnen zwei Zeichen.
Skibrianski

@skibrianski: Eine anonyme Funktion ist auch eine Funktion. Der Nachteil ist, dass das Aufrufen der Funktion etwas umständlicher ist.
Heiko Oberdiek

Richtig, aber das liegt am Anrufer. Es gibt Einträge in anderen Sprachen, die anonyme Subs definieren, also denke ich, dass Sie sicher sind =)
skibrianski

Und Sie können weitere 2 Zeichen speichern, indem Sie pop () anstelle von shift () verwenden, da es nur ein Argument gibt.
Skibrianski

@skibrianski: Richtig, danke.
Heiko Oberdiek

4

JavaScript - 32 Zeichen

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

Angenommen, eine Variable xexistiert und erstellt ein Array avon Quadraten für Werte 1..x.

ECMAScript 6 - 27 Zeichen

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

Durch Aufrufen f(x)wird das Array bmit den Quadraten für Werte gefüllt 0..x.


Ich muss fragen ... das i+++iam Ende ...?
WallyWest

2
k+=i+++iist das gleiche wie k += i + (++i)das gleiche wie k+=i+i+1gefolgt voni=i+1
MT0

Oh, das ist Genie ... Ich muss das bei Bedarf in meinem nächsten Codegolf implementieren! :)
WallyWest

Sie können ein Zeichen speichern, indem Sie die Funktionsdeklaration in das Array verschieben (z b=[f=i=>b[i]=i&&i+--i+f(i)]. B. ).
Zahnbürste

Danke - hat auch ein Zeichen in der obersten Antwort gespeichert, indem Dinge verschoben wurden, um ein Semikolon zu entfernen.
MT0

4

Julia - 33

Jede quadratische Zahl kann durch Summieren ungerader Zahlen geschrieben werden:

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

Hallo und willkommen bei CG.se! Schöne, prägnante Antwort. Ich habe noch nie von Julia gehört, aber es sieht faszinierend aus.
Jonathan Van Matre

Ist "2x" nicht eine Multiplikation in Julia? Sie könnten stattdessen x + x sagen, was Sie nur ein Byte kostet.
Glenn Randers-Pehrson

Sie haben Recht (nicht bemerkt), bearbeitet.
CCP

Ich bin (noch) nicht mit Julia vertraut, habe es aber im Online-Handbuch unter docs.julialang.org/en/release-0.2 nachgeschlagen und festgestellt, dass "Numerische Literalkoeffizienten : Um allgemeine numerische Formeln und Ausdrücke klarer zu machen, erlaubt Julia Variablen unmittelbar vor einem numerischen Literal, das eine Multiplikation impliziert. " Also ja, 2x ist eine Multiplikation.
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;}  

Mein erster Versuch im Code-Golf

Dieser Code wird auf der Grundlage
eines 2 = xn - 1
wobei n ist Zählung Begriff und a ist n - ten Term in der Serie nach
1, 3, 5, 9, 11, 13, .....
Summe der ersten 2 Begriffe = 2 kariert

Summe der ersten 3 Terme = 3 im Quadrat
und so weiter ...


2
Ich denke, Sie können die geschweiften Klammern {}nach der forSchleife entfernen , da es nur eine Anweisung gibt. Dies kann Ihre
Zeichenzahl

1
Wenn Sie Arrays mit nicht konstanter Größe in einer anderen Funktion als main () deklarieren, ist dies akzeptabel
Mukul Kumar

1
Dieser Code hat ein undefiniertes Verhalten.
Kerrek SB

1
und gibt den Zeiger auf Daten auf dem Stapel zurück, die während der Rückgabe zerstört wurden.
VX

1
@ MukulKumar addition, subtraction, ich benutze nur diese
mniip

2

DCPU-16-Baugruppe (90 Byte)

Ich habe das in Montage für einen fiktiven Prozessor geschrieben, denn warum nicht?

: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

Es wird erwartet, dass sich die Nummer im X-Register befindet, und es wird erwartet, dass andere Register 0 sind. Die Ergebnisse werden auf den Stapel übertragen. Aufgrund der 16-Bit-Architektur wird er unterbrochen, sobald er 65535 erreicht. Möglicherweise möchten Sie SUB PC, 1am Ende ein hinzufügen , um es zu testen. Kompiliert sollte das Programm 20 Bytes (10 Wörter) umfassen.


2

Haskell

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

Dies erfindet im Grunde die Multiplikation, verwendet sie selbst und ordnet sie allen Zahlen zu. f 10= [0,1,4,9,16,25,36,49,64,81]. Also 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].


Können Sie die Demo auf etwas größer als 10 erweitern?
Glenn Randers-Pehrson

2

Haskell, 34/23

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

oder wenn die Importe in Ordnung sind:

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

Ausgabe:

λ> 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) kehrt zurück :
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144]


Groß! In EcmaScript 6 : f=(n,a)=>a[n]=n?f(n-1,a)+n+n-1:0.
Zahnbürste

1
Ich kann es kaum erwarten, dass ECMAScript 6 wirklich in den Mainstream kommt. Das wäre die perfekte Ausrede, um es zu lernen.
Isiah Meadows

1
Der Pfeilfunktionsteil der ECMAScript 6-Spezifikation ist seit Version 22 in FireFox.
MT0

1

Smalltalk, 52

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

Gibt ein neues Array zurück (dh es wird kein vorhandenes gefüllt oder zu einem vorhandenen hinzugefügt).

Anruf:

f-Wert: 10

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


1

Python - 39

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

Durch einen 5beliebigen Wert ersetzen . Irgendwelche Vorschläge?


1

Bash - 92 85 62 61 59 57

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

Ergebnis:

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

Bearbeiten: Ich habe die innere Schleife durch den Algorithmus aus der Haskell-Lösung von @ mniip ersetzt.


1

Gleiche Methode wie oben, in APL und J:

APL: F←{+\1+V+V←¯1+⍳⍵}(17 Zeichen) funktioniert mit den meisten APL-Varianten (versuchen Sie es hier )

und noch weniger (nur 14 Zeichen) mit NGN APL: F←{+\1+V+V←⍳⍵}(siehe hier )

J: f=:+/\@(>:@+:@:i.)(18 Zeichen)

edit: bessere Lösung in APL: F←{+\¯1+V+V←⍳⍵}(15 Zeichen)


1

C # (82)

int[] s(int n){int i,p=0;var r=new int[n];while(i<n){p+=i+i+1;r[i++]=p;}return r;}

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

Beim Aufruf von einer anderen Methode derselben Klasse wird das Array - [1,4,9,16,25,36...]bis zum lElement zurückgegeben.


Haben Sie versucht, die Leerzeichen zwischen int[]und zu entfernen sq? Ich kenne C # nicht, aber ich denke, es sollte funktionieren.
Benutzer12205

Nein, das wird nicht funktionieren. First int [] ist der Rückgabetyp der Methode "sq". Ich kann den Methodennamen auf "s" reduzieren :)
Rajesh

Ich meine int[]sqanstelle von int[] sqund int[]resanstelle von int[] res. Dies hilft Ihnen, zwei Zeichen zu speichern, und ich habe damit keine Kompilierungsfehler erhalten. Außerdem sollten Sie für sqund reswie vorgeschlagen Einzelzeichen- IDs verwenden.
user12205

Anscheinend stimmt etwas mit Ihrer Antwort nicht
Benutzer12205

Einrückungscode mit 4 Leerzeichen, um ihn in einen Codeblock mit Monospace-Schriftart einzufügen.
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

Bearbeiten: Die innere Schleife wurde entfernt und stattdessen der Haskell-Algorithmus von @ mniip verwendet.

Bearbeiten: Verifiziert, dass das Unterprogramm und der Treiber Fortran II und IV gültig sind

Treiber:

  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

Ergebnis:

$ 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, danke, ich habe meine innere Schleife durch deinen Code ersetzt.
Glenn Randers-Pehrson

1

Python - 51

Hier definiere ich eine Funktion, wie sie von den Regeln verlangt wird.

Verwendung sumvon ungeraden Zahlen:

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

Dies verwendet nur sum(ein integriertes Element, das das Hinzufügen ausführt) und range(ein integriertes Element, das Arrays mithilfe des Hinzufügens erstellt). Wenn Sie dagegen sind sum, können wir dies tun mit 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 Bytes

Hierfür muss natürlich die Option "Short Tags" aktiviert sein (um 3 Bytes beim Start zu sparen).

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

Ausgabe:

1 4 9 16 25 36 49 64 81 100 

1

Weiter - 48 Bytes

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

Verwendung:

7 f

Ausgabe:

0 1 4 9 16 25 36 49
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.