Salida de un trapecio mágico 8


41

Su tarea es generar un trapecio mágico 8:

        1 × 8 + 1 = 9
       12 × 8 + 2 = 98
      123 × 8 + 3 = 987
     1234 × 8 + 4 = 9876
    12345 × 8 + 5 = 98765
   123456 × 8 + 6 = 987654
  1234567 × 8 + 7 = 9876543
 12345678 × 8 + 8 = 98765432
123456789 × 8 + 9 = 987654321
  • Salida en el idioma elegido en la menor cantidad de bytes posible.
  • Tenga en cuenta la cantidad de espacios al comienzo de cada línea para mantener la forma del trapecio.
  • Se permiten espacios finales.
  • Puede usar ×la letra x, la que prefiera.

1
Relacionado. (ligeramente ...)
Martin Ender

Se requieren espacios intermedios, ¿sí?
Value Ink

@ KevinLau-notKenny lo es, pero siempre puedes publicar una alternativa si es significativa.
rybo111

Son 6 bytes correspondientes a los 6 espacios en el medio, así que no, no creo que sea lo suficientemente significativo.
Value Ink

Respuestas:


15

Python 2, 59 bytes

a=i=1
exec"print'%9d x 8 +'%a,i,'=',a*8+i;i+=1;a=a*10+i;"*9

Los números ay ila ecuación a * 8 + ise generan aritméticamente. Cada línea, ise incrementa y atiene el siguiente dígito agregado a través de a=a*10+i. Por ejemplo, si a=12345, i=5, entonces se iconvierte 6, entonces lo nuevo aes 12345*10 + 6cuál es 123456.

Almacenarlos como números en lugar de cadenas nos permite calcular el RHS tal como lo indica la ecuación a*8+i, que es más corta que la inversión de cadenas.


+1 por ver esto por lo que es - una suma que se puede generar
rybo111

7

V , 37 bytes

i¸ 1 X 8 + 1 = 98ñYp|Eylp^Xf+$ylp

Pruébalo en línea!

Esto contiene no imprimible, así que aquí hay un hexdump:

00000000: 69c2 b820 3120 5820 3820 2b20 3120 3d20  i.. 1 X 8 + 1 = 
00000010: 391b 38c3 b159 707c 4579 6c70 015e 5866  9.8..Yp|Eylp.^Xf
00000020: 2b01 2479 6c70 18                        +.$ylp.


5

PHP, 105 89 60 57 bytes

mi primer intento de golf aquí (gracias a manatwork & user55641)

