Gib ein magisches 8-Trapez aus


41

Deine Aufgabe ist es, ein Magical 8-Trapez auszugeben:

        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
  • Ausgabe in der von Ihnen gewählten Sprache in möglichst wenigen Bytes.
  • Notieren Sie die Anzahl der Leerzeichen am Anfang jeder Zeile, um die Trapezform beizubehalten.
  • Nachgestellte Leerzeichen sind erlaubt.
  • Sie können ×oder den Buchstaben x verwenden - je nachdem, was Sie bevorzugen.

1
Verbunden. (leicht ...)
Martin Ender

Mittelräume sind erforderlich, ja?
Wert Tinte

@ KevinLau-notKenny ist es, aber du könntest auch immer eine Alternative posten, wenn es wichtig ist.
Rybo111

Es sind 6 Bytes, die den 6 Zwischenräumen in der Mitte entsprechen, also nein, ich denke, es ist nicht signifikant genug.
Wert Tinte

Antworten:


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

Die Zahlen aund idie Gleichung a * 8 + iwerden rechnerisch erzeugt. Jede Zeile iwird inkrementiert und adie nächste Ziffer wird über angehängt a=a*10+i. Wenn zum Beispiel a=12345, i=5dann iwird 6, so ist das Neue adas, 12345*10 + 6was ist 123456.

Wenn Sie diese Werte als Zahlen und nicht als Zeichenfolgen speichern, können Sie die RHS gemäß der Gleichung berechnen a*8+i, die kürzer ist als das Umkehren von Zeichenfolgen.


+1, um zu sehen, was es ist - eine Summe, die generiert werden kann
rybo111

7

V , 37 Bytes

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

Probieren Sie es online!

Dies enthält nicht druckbare, also hier ist ein 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

mein erster golf versuch hier (danke an 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 (mein eigener Versuch)

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

105 (erste)

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

1
Keine geschweiften Klammern um eine einzelne Anweisung. Das $ i allein interpoliert besser direkt in den String ohne Formatbezeichner.
Manatwork

1
Sie können 23 weitere Bytes mit ein paar Tricks löschen: Wenn Sie @ ++ $ i <= 9 in $ i ++ <9 ändern, werden 2 Bytes gespart. Sie müssen Benachrichtigungen nicht stumm schalten, da sie die Ausführung nicht anhalten. Nach den Standard-PPCG-Regeln können Sie stderr ignorieren, wenn Sie möchten. Wenn Sie das Zeichen \ n in ein tatsächliches Newline-Zeichen ändern, wird ein Byte gespeichert. Durch Ändern der Join-Bits (Bereich (...)) in $ s. = $ I und $ t. = 10- $ i werden 15 Byte gespart. Dies funktioniert, weil Zuweisungen den zugewiesenen Wert zurückgeben und so ziemlich der wertvollste Trick ist, den ich für das Golfen von PHP gefunden habe. Die letzten 5 Bytes werden oben von manatwork
user55641

1
Sie können 2 weitere Bytes fallen durch den Ersatz $t.=10-$imit $s*8+$i. tio.run/##K8go@G9jXwAk0/…
640KB

1
Das sind 59 Bytes. Und spart $s*8+$istattdessen $t.=10-$izwei weitere.
Titus

5

Pyth, 32 Bytes

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

Probieren Sie es 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

Vielen Dank an @FryAmTheEggman für das Speichern von 2 Bytes. Vielen Dank an @KennyLau für das Speichern von 3 Bytes.


sverbindet sich nicht mit Leerzeichen - es verbindet sich ohne Begrenzer.
Isaac

@isaacg hah, und jetzt denke ich, ich könnte ein Byte retten, indem ich mich mit dem Leerzeichen verbinde
Ven

Die Byteanzahl wäre gleich .
Undichte Nonne

4

CJam, 39 38 36 Bytes

Danke an Optimizer für das Speichern von 2 Bytes.

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

Teste es hier.

Gleiche Byteanzahl:

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

Hierfür ist die neueste Version erforderlich, die unter Online testen verfügbar ist.


9
@Optimizer hat also seinem Namen alle Ehre gemacht!
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

Probieren Sie es online aus

Eine frühere Version verwendet etwas String-Magie.

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]

