Emette un magico trapezio 8


41

Il tuo compito è produrre un Trapezio magico 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
  • Stampa nella lingua scelta nel minor numero di byte possibile.
  • Nota il numero di spazi all'inizio di ogni riga per mantenere la forma del trapezio.
  • Sono consentiti spazi finali.
  • Puoi usare ×la lettera x - qualunque preferisci.

1
Relazionato. (leggermente ...)
Martin Ender il

Sono richiesti spazi intermedi, sì?
Value Ink

@ KevinLau-notKenny lo è, ma potresti sempre pubblicare anche un'alternativa se è significativa.
Rybo111,

Sono 6 byte corrispondenti ai 6 spazi nel mezzo, quindi no, non credo sia abbastanza significativo.
Value Ink

Risposte:


15

Python 2, 59 byte

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

I numeri ae il'equazione a * 8 + isono generati aritmeticamente. Ogni riga iviene incrementata e aviene aggiunta la cifra successiva tramite a=a*10+i. Ad esempio, se a=12345, i=5, quindi idiventa 6, quindi il nuovo aè quello 12345*10 + 6che è 123456.

La memorizzazione di questi come numeri anziché come stringhe ci consente di calcolare l'RHS come indicato dall'equazione a*8+i, che è più breve dell'inversione di stringa.


+1 per vedere questo per quello che è - una somma che può essere generata
rybo111

7

V , 37 byte

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

Provalo online!

Questo contiene non stampabili, quindi ecco 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 byte

il mio primo tentativo di golf qui (grazie a manatwork e 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 (il mio tentativo)

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

105 (primo)

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

1
Non sono necessarie parentesi graffe attorno a una singola istruzione. Il solo $ i interpola meglio direttamente nella stringa senza identificatore di formato.
arte

1
Puoi eliminare altri 23 byte con alcuni trucchi: cambiando @ ++ $ i <= 9 in $ i ++ <9 si risparmiano 2 byte. Non è necessario mettere a tacere le notifiche in quanto non interrompono l'esecuzione e in base alle regole PPCG standard è possibile ignorare stderr se si desidera. La modifica di \ n in un carattere di nuova riga effettiva salva un byte. Cambiando i bit di join (range (...)) in $ s. = $ I e $ t. = 10- $ i si risparmiano 15 byte. Questo perché le assegnazioni restituiscono il valore assegnato ed è praticamente il trucco più prezioso che ho trovato per giocare a golf php. Gli ultimi 5 byte sono descritti in dettaglio da manatwork sopra
user55641

1
È possibile eliminare altri 2 byte sostituendoli $t.=10-$icon $s*8+$i. tio.run/##K8go@G9jXwAk0/…
640KB

1
Sono 59 byte. E $s*8+$iinvece di $t.=10-$isalvare altri due.
Tito

5

Pyth, 32 byte

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

Provalo 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

Grazie a @FryAmTheEggman per aver salvato 2 byte. Grazie a @KennyLau per aver salvato 3 byte.


snon si unisce allo spazio: si unisce senza delimitatore.
Isaacg,

@isaacg hah, e ora sto pensando di poter salvare un byte unendomi allo spazio
Ven

Il conteggio dei byte sarebbe lo stesso .
Leaky Nun,

4

CJam, 39 38 36 byte

Grazie a Optimizer per il salvataggio di 2 byte.

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

Provalo qui.

Stesso numero di byte:

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

Ciò richiede l'ultima versione, disponibile su Provalo online!


9
@Optimizer è stato all'altezza del suo nome, quindi!
Rybo111,

4

Python 2, 87 84 78 75 byte

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

Provalo online

Una versione precedente utilizza un po 'di magia delle stringhe.

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]

Il cast range(1,10)su una stringa dà [1, 2, 3, 4, 5, 6, 7, 8, 9], e questo è bello poiché ogni numero è solo una singola cifra. Quindi ottenere la stringa 123456789da questo è semplice con `range(1,10)`[1::3]. La gamma inversa è `range(1,10)`[-2::-3]. Quindi, per arrivare solo a quanto voglio ogni iterazione, la taglio in uno 3*no in 3*(9-n)( 27-3*n) per le cifre invertite.


Puoi farlo for n in range(1,10):print"%9s"%s[:n]+" x 8 + %s = "%n+s[::-1][:n]per 80 byte.
TheBikingViking

s="123456789";n=1;exec'print"%9s"%s[:n],"x 8 + %s ="%n,s[::-1][:n];n+=1;'*9ne salva altri tre! Fino al 75.
Lynn,

Bene, grazie per l'aiuto! Peccato che ho dovuto raddoppiare la seconda volta ...
mbomb007

4

Perl, 49 byte

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

uso

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

4

Rubino, 77 73 65 60 byte

Provalo online ~

Importanti rinnovamenti di @manatwork

Un'altra revisione da @xsot

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

Sembra essere più breve con stringa di formato: puts'%9d x 8 + %d = %d'%[k=[*1..i]*'',i,k.to_i*8+i].
arte

(1..9).map1.upto(9)
arte

Ah, non sapevo di %9dessere un'opzione di formattazione per riempire numeri interi del genere
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 è fantastico! Non ho pensato di calcolare il numero iniziale in quel modo.
Value Ink,

