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.