Das Casting range(1,10)zu einer Zeichenkette ergibt [1, 2, 3, 4, 5, 6, 7, 8, 9], und das ist schön, da jede Zahl nur eine Ziffer ist. Also 123456789ist es mit einfach , die Zeichenfolge daraus zu ziehen `range(1,10)`[1::3]. Der umgekehrte Bereich ist `range(1,10)`[-2::-3]. Um nur so weit zu kommen, wie ich jede Iteration haben möchte, schneide ich sie entweder 3*nbei oder bei 3*(9-n)( 27-3*n) für die umgekehrten Ziffern ab.


Sie können for n in range(1,10):print"%9s"%s[:n]+" x 8 + %s = "%n+s[::-1][:n]für 80 Bytes tun .
TheBikingViking

s="123456789";n=1;exec'print"%9s"%s[:n],"x 8 + %s ="%n,s[::-1][:n];n+=1;'*9spart drei mehr! Bis auf 75.
Lynn

Schön, danke für die Hilfe! Schade, dass ich das zweite Mal doppelt schneiden musste ...
mbomb007

4

Perl, 49 Bytes

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

Verwendungszweck

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

4

Ruby, 77, 73, 65 60 Bytes

Probieren Sie es online ~

Wichtige Überarbeitungen von @manatwork

Eine weitere Überholung von @xsot

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

Scheint mit Format - String kürzer zu sein: puts'%9d x 8 + %d = %d'%[k=[*1..i]*'',i,k.to_i*8+i].
Manatwork

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

Ah, ich wusste nicht, %9ddass es eine Formatierungsoption ist, um solche Ganzzahlen aufzufüllen
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 das ist toll! Ich habe nicht daran gedacht, die anfängliche Zahl so zu berechnen.
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;}

Probieren Sie es online aus.

Erläuterung:

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
Ich denke, Sie könnten Bytes sparen, indem Sie xanstelle des Multiplikationszeichens verwenden.
Wizzwizz4

1
Sie können ein paar Bytes sparen s, "\n"indem Sie "\n"+den forLoop
Cliffroot

@ wizzwizz4 Danke. Hätte wissen sollen, ×ist 2 Bytes anstelle von 1 wie x..
Kevin Cruijssen

Tragen Sie nicht auch sbei jeder Iteration zum Ergebnis bei?
Cliffroot

Ich weiß, das ist alt, aber kannst du nicht return ostattdessen tun System.out.print(o)? Sie können auch zu Java 10 wechseln und mit varund lambdas
Verkörperung der Ignoranz

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

Wenn Sie diese Lösung trotzdem verbessern müssen, können Sie sie gerne weitergeben.


Sie können 1 Byte sparen, indem Sie ein Leerzeichen entfernen: ;n=10*n+ ++iin der for-Schleife kann geändert werden zu ;n=++i+10*n. Auch +" x "+"8 + "+kann geändert werden , um +" x 8 + "+. um 3 weitere Bytes zu sparen.
Kevin Cruijssen

void f () {für (int n = 1, i = 1; i <10; n = ++ i + 10 * n) Console.WriteLine ($ "{neuer String ('', 9-i)} {n } x 8 + {i} = {(n * 8 + i)} ");} ------------ hat dir ein Byte gespart!
Downrep_nation

3

Batch, 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%%

Ja, das sind 16% Zeichen in einer Zeile. Das ist Batch für Sie!


2

Haskell, 92 Bytes

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

Wie es funktioniert:

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 Bytes

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

Probieren Sie es hier aus!

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

Schleifen von 8 bis 0 8..0|%{...}über den Bereichsoperator. Bei jeder Iteration wird eine String-Verkettung ausgegeben, die aus (der entsprechenden Anzahl von Leerzeichen " "*$_) plus einem -joined-String von (einem Bereich von 1bis zu einer vorab inkrementierten Hilfsnummer ++$iplus dem mittleren Bit " x 8 + $i = "plus dem endgültigen Bereich von besteht9 bis zur aktuellen Nummer besteht$_ vor besteht inkrementiert).