4

Java 10, 151 133 130 129 126 110 byte

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

Provalo online.

Spiegazione:

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
Penso che potresti salvare byte usando xinvece il segno di moltiplicazione.
wizzwizz4,

1
È possibile salvare un paio di byte inizializzando sa "\n"e la rimozione "\n"+dal forcircuito
cliffroot

@wizzwizz4 Grazie. Avrei dovuto sapere che ×sono 2 byte anziché 1 come x..
Kevin Cruijssen

Non stai aggiungendo sal risultato anche su ogni iterazione?
cliffroot

So che è vecchio, ma non puoi farlo return oinvece di System.out.print(o)? Inoltre, puoi passare a Java 10 e salvare con vare lambdas
Embodiment of Ignorance l'

3

C, 74 byte

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 byte

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 hai comunque bisogno di migliorare questa soluzione, sentiti libero di condividere.


È possibile salvare 1 byte rimuovendo uno spazio: ;n=10*n+ ++inel ciclo for può essere modificato in ;n=++i+10*n. Inoltre, +" x "+"8 + "+può essere modificato in +" x 8 + "+. per salvare altri 3 byte.
Kevin Cruijssen,

void 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)} ");} ------------ ti ha salvato un byte!
downrep_nation

3

Lotto, 117 byte

@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ì, questo è il 16% di segni su una riga; questo è Batch per te!


2

Haskell, 92 byte

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

Come funziona:

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 byte

Il conteggio dei byte presuppone la codifica ISO 8859-1. L'alimentazione principale è significativa.


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

Provalo online!


2

Pyke, 30 29 byte

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

Provalo qui!

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 byte

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

Passa da 8 a 0 8..0|%{...}tramite l'operatore di portata. Ogni iterazione, produciamo una concatenazione di stringhe composta da (il numero appropriato di spazi " "*$_), più una -joinstringa ed di (un intervallo da 1a un numero di helper pre-incrementato ++$i, più il bit centrale " x 8 + $i = ", più l'intervallo finale da 9al numero corrente $_pre -incremented).

Un grande trucco qui è sfruttare la "preferenza di sinistra" per il typecasting, che ci consente di "aggiungere" array all'interno delle -joinparentesi, il che significa che utilizziamo un solo -joinoperatore.

Esempio

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
%{I tuoi occhi stanno bene?
gcampbell,

@gcampbell Se i tuoi occhi fossero così, anche tu saresti accigliato.
AdmBorkBork,

Dipende da come il tuo carattere visualizza le percentuali.
gcampbell,


2

J, 51 byte

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

Crea la stringa 123456789e quindi opera su prefissi e suffissi per creare l'output.

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)

Sfruttando il nuovo repeatmetodo, i backtick e il modello ...

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

bel lavoro fratello, dovresti considerare di rimuovere un po 'di spazio e usare al alertposto di console.log, può risparmiare qualche byte!
Chau Giang,

Dato che ho risposto a questo poco prima di mezzanotte, immagino di essere quasi mezzo addormentato ... Presto pubblicherò un aggiornamento. LOL
WallyWest

2

R, 107 103 byte

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)

Risultato:

        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 byte SBCS

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

Provalo online!

-9 byte usando il 10⊥trucco per analizzare il numero, anziché una riduzione. Grazie a @ Adám per -13!

Spiegazione:

    ((¯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 byte

_=>[...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`)

Dove \nrappresenta un carattere letterale newline. La seconda versione genera una nuova riga finale. Ho escogitato una formula per i numeri, ('1'.repeat(9-i)+0+i)/9ma l'imbottitura è stata più facile da fare in questo modo.


1

Brainfuck , 232 byte

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

Provalo online!

Può essere giocato a golf molto più lontano ...


1

Javascript (utilizzando una libreria esterna) (143 byte)

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 a lib: https://github.com/mvegh1/Enumerable/

Spiegazione del codice: creare un intervallo da 1 a 9 e, per ogni valore, scrivere una riga corrispondente al predicato complesso. Al predicato viene passato il valore intero corrente e viene creato un intervallo che comprende elementi 10-currentValue, al fine di creare tanti spazi. Tali spazi sono concatenati con la parte formula della linea e quindi concatenati con il tailend dell'intervallo corrispondente al numero di elementi come frontend, in ordine inverso.

Nota: nell'immagine, la prima riga è disattivata di uno spazio perché la console ha aggiunto le virgolette poiché il valore restituito è una stringa. Il valore reale è formattato correttamente

inserisci qui la descrizione dell'immagine


1

05AB1E , 24 byte

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

Provalo online!

Utilizza una versione più recente della sfida, che ora è consentita.


Non è molto, ma nella versione ancora più recente di 05AB1E è possibile rimuovere ©e cambiare ®in yper salvare un byte.
Kevin Cruijssen,

@KevinCruijssen Eh, in genere non "aggiorno" vecchie risposte del genere. Inoltre, la "versione più recente" è un linguaggio totalmente diverso (diverse implementazioni).
Erik the Outgolfer,


1

VBA (Excel), 51 byte

Utilizzando la finestra immediata

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

0

k (77 byte)

Probabilmente potrebbe essere abbreviato un po 'di più

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

Esempio:

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 caratteri

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

Esecuzione di esempio:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.