Produire un Magical 8 Trapezium


41

Votre tâche consiste à produire un 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
  • Sortie dans la langue de votre choix dans le moins d'octets possible.
  • Notez le nombre d'espaces au début de chaque ligne pour conserver la forme du trapèze.
  • Les espaces de fuite sont autorisés.
  • Vous pouvez utiliser ×la lettre x ou celle que vous préférez.

1
En relation. (légèrement ...)
Martin Ender

Les espaces intermédiaires sont requis, oui?
Valeur d'encre

@ KevinLau-notKenny, mais vous pouvez toujours publier une alternative si elle est importante.
rybo111

C'est 6 octets correspondant aux 6 espaces au milieu, donc non, je ne pense pas que ce soit assez significatif.
Valeur d'encre

Réponses:


15

Python 2, 59 octets

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

Les nombres aet il'équation a * 8 + isont générés de manière arithmétique. Chaque ligne iest incrémentée et ale chiffre suivant est ajouté via a=a*10+i. Par exemple, si a=12345, i=5, idevient 6, le nouveau aest 12345*10 + 6ce qui est 123456.

Le stockage de ces données sous forme de nombres plutôt que de chaînes nous permet de calculer le RHS donné par l'équation a*8+i, qui est plus courte que l'inversion de chaîne.


+1 pour voir ceci pour ce que c'est - une somme qui peut être générée
rybo111

7

V , 37 octets

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

Essayez-le en ligne!

Ceci contient unprintable, voici donc 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 octets

mon premier essai de golf ici (merci à 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 (mon propre essai)

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

105 (premier)

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

1
Pas besoin d'accolades autour d'une seule déclaration. Le $ i seul permet une meilleure interpolation directe dans la chaîne sans spécificateur de format.
Manatwork

1
Vous pouvez supprimer 23 octets supplémentaires avec quelques astuces: Changer @ ++ $ i <= 9 en $ i ++ <9 enregistre 2 octets. Vous n'avez pas besoin de faire taire les notifications car elles n'arrêtent pas l'exécution et sous les règles PPCG standard, vous pouvez ignorer stderr si vous le souhaitez. Remplacer le \ n par un caractère de nouvelle ligne enregistre un octet. Changer les bits de jointure (plage (...)) en $ s. = $ I et $ t. = 10- $ i enregistre 15 octets. Cela fonctionne parce que les affectations renvoient la valeur attribuée et qu’il s’agit du truc le plus précieux que j'ai trouvé pour le golf php. Les 5 derniers octets sont détaillés par manatwork ci
user55641

1
Vous pouvez supprimer 2 octets supplémentaires en remplaçant $t.=10-$ipar $s*8+$i. tio.run/##K8go@G9jXwAk0/…
640 Ko

1
C'est 59 octets. Et $s*8+$iau lieu de $t.=10-$isauve deux autres.
Titus

5

Pyth, 32 octets

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

Essayez-le en ligne!

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

Merci à @FryAmTheEggman pour la sauvegarde de 2 octets. Merci à @KennyLau pour la sauvegarde de 3 octets.


sne se joint pas à l'espace - il se joint à aucun séparateur.
isaacg

@isaacg hah, et maintenant je pense que je pourrais économiser un octet en joignant l'espace
Ven

Le nombre d'octets serait le même .
Leaky Nun

4

CJam, 39 38 36 octets

Merci à Optimizer pour la sauvegarde de 2 octets.

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

Testez-le ici.

Même nombre d'octets:

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

Cela nécessite la dernière version, disponible sur Essayez-le en ligne!


9
@Optimizer a été à la hauteur de son nom, alors!
rybo111

4

Python 2, 87 84 78 75 octets

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

Essayez-le en ligne

Une version précédente utilise une magie de chaîne.

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]

La conversion range(1,10)en chaîne donne [1, 2, 3, 4, 5, 6, 7, 8, 9], et c'est bien puisque chaque nombre n'est qu'un chiffre. Donc, obtenir la chaîne 123456789de ceci est simple avec `range(1,10)`[1::3]. La plage inversée est `range(1,10)`[-2::-3]. Ensuite, pour aller aussi loin que je le souhaite à chaque itération, je le coupe en tranches 3*n, ou à 3*(9-n)( 27-3*n) pour les chiffres inversés.


Vous pouvez faire for n in range(1,10):print"%9s"%s[:n]+" x 8 + %s = "%n+s[::-1][:n]pour 80 octets.
TheBikingViking

s="123456789";n=1;exec'print"%9s"%s[:n],"x 8 + %s ="%n,s[::-1][:n];n+=1;'*9sauve trois autres! Moins de 75 ans.
Lynn

Nice, merci pour l'aide! Dommage que je devais doubler la deuxième fois ...
mbomb007

4

Perl, 49 octets

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

Usage

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

4

Ruby, 77 73 65 60 octets

Essayez-le en ligne ~

Rénovations majeures de @manatwork

Une autre refonte de @xsot

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

Semble être plus courte avec chaîne de format: puts'%9d x 8 + %d = %d'%[k=[*1..i]*'',i,k.to_i*8+i].
manatwork

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

Ah, je ne savais pas %9dêtre une option de formatage pour remplir des entiers comme ça
Value Ink

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

@xsot c'est génial! Je n'ai pas pensé à calculer le nombre initial comme ça.
Valeur d'encre

4

Java 10, 151 133 130 129 126 110 octets

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

Essayez-le en ligne.