Ein großer Trick dabei ist, dass wir die "Linkspräferenz" für die Typisierung nutzen, um Arrays innerhalb der -joinParens zu "addieren" , was bedeutet, dass wir nur eine verwenden-join Operator verwenden.

Beispiel

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
%{Geht es deinen Augen gut?
Gcampbell

@gcampbell Wenn deine Augen so aussehen würden, würdest du auch die Stirn runzeln.
AdmBorkBork

Hängt davon ab, wie Ihre Schriftart Prozente darstellt.
Gcampbell


2

J, 51 Bytes

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

Erzeugt den String 123456789 und verarbeitet dann Präfixe und Suffixe, um die Ausgabe zu erstellen.

Verwendungszweck

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

Nutzen Sie die neue repeatMethode, Backticks und Vorlagen ...

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

netter job bro, du solltest in betracht ziehen, etwas platz zu entfernen und alertanstatt zu verwenden console.log, kann es einige bytes sparen!
Chau Giang

Angesichts der Tatsache, dass ich kurz vor Mitternacht darauf geantwortet habe, glaube ich, dass ich kurz vor dem Halbschlaf war ... Ich werde bald ein Update darüber veröffentlichen. LOL
WallyWest

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)

Ergebnis:

        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

Probieren Sie es online!

-9 Bytes durch Verwenden des 10⊥Tricks zum Parsen der Zahl anstelle einer Reduzierung. Vielen Dank an @ Adám für -13!

Erläuterung:

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

Wobei \nein wörtliches Newline-Zeichen darstellt. Die zweite Version gibt eine abschließende Newline aus. Ich habe eine Formel für die Zahlen gefunden, ('1'.repeat(9-i)+0+i)/9aber das Auffüllen war auf diese Weise einfacher.


1

Brainfuck , 232 Bytes

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

Probieren Sie es online!

Kann viel weiter golfen werden ...


1

Javascript (mit externer Bibliothek) (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 zu lib: https://github.com/mvegh1/Enumerable/

Erklärung des Codes: Erstellen Sie einen Bereich von 1 bis 9, und schreiben Sie für jeden Wert eine Zeile, die dem komplexen Prädikat entspricht. Dem Prädikat wird der aktuelle ganzzahlige Wert übergeben, und es wird ein Bereich erstellt, der 10 currentValue-Elemente umfasst, um so viele Leerzeichen zu erstellen. Diese Leerzeichen werden mit dem Formelteil der Zeile verkettet, und dann wird dieser mit dem hinteren Ende des Bereichs verkettet, der der Anzahl der Elemente entspricht, und zwar in umgekehrter Reihenfolge.

Anmerkung: In der Abbildung ist die erste Zeile um ein Leerzeichen versetzt, da die Konsole ein Anführungszeichen hinzugefügt hat, da der Rückgabewert eine Zeichenfolge ist. Der tatsächliche Wert ist korrekt formatiert

Bildbeschreibung hier eingeben


1

05AB1E , 24 Byte

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

Probieren Sie es online!

Verwendet eine neuere Version als die Herausforderung, die jetzt zulässig ist.


Es ist nicht viel, aber in der auch neueren Version von 05AB1E können Sie die entfernen ©, und die ändern , ®um yein Byte zu speichern.
Kevin Cruijssen

@KevinCruijssen Ähm, ich "aktualisiere" alte Antworten im Allgemeinen nicht so. Auch die "neuere Version" ist eine völlig andere Sprache (unterschiedliche Implementierungen).
Erik der Outgolfer


1

VBA (Excel), 51 Byte

Sofortfenster verwenden

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

0

k (77 Bytes)

Könnte wohl etwas mehr gekürzt werden

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

Beispiel:

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 Zeichen

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

Probelauf:

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.