Calculez tous les carrés jusqu'à x en utilisant uniquement l'addition et la soustraction


11

Le but est de calculer tous les carrés jusqu'à l' xaddition et la soustraction.

Règles:

  1. Le code doit être une fonction qui prend le nombre total de carrés à générer et renvoie un tableau contenant tous ces carrés.
  2. Vous ne pouvez pas utiliser de chaînes, de structures, de multiplication, de division ou de fonctions intégrées pour calculer des carrés.
  3. Vous ne pouvez utiliser que des tableaux, des entiers (nombres entiers), l'addition, la soustraction. Aucun autre opérateur autorisé!

C'est une question de , donc le code le plus court en octets gagne!


Il s'agit essentiellement de l' algorithme le plus optimisé pour l'incrémentation des carrés - ou, au moins, obtiendra des réponses à peu près identiques.
Peter Taylor

2
@PeterTaylor Non, ce n'est pas la même chose, car c'est l'algorithme le plus optimisé pour l'incrémentation des carrés, mais ma question ne demande que l'addition et la soustraction.
Brosse à dents

C'est la même chose. En tant que témoin: la réponse actuelle à cette question fait exactement la même chose que la grande majorité des réponses à la question précédente.
Peter Taylor

@PeterTaylor Je suis peut-être partiale, mais je ne pense vraiment pas que ce soit la même chose.
Brosse à dents

3
Cette question peut déjà avoir des réponses ailleurs, mais cela ne fait pas de la question un double de l'autre question.
Blacklight Shining

Réponses:



6

C, 55 52 octets

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

résume simplement les nombres impairs

  • n: nombre de carrés à calculer
  • r: tableau de sortie pour stocker les résultats
  • j: prend les valeurs successives 1, 3, 5, 7, ...
  • i: est incrémenté de jà chaque itération

Éditer

4 caractères peuvent être enregistrés à l'aide de la déclaration implicite int (> C99), mais cela coûte 1 caractère car les forinitialiseurs ne peuvent pas contenir de déclaration dans> C99. Ensuite, le code devient

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

Usage

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

Production

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

1
cette logique est excellente! vous méritez +1
Mukul Kumar

5

GolfScript, 17 caractères

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

Utilisation (voir aussi des exemples en ligne ):

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

Remarque: * est une boucle et non l'opérateur de multiplication.


D'ACCORD; Comment ça marche?
Brosse à dents

@toothbrush ,prend l'entrée et la convertit en tableau [0 1 ... n-1]. *Injecte ensuite le bloc de code donné dans le tableau. Ce bloc double d'abord l'élément actuel ( .+) soustrait un ( () puis ajoute le résultat précédent 1$+(en d'autres termes, ajouter 2j-1au numéro de carré précédent). []renferme tout afin de retourner un nouveau tableau.
Howard

Génial! Je ne connais pas GolfScript, alors je me suis demandé comment cela fonctionnait.
Brosse à dents

5

Windows Batch, 115 octets

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

Celui-ci doit être placé dans un fichier de commandes au lieu d'être exécuté à partir de cmd, et il génère la liste sur la console. Il faut le nombre de carrés à créer à partir du premier argument de ligne de commande. Pour la plupart, il utilise &au lieu de sauts de ligne, un est cependant nécessaire et il compte pour deux octets.

Il a besoin d'une extension variable retardée activée, cela peut être fait avec cmd /v:on. En supposant que ce n'est pas le cas, un supplément setlocal enabledelayedexpansion&était nécessaire au début (sans lui, le script fait 83 octets).


4

Haskell - 30

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

Cela utilise le fait que (n+1)^2=n^2+2n+1


4

Perl, 27 octets

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

Math:

Math

Script pour appeler la fonction pour imprimer 10 carrés:

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

Résultat:

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

Modifications:


Je ne vois aucune raison pour laquelle vous devez nommer votre sous-marin. IOW "sub {map {$ a + = $ _ + $ _- 1} 1..shift}" me semble légitime et vous enregistre deux caractères.
skibrianski

@skibrianski: Une fonction anonyme est aussi une fonction. L'inconvénient est que l'appel de la fonction est un peu plus lourd.
Heiko Oberdiek

D'accord, mais c'est sur l'appelant. Il y a des entrées dans d'autres langues qui définissent les sous-marins anonymes, donc je pense que vous êtes en sécurité =)
skibrianski

Et vous pouvez enregistrer 2 autres caractères en utilisant pop () au lieu de shift () car il n'y a qu'un seul argument.
skibrianski

@skibrianski: D'accord, merci.
Heiko Oberdiek

4

JavaScript - 32 caractères

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

Suppose qu'une variable xexiste et crée un tableau ade carrés pour les valeurs 1..x.

ECMAScript 6 - 27 caractères

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

L'appel f(x)remplira le tableau bavec les carrés pour les valeurs 0..x.


Je dois demander ... i+++ila fin ...?
WallyWest

2
k+=i+++iest le même que celui k += i + (++i)qui est k+=i+i+1suivi pari=i+1
MT0

Oh c'est du génie ... Je dois implémenter cela dans mon prochain codegolf si nécessaire! :)
WallyWest

Vous pouvez enregistrer un caractère en déplaçant la déclaration de fonction à l'intérieur du tableau (par exemple b=[f=i=>b[i]=i&&i+--i+f(i)]).
Brosse à dents du

Merci - a également sauvé un caractère sur la première réponse en déplaçant les choses pour supprimer un point-virgule.
MT0

4

Julia - 33

Tout nombre carré peut être écrit par une somme de nombres impairs:

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

Bonjour et bienvenue sur CG.se! Belle réponse succincte. Jamais entendu parler de Julia, mais ça a l'air intrigant.
Jonathan Van Matre

