Produzir um trapézio mágico 8


41

Sua tarefa é produzir um Magical 8 Trapezium:

        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
  • Saída no idioma escolhido no menor número de bytes possível.
  • Observe o número de espaços no início de cada linha para manter a forma do trapézio.
  • Espaços à direita são permitidos.
  • Você pode usar ×ou a letra x - o que você preferir.

11
Relacionado. (levemente ...) #
9307 Martin Ender

Espaços intermediários são obrigatórios, sim?
Value Ink

@ KevinLau-notKenny é, mas você sempre pode postar uma alternativa também, se for significativa.
rybo111

São 6 bytes correspondentes aos 6 espaços no meio, então não, acho que não é significativo o suficiente.
Value Ink

Respostas:


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

Os números ae ia equação a * 8 + isão gerados aritmeticamente. Cada linha ié incrementada e atem o próximo dígito anexado via a=a*10+i. Por exemplo, se a=12345, i=5, então ise torna 6, então o novo aé o 12345*10 + 6que é 123456.

Armazená-los como números, em vez de cadeias, permite calcular o RHS conforme indicado pela equação a*8+i, que é mais curta que a reversão de cadeias.


+1 para ver este para o que é - uma soma que pode ser gerada
rybo111

7

V , 37 bytes

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

Experimente online!

Contém não imprimível, então aqui está um 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

minha primeira tentativa de golfe aqui (graças 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 (minha própria tentativa)

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

105 (primeiro)

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

11
Não há necessidade de aparelhos em torno de uma única declaração. Só o $ i é melhor interpolado diretamente na cadeia de caracteres sem o especificador de formato.
manatwork 27/07/16

11
Você pode eliminar mais 23 bytes com alguns truques: Alterar @ ++ $ i <= 9 para $ i ++ <9 economiza 2 bytes. Você não precisa silenciar avisos, pois eles não param a execução e, de acordo com as regras padrão do PPCG, você pode ignorar o stderr, se desejar. Alterar \ n para um caractere de nova linha real salva um byte. Alterar os bits de junção (intervalo (...)) para $ s. = $ Ie $ t. = 10- $ i salva 15 bytes. Isso funciona porque as atribuições retornam o valor atribuído e é praticamente o truque mais valioso que encontrei no php para golfe. Os últimos 5 bytes são detalhados pelo manatwork acima
user55641 27/07

11
Você pode eliminar mais 2 bytes substituindo $t.=10-$ipor $s*8+$i. tio.run/##K8go@G9jXwAk0/…
640 KB

11
São 59 bytes. E em $s*8+$ivez de $t.=10-$isalvar mais dois.
Titus

5

Pitão, 32 bytes

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

Experimente online!

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

Obrigado a @FryAmTheEggman por salvar 2 bytes. Obrigado a @KennyLau por salvar 3 bytes.


snão se une ao espaço - se une sem delimitador.
Isaacg

@isaacg hah, e agora eu estou pensando que eu poderia salvar um byte juntando-se com o espaço
Ven

A contagem de bytes seria a mesma .
Leaky Nun em

4

CJam, 39 38 36 bytes

Agradecemos ao Optimizer por economizar 2 bytes.

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

Teste aqui.

Contagem de mesmos bytes:

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

Isso requer a versão mais recente, disponível em Experimente online!


9
@Optimizer fez jus ao seu nome, então!
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

Experimente online

Uma versão anterior usa alguma mágica de cordas.

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]

A conversão range(1,10)para uma string fornece [1, 2, 3, 4, 5, 6, 7, 8, 9], e isso é bom, já que todo número é apenas um dígito. Portanto, 123456789é fácil obter a string disso `range(1,10)`[1::3]. O intervalo invertido é `range(1,10)`[-2::-3]. Em seguida, para chegar apenas ao nível desejado para cada iteração, corte-a em um 3*nou em 3*(9-n)( 27-3*n) para os dígitos invertidos.


Você pode fazer 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;'*9economiza mais três! Até 75.
Lynn

Bom, obrigado pela ajuda! Pena que eu tive que dobrar-slice pela 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

Experimente online ~

Principais reformulações de @manatwork

Outra revisão do @xsot

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

Parece ser mais curto com string de formato: puts'%9d x 8 + %d = %d'%[k=[*1..i]*'',i,k.to_i*8+i].
26616 manatwork

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

Ah, eu não sabia nada sobre %9dser uma opção de formatação para números inteiros almofada como essa
Valor de tinta

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

@xsot isso é ótimo! Não pensou em calcular o número inicial assim.
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;}

Experimente online.

Explicação:

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

11
Eu acho que você poderia salvar bytes usando em xvez do sinal de multiplicação.
Wizzwizz4

11
Você pode salvar um par de bytes por inicializar sa "\n"e retirando "\n"+do forcircuito
cliffroot

