Calcule todos los cuadrados hasta x usando solo sumas y restas


11

El objetivo es calcular todos los cuadrados hasta xcon suma y resta.

Reglas:

  1. El código debe ser una función que tome el número total de cuadrados para generar y devuelva una matriz que contenga todos esos cuadrados.
  2. Puede no utilizar cadenas, estructuras, multiplicación, división, o funciones integradas para calcular cuadrados.
  3. Solo puede usar matrices, enteros (números enteros), suma, resta. ¡No se permiten otros operadores!

Esta es una pregunta de , por lo que gana el código más corto en bytes.


Este es esencialmente el algoritmo más optimizado para incrementar cuadrados , o, al menos, obtendrá respuestas prácticamente idénticas.
— Peter Taylor

2
@PeterTaylor No, no es lo mismo, ya que es el algoritmo más optimizado para incrementar cuadrados, pero mi pregunta solo requiere sumas y restas.
— Cepillo de dientes

Que es lo mismo. Como testigo: la presente respuesta a esta pregunta hace exactamente lo mismo que la gran mayoría de las respuestas a la pregunta anterior.
— Peter Taylor

@ PeterTaylor Podría ser parcial, pero realmente no creo que sea lo mismo.
— Cepillo de dientes

3
Es posible que esta pregunta ya tenga respuestas en otros lugares, pero eso no hace que la pregunta sea un duplicado de la otra pregunta.
— Blacklight Shining

Respuestas:



6

C, 55 52 bytes

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

simplemente suma números impares

  • n: número de cuadrados para calcular
  • r: matriz de salida para almacenar los resultados
  • j: toma los valores sucesivos 1, 3, 5, 7, ...
  • i: se incrementa jen cada iteración

Editar

Se pueden guardar 4 caracteres utilizando la declaración int implícita (> C99), pero esto cuesta 1 carácter porque los forinicializadores no pueden contener una declaración en> C99. Entonces el código se convierte

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

Uso

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

Salida

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

1
esa lógica es excelente! te mereces +1
— Mukul Kumar

5

GolfScript, 17 caracteres

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

Uso (ver también ejemplos en línea ):

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

Nota: * es un bucle y no el operador de multiplicación.


OKAY; ¿como funciona?
— Cepillo de dientes

@toothbrush ,toma la entrada y la convierte a la matriz [0 1 ... n-1]. Luego *inyecta el bloque de código dado en la matriz. Este bloque primero duplica el elemento actual ( .+) resta uno ( () y luego agrega el resultado anterior 1$+(en otras palabras, suma 2j-1al número cuadrado anterior). []encierra todo para devolver una nueva matriz.
— Howard

¡Excelente! No conozco GolfScript, así que me preguntaba cómo funcionaba.
— Cepillo de dientes

5

Lote de Windows, 115 bytes

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

Esto debe colocarse en un archivo por lotes en lugar de ejecutarse desde cmd, y genera la lista en la consola. Se necesita el número de cuadrados para crear desde el primer argumento de línea de comandos. &Sin embargo, en su mayor parte utiliza en lugar de líneas nuevas, todavía se necesita una y cuenta como dos bytes.

Necesita expansión variable retardada habilitada, esto se puede hacer con cmd /v:on. Asumiendo que no es así, setlocal enabledelayedexpansion&se necesitaba un extra al inicio (sin él, el script tiene 83 bytes).


4

Haskell - 30

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

Esto usa el hecho de que (n+1)^2=n^2+2n+1


4

Perl, 27 bytes

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

Matemáticas:

Matemáticas

Script para llamar a la función para imprimir 10 cuadrados:

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

Resultado:

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

Ediciones:


No veo ninguna razón por la que necesites nombrar a tu sub. IOW "sub {map {$ a + = $ _ + $ _- 1} 1..shift}" me parece legítimo y te ahorra dos caracteres.
— skibrianski

@skibrianski: una función anónima también es una función. La desventaja es que llamar a la función es un poco más engorroso.
— Heiko Oberdiek

Correcto, pero eso está en la persona que llama. Hay entradas en otros idiomas que definen subs anónimos, así que creo que estás seguro =)
— skibrianski

Y puede guardar otros 2 caracteres utilizando pop () en lugar de shift () ya que solo hay un argumento.
— skibrianski

@skibrianski: Correcto, gracias.
— Heiko Oberdiek

4

JavaScript: 32 caracteres

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

Asume que xexiste una variable y crea una matriz ade cuadrados para los valores 1..x.

ECMAScript 6 - 27 caracteres

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

Las llamadas f(x)llenarán la matriz bcon los cuadrados para los valores 0..x.


Tengo que preguntar ... ¿ i+++ial final ...?
— WallyWest

2
k+=i+++ies lo mismo k += i + (++i)que lo k+=i+i+1seguido pori=i+1
— MT0

Oh, eso es genial ... ¡Tengo que implementar eso en mi próximo codegolf si es necesario! :)
— WallyWest

Puede guardar un carácter moviendo la declaración de la función al interior de la matriz (p b=[f=i=>b[i]=i&&i+--i+f(i)]. Ej .).
— Cepillo de dientes

Gracias: también salvó un personaje en la respuesta superior moviendo las cosas para eliminar un punto y coma.
— MT0

4

Julia - 33

Cualquier número cuadrado se puede escribir mediante una suma de números impares:

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