"2x" n'est-il pas une multiplication chez Julia? Vous pourriez dire x + x à la place, ce qui ne vous coûtera qu'un octet.
Glenn Randers-Pehrson

Vous avez raison (n'a pas remarqué), édité.
CCP

Je ne connais pas (encore) julia, mais je l'ai consultée dans le manuel en ligne sur docs.julialang.org/en/release-0.2 et j'ai trouvé "Coefficients littéraux numériques: pour rendre les formules et expressions numériques courantes plus claires, Julia autorise les variables être immédiatement précédé d'un littéral numérique, ce qui implique une multiplication. " Alors oui, 2x est une multiplication.
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;}  

mon premier essai en code-golf

ce code est basé sur
a = 2 xn - 1
n est le nombre de termes et a est le n ème terme des séries suivantes
1, 3, 5, 9, 11, 13, .....
somme des 2 premiers termes = 2 au carré

somme des 3 premiers termes = 3 au carré
et ainsi de suite ...


2
Je pense que vous pouvez supprimer les accolades {}après la forboucle, car il n'y a qu'une seule déclaration. Cela peut réduire votre nombre de caractères de 2
user12205

1
Si vous déclarez des tableaux de taille non constante dans une fonction autre que main (), alors c'est acceptable
Mukul Kumar

1
Ce code a un comportement indéfini.
Kerrek SB

1
et renvoie le pointeur sur les données de la pile détruites lors du retour.
VX

1
@MukulKumar addition, subtraction, je n'utilise que ceux
mniip

2

Assemblage DCPU-16 (90 octets)

J'ai écrit cela en assembleur pour un processeur fictif, car pourquoi pas?

: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

Le nombre devrait être dans le registre X, et les autres registres devraient être 0. Les résultats sont poussés vers la pile, il se cassera une fois qu'il atteindra 65535 en raison de l'architecture 16 bits. Vous voudrez peut-être ajouter un SUB PC, 1à la fin pour le tester. Compilé, le programme devrait être de 20 octets (10 mots).


2

Haskell

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

Cela invente essentiellement la multiplication, l'utilise elle-même et la mappe sur tous les nombres. f 10= [0,1,4,9,16,25,36,49,64,81]. Aussi 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].


Pouvez-vous étendre la démo à un peu plus de 10?
Glenn Randers-Pehrson

2

Haskell, 34/23

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

ou, si les importations sont acceptables:

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

Production:

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


Génial! Dans EcmaScript 6: f=(n,a)=>a[n]=n?f(n-1,a)+n+n-1:0.
Brosse à dents

1
Je ne peux vraiment pas attendre ECMAScript 6 pour vraiment entrer dans l'utilisation grand public. Ce serait l'excuse parfaite pour l'apprendre.
Isiah Meadows

1
La partie fonction flèche de la spécification ECMAScript 6 est dans FireFox depuis la version 22.
MT0

1

Smalltalk, 52

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

Renvoie un nouveau tableau (c'est-à-dire qu'il ne remplit pas ou n'en ajoute pas un existant).

appel:

valeur f: 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)

Remplacez 5par n'importe quelle valeur. Aucune suggestion?


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

Résultat:

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

Edit: j'ai remplacé la boucle interne par l'algorithme de la solution Haskell de @ mniip.


1

Même méthode que ci-dessus, en APL et J:

APL: F←{+\1+V+V←¯1+⍳⍵}(17 caractères) fonctionne avec la plupart des variantes APL (essayez-le ici )

et encore moins (seulement 14 caractères) avec NGN APL: F←{+\1+V+V←⍳⍵}(voir ici )

J: f=:+/\@(>:@+:@:i.)(18 caractères)

Éditer: meilleure solution en APL: F←{+\¯1+V+V←⍳⍵}(15 caractères)


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

Lorsqu'il est appelé à partir d'une autre méthode de la même classe, retourne le tableau - [1,4,9,16,25,36...], jusqu'au lth élément.


avez-vous essayé de supprimer les espaces entre int[]et sq? Je ne connais pas C #, mais je pense que cela devrait fonctionner.
user12205

Non, ça ne marchera pas. Le premier int [] est le type de retour de la méthode "sq". Je peux réduire le nom de la méthode à peut-être juste "s" :)
Rajesh

Je veux dire à la int[]sqplace de int[] sqet int[]resau lieu de int[] res. Cela vous aide à enregistrer deux caractères, et je n'ai eu aucune erreur de compilation avec cela. Vous devez également utiliser des identificateurs à caractère unique pour sqet rescomme vous l'avez suggéré.
user12205

semble qu'il y a un problème avec votre réponse
user12205

Indentez le code avec 4 espaces pour le mettre dans un bloc de code avec une police 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

Edit: suppression de la boucle interne et utilisation de l'algorithme Haskell de @ mniip à la place.

Edit: vérifié que le sous-programme et le pilote sont valides Fortran II et IV

Chauffeur:

  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

Résultat:

$ 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, merci, j'ai remplacé ma boucle intérieure par votre code.
Glenn Randers-Pehrson

1

Python - 51

Ici, je définis une fonction comme demandé par les règles.

Utilisation sumde nombres impairs:

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

Cela n'utilise que sum(une fonction intégrée qui effectue l'addition) et range(une fonction intégrée qui crée des tableaux en utilisant l'addition). Si vous vous y opposez sum, nous pouvons le faire avec 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 octets

Cela doit avoir l'option "balises courtes" activée, bien sûr (pour raser 3 octets au début).

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

Production:

1 4 9 16 25 36 49 64 81 100 

1

Quatrième - 48 octets

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

Usage:

7 f

Production:

0 1 4 9 16 25 36 49
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.