Explication:

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
Je pense que vous pourriez économiser des octets en utilisant xau lieu du signe de multiplication.
wizzwizz4

1
Vous pouvez enregistrer deux octets en initialisant sà "\n"et la suppression "\n"+de la forboucle
cliffroot

@ wizzwizz4 Merci. Aurais dû savoir ×est 2 octets au lieu de 1 comme x..
Kevin Cruijssen

N'ajoutez-vous pas non plus sau résultat à chaque itération?
Cliffroot

Je sais que c'est vieux, mais tu ne peux pas faire à la return oplace de System.out.print(o)? Vous pouvez également passer à Java 10 et économiser avec varet lambdas
Incarnation of Ignorance

3

C, 74 octets

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 octets

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 vous devez améliorer cette solution, n'hésitez pas à la partager.


Vous pouvez économiser 1 octet en supprimant un espace: ;n=10*n+ ++idans la boucle for, vous pouvez le remplacer par ;n=++i+10*n. En outre, +" x "+"8 + "+peut être changé pour +" x 8 + "+. enregistrer 3 octets supplémentaires.
Kevin Cruijssen

void f () {for (int n = 1, i = 1; i <10; n = ++ i + 10 * n) Console.WriteLine ($ "{nouvelle chaîne ('', 9-i)}} {n } x 8 + {i} = {(n * 8 + i)} ");} ------------ vous a sauvegardé un octet!
downrep_nation

3

Lot, 117 octets

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

Oui, c'est 16% de signes sur une ligne; c'est Lot pour vous!


2

Haskell, 92 octets

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

Comment ça marche:

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

Pyke, 30 29 octets

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

Essayez-le ici!

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 octets

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

Boucle de 8 à 0 8..0|%{...}via l’opérateur de gamme. A chaque itération, nous produisons une concaténation de chaîne composée de (le nombre approprié d'espaces " "*$_), plus une -joinchaîne ed de (une plage allant de 1à un numéro d'assistance pré-incrémenté ++$i, plus le bit du milieu " x 8 + $i = ", plus la plage finale allant de 9au nombre actuel.$_ pre -incrémentée).

L’un des gros trucs est de tirer parti de la "préférence de gauche" pour la conversion de type, ce qui nous permet d’ajouter des tableaux à l’intérieur du tableau. -join parens, ce qui signifie que nous n’utilisons qu’un seul -joinopérateur.

Exemple

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
%{Est-ce que vos yeux vont bien?
Gcampbell

@ gcampbell Si vos yeux ressemblaient à cela, vous seriez aussi désolant.
AdmBorkBork

Cela dépend de la façon dont votre police rend les pourcentages.
Gcampbell


2

J, 51 octets

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

Crée la chaîne 123456789 puis agit sur les préfixes et les suffixes de celle-ci pour créer la sortie.

Usage

   (|."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)

Profitant de la nouvelle repeatméthode, des backticks et des templates ...

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

beau travail mon frère, vous devriez envisager de supprimer de l'espace et de l'utiliser à la alertplace console.log, cela peut économiser des octets!
Chau Giang

Etant donné que j'ai répondu à cela juste avant minuit, je pensais que j'étais presque à moitié endormi ... Je posterai bientôt une mise à jour à ce sujet. LOL
WallyWest

2

R, 107 103 octets

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)

Résultat :

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

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

Essayez-le en ligne!

-9 octets en utilisant l' 10⊥astuce pour analyser le nombre, au lieu d'une réduction. Merci à @ Adám pour -13!

Explication:

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

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

\nreprésente un caractère de nouvelle ligne littéral. La deuxième version génère une fin de ligne. Je suis arrivé avec une formule pour les nombres ('1'.repeat(9-i)+0+i)/9mais le remplissage était plus facile à faire de cette façon.


1

Brainfuck , 232 octets

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

Essayez-le en ligne!

Peut être joué au golf beaucoup plus loin ...


1

Javascript (en utilisant une bibliothèque externe) (143 octets)

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

Lien vers lib: https://github.com/mvegh1/Enumerable/

Explication du code: créez les plages 1 à 9 et, pour chaque valeur, écrivez une ligne correspondant au prédicat complexe. La valeur entière actuelle est transmise au prédicat et crée une plage englobant des éléments 10-currentValue, afin de créer autant d'espaces. Ces espaces sont concaténés avec la partie de la ligne correspondant à la formule, puis concaténés avec la fin de la plage correspondant au nombre d'éléments de l'interface, dans l'ordre inverse.

Remarque: dans l'image, la première ligne est séparée d'un espace car la console a ajouté un guillemet puisque la valeur renvoyée est une chaîne. La valeur réelle est correctement formatée

entrez la description de l'image ici


1

05AB1E , 24 octets

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

Essayez-le en ligne!

Utilise une version plus récente que le défi, qui est maintenant autorisée.


Il n'y a pas beaucoup, mais dans la version encore plus récente de 05AB1E vous pouvez supprimer le ©, et changer ®pour yd'enregistrer un octet.
Kevin Cruijssen le

@KevinCruijssen Eh, en général, je ne "mets" pas à jour les réponses anciennes comme ça. En outre, la "nouvelle version" est un langage totalement différent (implémentations différentes).
Erik the Outgolfer


1

VBA (Excel), 51 octets

Utilisation de la fenêtre immédiate

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

0

k (77 octets)

Pourrait probablement être raccourci un peu plus

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

Exemple:

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 personnages

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

Échantillon échantillon:

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.