Hola, y bienvenidos a CG.se! Buena respuesta sucinta. Nunca oí hablar de Julia, pero parece intrigante.
— Jonathan Van Matre

¿No es "2x" una multiplicación en Julia? En su lugar, podría decir x + x, lo que le costará solo un byte.
— Glenn Randers-Pehrson

Tienes razón (no lo noté), editado.
— PCCh

No estoy familiarizado (todavía) con julia, pero lo busqué en el manual en línea en docs.julialang.org/en/release-0.2 y encontré "Coeficientes literales numéricos: para aclarar fórmulas y expresiones numéricas comunes, Julia permite variables ser precedido inmediatamente por un literal numérico, lo que implica multiplicación ". Entonces sí, 2x es una multiplicación.
— 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;}  

mi primer intento en code-golf

este código se basa en
un xn = 2 - 1
, donde n es el recuento plazo y una es n º plazo en la siguiente serie
1, 3, 5, 9, 11, 13, .....
suma de 2 primeros términos = 2 al cuadrado

suma de los primeros 3 términos = 3 al cuadrado
y así sucesivamente ...


2
Creo que puedes quitar las llaves {}después del forciclo, ya que solo hay una declaración. Esto puede reducir el recuento de carbón por 2
— user12205

1
Si declara matrices de tamaño no constante en alguna función que no sea main (), entonces es aceptable
— Mukul Kumar

1
Este código tiene un comportamiento indefinido.
— Kerrek SB

1
y devuelve el puntero a los datos en la pila destruida durante la devolución.
— VX

1
@MukulKumar addition, subtraction, solo estoy usando esos
— mniip

2

Conjunto DCPU-16 (90 bytes)

Escribí esto en ensamblado para un procesador ficticio, porque ¿por qué no?

: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

Se espera que el número esté en el registro X, y se espera que otros registros sean 0. Los resultados se envían a la pila, se romperá una vez que llegue a 65535 debido a la arquitectura de 16 bits. Es posible que desee agregar un SUB PC, 1al final para probarlo. Compilado, el programa debe tener 20 bytes (10 palabras).


2

Haskell

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

Básicamente, esto inventa la multiplicación, la usa y la mapea sobre todos los números. f 10= [0,1,4,9,16,25,36,49,64,81]. También 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].


¿Puedes extender la demo a un poco más de 10?
— Glenn Randers-Pehrson

2

Haskell, 34/23

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

o, si las importaciones están bien:

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

Salida:

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


¡Excelente! En EcmaScript 6: f=(n,a)=>a[n]=n?f(n-1,a)+n+n-1:0.
— Cepillo de dientes

1
Realmente no puedo esperar a que ECMAScript 6 entre realmente en el uso convencional. Esa sería la excusa perfecta para aprenderlo.
— Isiah Meadows

1
La parte de la función de flecha de la especificación ECMAScript 6 ha estado en Firefox desde la versión 22.
— MT0

1

Smalltalk, 52

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

Devuelve una nueva matriz (es decir, no se llena o agrega a una existente).

llamada:

valor f: 10

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


1

pitón - 39

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

Reemplazar 5con cualquier valor. ¿Alguna sugerencia?


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

Resultado:

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

Editar: Reemplacé el bucle interno con el algoritmo de la solución Haskell de @ mniip.


1

Mismo método que el anterior, en APL y J:

APL: F←{+\1+V+V←¯1+⍳⍵}(17 caracteres) funciona con la mayoría de las variantes de APL (pruébelo aquí )

e incluso menos (solo 14 caracteres) con NGN APL: F←{+\1+V+V←⍳⍵}(ver aquí )

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

editar: mejor solución en APL: F←{+\¯1+V+V←⍳⍵}(15 caracteres)


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

Cuando se llama desde otro método de la misma clase, devolverá la matriz - [1,4,9,16,25,36...], hasta el lelemento th.


¿Intentaste eliminar los espacios entre int[]y sq? No sé C #, pero creo que debería funcionar.
— user12205

No, eso no funcionará. Primero int [] es el tipo de retorno del método "sq". Puedo reducir el nombre del método a solo "s" :)
— Rajesh

Me refiero a usar en int[]sqlugar de int[] sqy en int[]reslugar de int[] res. Esto te ayuda a guardar dos caracteres, y no obtuve ningún error de compilación con eso. También debe usar identificadores de un solo carácter para sqy rescomo sugirió.
— usuario12205

parece que hay algo mal con tu respuesta
— user12205

Sangría el código con 4 espacios para ponerlo en un bloque de código con fuente monoespacial.
— 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

Editar: eliminó el bucle interno y usó el algoritmo Haskell de @mniip en su lugar.

Editar: Verificado que la subrutina y el controlador son válidos Fortran II y IV

Conductor:

  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

Resultado:

$ 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, gracias, reemplacé mi bucle interno con su código.
— Glenn Randers-Pehrson

1

Python - 51

Aquí estoy definiendo una función según lo solicitado por las reglas.

Uso sumde números impares:

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

Esto solo usa sum(un builtin que realiza la suma) y range(un builtin que crea matrices usando la suma). Si se opone sum, podemos hacer esto con 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

Esto debe tener habilitada la opción "etiquetas cortas", por supuesto (para eliminar 3 bytes al inicio).

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

Salida:

1 4 9 16 25 36 49 64 81 100 

1

Adelante - 48 bytes

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

Uso:

7 f

Salida:

0 1 4 9 16 25 36 49
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.