@ wizzwizz4 Obrigado. Deveria ter sabido ×é de 2 bytes em vez de 1, como x..
Kevin Cruijssen

Você não está adicionando sao resultado em cada iteração também?
Cliffroot

Eu sei que isso é velho, mas você não pode fazer em return ovez de System.out.print(o)? Além disso, você pode alterar para o Java 10 e salvar com vare lambdas
Modalidade de Ignorância

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

se você tiver alguma maneira de melhorar esta solução, sinta-se à vontade para compartilhar.


Você pode economizar 1 byte removendo um espaço: ;n=10*n+ ++ino loop for pode ser alterado para ;n=++i+10*n. Além disso, +" x "+"8 + "+pode ser alterado para +" x 8 + "+. para salvar mais 3 bytes.
Kevin Cruijssen 27/07

void f () {for (int n = 1, i = 1; i <10; n = ++ i + 10 * n) Console.WriteLine ($ "{nova string ('', 9-i)} {n } x 8 + {i} = {(n * 8 + i)} ");} ------------ economizou um 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%%

Sim, isso significa 16% de sinais em uma linha; isso é lote para você!


2

Haskell, 92 bytes

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

Como 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

A contagem de bytes assume a codificação ISO 8859-1. O avanço de linha principal é significativo.


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

Experimente online!


2

Pyke, 30 29 bytes

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

Experimente aqui!

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..++$_)}

Loops de 8 a 0 8..0|%{...}através do operador de faixa. A cada iteração, produzimos uma concatenação de string composta por (o número apropriado de espaços " "*$_), mais uma -joinstring ed de (um intervalo de 1até um número auxiliar pré-incrementado ++$i, mais o bit do meio " x 8 + $i = ", mais o intervalo final do 9número atual $_pre -incrementado).

Um grande truque aqui é alavancar a "preferência de esquerda" para a tipografia, o que nos permite "adicionar" matrizes dentro das -joinparênteses, o que significa que usamos apenas um -joinoperador.

Exemplo

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

4
%{Seus olhos estão bem?
Gcampbell

@gcampbell Se seus olhos parecessem assim, você também estaria carrancudo.
AdmBorkBork

Depende de como sua fonte renderiza porcentagens.
Gcampbell


2

J, 51 bytes

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

Cria a sequência 123456789e, em seguida, opera em prefixos e sufixos para criar a saída.

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)

Aproveitando o novo repeatmétodo, backticks e modelos ...

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

bom trabalho mano, você deve considerar remover algum espaço e usar em alertvez de console.log, ele pode economizar alguns bytes!
chau giang 14/04

Dado que eu respondi isso pouco antes da meia-noite, acho que estava quase dormindo ... publicarei uma atualização sobre isso em breve. LOL
WallyWest 14/04

2

R, 107 103 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)}

Ungolfed:

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

Experimente online!

-9 bytes usando o 10⊥truque para analisar o número, em vez de uma redução. Obrigado a @ Adám por -13!

Explicação:

    ((¯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`)

Onde \nrepresenta um caractere literal de nova linha. A segunda versão gera uma nova linha à direita. Eu vim com uma fórmula para os números, ('1'.repeat(9-i)+0+i)/9mas o preenchimento era mais fácil de fazer dessa maneira.


1

Brainfuck , 232 bytes

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

Experimente online!

Pode ser jogado muito mais longe ...


1

Javascript (usando 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(""))

Link para lib: https://github.com/mvegh1/Enumerable/

Explicação do código: Crie o intervalo de 1 a 9 e, para cada valor, escreva uma linha correspondente ao predicado complexo. O predicado recebe o valor inteiro atual e cria um intervalo que mede 10 elementos currentValue, a fim de criar tantos espaços. Esses espaços são concatenados com a parte da fórmula da linha e, em seguida, são concatenados com a final do intervalo que corresponde ao número de elementos como front-end, na ordem inversa.

Nota: Na imagem, a primeira linha está desativada em um espaço porque o console adicionou aspas, pois o valor de retorno é uma sequência. O valor real está formatado corretamente

insira a descrição da imagem aqui


1

05AB1E , 24 bytes

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

Experimente online!

Usa uma versão mais recente que o desafio, que agora é permitido.


Não é muito, mas na versão ainda mais recente do 05AB1E você pode remover o ©e alterar ®para ypara salvar um byte.
Kevin Cruijssen 10/04

@KevinCruijssen Eh, geralmente não "atualizo" respostas antigas como essa. Além disso, a "versão mais recente" é uma linguagem totalmente diferente (diferentes implementações).
Erik the Outgolfer


1

VBA (Excel), 51 bytes

Usando janela imediata

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

0

k (77 bytes)

Provavelmente poderia ser encurtado um pouco mais

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

Exemplo:

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

Exemplo de execução:

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.