for(;$i++<9;)printf("%9s x 8 + $i = %s
",$s.=$i,$s*8+$i);

59

for(;$i++<9;)printf("%9s x 8 + $i = %s
",$s.=$i,$t.=10-$i);

89 (mi propio intento)

for(;@++$i<=9;){printf("%9s x 8 + %s = %s\n",join(range(1,$i)),$i,join(range(9,10-$i)));}

105 (primero)

for($j='123456789';@$j[$i++];){printf("%9s x 8 + %s = %s\n",substr($j,0,$i),$i,strrev(substr($j,-$i)));}

1
No hay necesidad de llaves entre una sola declaración. Solo $ i mejor se interpola directamente en la cadena sin especificador de formato.
manatwork

1
Puede soltar 23 bytes más con algunos trucos: Cambiar @ ++ $ i <= 9 a $ i ++ <9 ahorra 2 bytes. No es necesario silenciar los avisos, ya que no detienen la ejecución y, bajo las reglas estándar de PPCG, puede ignorar stderr si lo desea. Cambiar el \ n a un carácter de nueva línea real guarda un byte. Cambiar los bits de unión (rango (...)) a $ s. = $ I y $ t. = 10- $ i ahorra 15 bytes. Esto funciona porque las tareas devuelven el valor asignado y es prácticamente el truco más valioso que he encontrado para jugar al golf php. Los últimos 5 bytes están detallados por manatwork arriba
user55641

1
Puede soltar 2 bytes más reemplazándolos $t.=10-$icon $s*8+$i. tio.run/##K8go@G9jXwAk0/…
640KB

1
Eso es 59 bytes. Y en $s*8+$ilugar de $t.=10-$iguardar dos más.
Titus

5

Pyth, 32 bytes

VS9ss[*dK-9NSN" x 8 + "N" = "r9K

Pruébalo en línea!

VS9ss[*dK-9NSN" x 8 + "N" = "r9K
VS9                                  # For N in 1..9
   s                                 # Join without delimiter
    s[                               # Reduce the array on + (flattens)
      *dK-9N                         # - Space, repeated K=(9-N) times
            SN                       # - The string sequence 1..N
              " x 8 + "              # - This string literal
                       N             # - N itself
                        " = "        # - This string literal
                             r9K     # - The string sequence 9..K

Gracias a @FryAmTheEggman por guardar 2 bytes. Gracias a @KennyLau por guardar 3 bytes.


sno se une con el espacio, se une sin delimitador.
isaacg

@isaacg hah, y ahora estoy pensando que podría salvar un byte uniéndome al espacio
Ven

El recuento de bytes sería el mismo .
Leaky Nun

4

CJam, 39 38 36 bytes

Gracias a Optimizer por guardar 2 bytes.

9{)_,:)9Se[" x 8 + "@S'=S9_,fm4$<N}/

Pruébalo aquí.

Mismo recuento de bytes:

9{)_,:)9Se[]"x8+"+:\'=9_,f-Y$<]S*n}/

Esto requiere la última versión, disponible en ¡ Pruébelo en línea!


99
¡@Optimizer estuvo a la altura de su nombre, entonces!
rybo111

4

Python 2, 87 84 78 75 bytes

s="123456789"
n=1
exec'print"%9s"%s[:n],"x 8 + %s ="%n,s[::-1][:n];n+=1;'*9

Pruébalo en línea

Una versión anterior usa algo de magia de cuerdas.

R=range(1,10)
for n in R:print" "*(9-n)+`R`[1:n*3:3]+" x 8 + %d = "%n+`R`[-2:27-3*n:-3]

Lanzar range(1,10)a una cadena da [1, 2, 3, 4, 5, 6, 7, 8, 9], y esto es bueno ya que cada número es solo un dígito. Entonces obtener la cadena 123456789de esto es simple con `range(1,10)`[1::3]. El rango inverso es `range(1,10)`[-2::-3]. Luego, para llegar tan lejos como quiera cada iteración, lo corto en cualquiera de los dos dígitos 3*n, o en 3*(9-n)( 27-3*n).


Puedes hacerlo for n in range(1,10):print"%9s"%s[:n]+" x 8 + %s = "%n+s[::-1][:n]por 80 bytes.
TheBikingViking

s="123456789";n=1;exec'print"%9s"%s[:n],"x 8 + %s ="%n,s[::-1][:n];n+=1;'*9ahorra tres más! Hasta 75.
Lynn

Bien, gracias por la ayuda! Lástima que tuve que cortar dos veces la segunda vez ...
mbomb007

4

Perl, 49 bytes

printf"%9s x 8 + $_ = %s
",$@.=$_,$_+8*$@for 1..9

Uso

perl -e 'printf"%9s x 8 + $_ = %s
",$@.=$_,$_+8*$@for 1..9'

4

Ruby, 77 73 65 60 bytes

Pruébalo en línea ~

Renovaciones importantes de @manatwork

Otra revisión de @xsot

a=i=0;9.times{puts"%9d x 8 + %d = %d"%[a=a*10+i+=1,i,a*8+i]}

Parece ser más corto con cadena de formato: puts'%9d x 8 + %d = %d'%[k=[*1..i]*'',i,k.to_i*8+i].
manatwork

(1..9).map1.upto(9)
manatwork

Ah, no sabía acerca de %9dser una opción de formato para rellenar enteros como ese
Value Ink

60:a=i=0;9.times{puts"%9d x 8 + %d = %d"%[a=a*10+i+=1,i,a*8+i]}
xsot

@xsot eso es genial! No pensé en calcular el número inicial así.
Value Ink

4

Java 10, 151 133 130 129 126 110 bytes

v->{String p="\n",r="";for(int n=123456789,i=9;i>0;n/=10,p+=" ")r=p+n+" x 8 + "+i+" = "+(n*8+i--)+r;return r;}

Pruébalo en línea.

Explicación:

v->{                   // Method with empty unused parameter and String return-type
  String p="\n",       //  Prefix-String, starting at a newline
         r="";         //  Result-String, starting empty
  for(int n=123456789, //  Multiply-number, starting at 123456789
      i=9;i>0          //  Loop `i` in the range [9, 0):
      ;                //    After every iteration:
       n/=10,          //     Remove the last digit from the integer
       p+=" ")         //     Append a space after the prefix
    r=...+r;           //   Prepend the following to the result-String:
      p                //    The prefix-String
      +n               //    Followed by the integer
      +" x 8 + "       //    Followed by the literal String " x 8 + "
      +i               //    Followed by the loop-index `i`
      +" = "           //    Followed by the literal String " = "
      +(n*8+i--)       //    Followed by the result of that equation
  return r;}           //  Return the result-String

1
Creo que podría guardar bytes utilizando en xlugar del signo de multiplicación.
wizzwizz4

1
Puede guardar un par de bytes inicializando sa "\n"y la eliminación "\n"+del forbucle
cliffroot

@ wizzwizz4 Gracias. Debería haberlo sabido ×es de 2 bytes en lugar de 1 como x..
Kevin Cruijssen

¿No estás agregando sal resultado en cada iteración también?
cliffroot

Sé que esto es viejo, pero ¿no puedes hacerlo en return olugar de System.out.print(o)? Además, puede cambiar a Java 10 y guardar con vary lambdas
Encarnación de la ignorancia

3

C, 74 bytes

d(i,n){for(i=n=1;i<10;n=++i+n*10)printf("%9d x 8 + %d = %d\n",n,i,n*8+i);}

3

C #, 113 bytes

void f(){for(int n=1,i=1;i<10;n=10*n+ ++i)Console.WriteLine(new string(' ',9-i)+n+" x "+"8 + "+i+" = "+(n*8+i));}

Si de todos modos tiene que mejorar esta solución, no dude en compartirla.


Puede guardar 1 byte eliminando un espacio: ;n=10*n+ ++ien el bucle for puede cambiarse a ;n=++i+10*n. Además, +" x "+"8 + "+se puede cambiar a +" x 8 + "+. para guardar 3 bytes más.
Kevin Cruijssen

nulo f () {for (int n = 1, i = 1; i <10; n = ++ i + 10 * n) Console.WriteLine ($ "{new string ('', 9-i)} {n } x 8 + {i} = {(n * 8 + i)} ");} ------------ ¡te guardó un byte!
downrep_nation

3

Lote, 117 bytes

@echo off
set a=         12345678987654321
for /l %%i in (1,1,9)do call echo %%a:~%%i,9%% x 8 + %%i = %%a:~17,%%i%%

Sí, eso es 16% signos en una línea; eso es Batch para ti!


2

Haskell, 92 bytes

s=(show=<<)
[1..9]>>= \x->([x..8]>>" ")++s[1..x]++" x 8 + "++s[x]++" = "++s[9,8..10-x]++"\n"

Cómo funciona:

s=(show=<<)                   -- helper function that turns a list of numbers into
                              -- a string without delimiters, e.g. [1,2] -> "12"

[1..9]>>=                     -- for each number 1 to 9
     ([x..8]>>" ")            -- take length of [x..8] copies of a space
     s[1..x]                  -- the digits from 1 to x
     " x 8 + "                -- a string literal
     s[x]                     -- the digit of x
     " = "                    -- another string literal
     s[9,8..10-x]             -- the digits from 9 down to 10-x
     "\n"                     -- an a newline

2

Retina , 66 bytes

El recuento de bytes asume la codificación ISO 8859-1. El avance de línea principal es significativo.


123456789!9 = 987654321
+`^((.)+)\B.!.(.+).
 $1!$2$3¶$&
!
 x 8 + 

Pruébalo en línea!


2

Pyke, 30 29 bytes

9Fd*~utj+9<\x8\+9i-\=ji>_dJ)X

Pruébalo aquí!

9F                         )  -  for i in range(9):
  d*                          -       " " * i
        +                     -      ^ + V
       j                      -       j = V
    ~ut                       -        "123456789"
         9<                   -     ^[:9]
           \x8\+9i-\=         -    [^, "x", 8, "+", (9-i), "=", V]
                        _     -     reversed(V)
                     ji>      -      j[i:]
                         dJ   -   " ".join(^)
                            X - print(reversed(^))

2

PowerShell v2 +, 85 64 58 57 52 bytes

8..0|%{" "*$_+-join(1..++$i+" x 8 + $i = "+9..++$_)}

Bucles de 8 a 0 a 8..0|%{...}través del operador de rango. En cada iteración, generamos una concatenación de cadenas que consiste en (el número apropiado de espacios " "*$_), más una -joincadena ed de (un rango desde 1un número auxiliar pre-incrementado ++$i, más el bit medio " x 8 + $i = ", más el rango final desde 9el número actual $_pre -incrementado).

Un gran truco aquí es que aprovechamos la "preferencia a la izquierda" para la conversión de texto, que nos permite "agregar" matrices juntas dentro de los elementos -joinparentales, lo que significa que usamos un solo -joinoperador.

Ejemplo

PS C:\Tools\Scripts\golfing> .\magical-8-trapezium.ps1
        1 x 8 + 1 = 9
       12 x 8 + 2 = 98
      123 x 8 + 3 = 987
     1234 x 8 + 4 = 9876
    12345 x 8 + 5 = 98765
   123456 x 8 + 6 = 987654
  1234567 x 8 + 7 = 9876543
 12345678 x 8 + 8 = 98765432
123456789 x 8 + 9 = 987654321

44
%{¿Están bien tus ojos?
gcampbell

@gcampbell Si tus ojos se veían así, también estarías frunciendo el ceño.
AdmBorkBork

Depende de cómo su fuente representa porcentajes.
gcampbell


2

J, 51 bytes

(|."1|.\p),.' x 8 + ',"1]p,.' = ',"1]\|.p=:u:49+i.9

Crea la cadena 123456789y luego opera con prefijos y sufijos para crear la salida.

Uso

   (|."1|.\p),.' x 8 + ',"1]p,.' = ',"1]\|.p=:u:49+i.9
        1 x 8 + 1 = 9        
       12 x 8 + 2 = 98       
      123 x 8 + 3 = 987      
     1234 x 8 + 4 = 9876     
    12345 x 8 + 5 = 98765    
   123456 x 8 + 6 = 987654   
  1234567 x 8 + 7 = 9876543  
 12345678 x 8 + 8 = 98765432 
123456789 x 8 + 9 = 987654321

2

JavaScript ES6 (88)

Aprovechando el nuevo repeatmétodo, backticks y plantillas ...

i=10;for(y="";--i;)console.log(`${" ".repeat(i)+(y+=(x=10-i))} x 8 + ${x} = ${y*8+x}\n`)

Buen trabajo hermano, deberías considerar eliminar algo de espacio y usarlo en alertlugar de console.log, ¡puede ahorrar algunos bytes!
chau giang

Dado que respondí esto justo antes de la medianoche, me imagino que estaba casi medio dormido ... Publicaré una actualización sobre esto pronto. LOL
WallyWest

2

R, 107103 bytes

a=1;for(i in 2:10){cat(rep("",11-i),paste(a,"x",8,"+",(i-1),"=",strtoi(a)*8+(i-1)),"\n");a=paste0(a,i)}

Sin golf:

a=1

for(i in 2:10)
    cat(rep("",11-i),paste(a,"x",8,"+",(i-1),"=",strtoi(a)*8+(i-1)),"\n")
    a=paste0(a,i)

Resultado:

        1 x 8 + 1 = 9 
       12 x 8 + 2 = 98 
      123 x 8 + 3 = 987 
     1234 x 8 + 4 = 9876 
    12345 x 8 + 5 = 98765 
   123456 x 8 + 6 = 987654   
  1234567 x 8 + 7 = 9876543 
 12345678 x 8 + 8 = 98765432 
123456789 x 8 + 9 = 987654321


2

APL (Dyalog Unicode) , 61 52 39 bytes SBCS

↑(⍳9)((¯9↑↑),' x 8 +',⊣,'= ',↑∘⌽)¨⊂1↓⎕D

Pruébalo en línea!

-9 bytes usando el 10⊥truco para analizar el número, en lugar de una reducción. ¡Gracias a @ Adám por -13!

Explicación:

    ((¯9↑↑),' x 8 +',⊣,'= ',↑∘⌽)¨⊂1↓⎕D
                                     D   Numbers from 0 to 9
                                   1     Drop the 0
 (⍳9)(                          )¨⊂       Do 9 times, N=current
                             ↑∘⌽          Reverse the string (9..1) and cut off N elements
                                         N itself
      (   ↑)                              Drop N elements off the 1..9 string...
      9 )                              ...then pad it back with spaces
            ,' x 8 +', ,'= ',             Join with a few constant strings
                                         Format

1

JavaScript (ES6), 99 bytes

_=>[...Array(9)].map((n,i)=>`${n="        123456789".substr(i,9)} x 8 + ${++i} = ${n*8+i}`).join`\n`
_=>".........".replace(/./g,(n,i)=>`${n="        123456789".substr(i,9)} x 8 + ${++i) = ${n*8+i}\n`)

Donde \nrepresenta un carácter de nueva línea literal. La segunda versión genera una nueva línea final. Se me ocurrió una fórmula para los números, ('1'.repeat(9-i)+0+i)/9pero el relleno fue más fácil de hacer de esta manera.


1

Brainfuck , 232 bytes

++++++++[->+>+>+++++[->+>+>+>+>+>+++<<<<<<]>->>+>++>+++<<<<<<<<]>++>+>>>+++>>>---<<<<<<[-[-<<+>>>>.<<]>+[-<+>>>>+.<<<]>.>>>>>.<<<<<.>>>.<<<.>.<.>>.<<.>>>>.<<<<.<<<<[->>>+>>>+<<<<<<]>>[-<<+>>>>>>.-<<<<]>[->>>-<<<<+>]<<<[->>>+<<<]>.>]

Pruébalo en línea!

Se puede jugar mucho más al golf ...


1

Javascript (usando una biblioteca externa) (143 bytes)

n=>_.Range(1,9).WriteLine(v=>_.Range(0,10-v).Write("",x=>" ")+_.Range(1,v).Write("")+" x 8 + " + v + " = "+_.Range(10-v,v).Reverse().Write(""))

Enlace a lib: https://github.com/mvegh1/Enumerable/

Explicación del código: cree un rango de 1 a 9 y, para cada valor, escriba una línea correspondiente al predicado complejo. Al predicado se le pasa el valor entero actual y crea un rango que abarca los elementos 10-currentValue para crear tantos espacios. Esos espacios se concatenan con la parte de fórmula de la línea, y luego se concatenan con el final del rango que coincide con el número de elementos como la interfaz, en orden inverso.

Nota: En la imagen, la primera línea está apagada por un espacio porque la consola agregó una comilla ya que el valor de retorno es una cadena. El valor real está formateado correctamente

ingrese la descripción de la imagen aquí


1

05AB1E , 24 bytes

9Lε©LJ'x8'+®'=T®L-Jðý}.c

Pruébalo en línea!

Utiliza una versión más nueva que el desafío, que ahora está permitido.


No es mucho, pero en la versión más reciente de 05AB1E incluso se puede quitar el ©, y cambiar el ®que ypara guardar un byte.
Kevin Cruijssen

@KevinCruijssen Eh, generalmente no "actualizo" respuestas antiguas como esa. Además, la "versión más nueva" es un lenguaje totalmente diferente (implementaciones diferentes).
Erik the Outgolfer


1

VBA (Excel), 51 bytes

Usar ventana inmediata

For z=1To 9:a=a &z:?Spc(9-z)a" x 8 +"z"="a*8+z:Next

0

k (77 bytes)

Probablemente podría acortarse un poco más

-1@'((|t)#\:" "),'(t#\:n),'" x 8 + ",/:n,'" = ",/:(t:"I"$'n)#\:|n:"123456789";

Ejemplo:

k)-1@'((|t)#\:" "),'(t#\:n),'" x 8 + ",/:n,'" = ",/:(t:"I"$'n)#\:|n:"123456789";
         1 x 8 + 1 = 9
        12 x 8 + 2 = 98
       123 x 8 + 3 = 987
      1234 x 8 + 4 = 9876
     12345 x 8 + 5 = 98765
    123456 x 8 + 6 = 987654
   1234567 x 8 + 7 = 9876543
  12345678 x 8 + 8 = 98765432
 123456789 x 8 + 9 = 987654321

0

golflua, 56 caracteres

p=""~@i=1,9p=p..i; w(S.q("%9s x 8 + %d = "..p*8+i,p,i))$

Ejecución de muestra:

bash-4.3$ golflua -e 'p=""~@i=1,9p=p..i; w(S.q("%9s x 8 + %d = "..p*8+i,p,i))$'
        1 x 8 + 1 = 9
       12 x 8 + 2 = 98
      123 x 8 + 3 = 987
     1234 x 8 + 4 = 9876
    12345 x 8 + 5 = 98765
   123456 x 8 + 6 = 987654
  1234567 x 8 + 7 = 9876543
 12345678 x 8 + 8 = 98765432
123456789 x 8 + 9 = 987654321
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.