Wyprowadź Magiczny 8 Trapez

41

Twoim zadaniem jest wydanie Magicznego Trapezu 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
  • Dane wyjściowe w wybranym języku w jak najmniejszej liczbie bajtów.
  • Zanotuj liczbę spacji na początku każdej linii, aby zachować kształt trapezu.
  • Końcowe spacje są dozwolone.
  • Możesz użyć ×lub litery x - cokolwiek wolisz.
rybo111
źródło
1
Związane z. (nieznacznie ...)
Martin Ender
Wymagane są środkowe odstępy, tak?
Wartość tuszu
@ KevinLau-notKenny to jest, ale zawsze możesz opublikować alternatywę, jeśli jest znacząca.
rybo111
Ma 6 bajtów odpowiadających 6 spacjom na środku, więc nie, nie sądzę, żeby to było wystarczająco znaczące.
Wartość tuszu

Odpowiedzi:

15

Python 2, 59 bajtów

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

Liczby ai irównanie a * 8 + isą generowane arytmetycznie. Każda linia ijest zwiększana i ado niej dołączana jest następna cyfra a=a*10+i. Na przykład, jeśli a=12345, i=5, to istaje się 6, więc nowy ajest tym, 12345*10 + 6co jest 123456.

Przechowywanie ich jako liczb zamiast ciągów pozwala nam obliczyć RHS zgodnie z równaniem a*8+i, które jest krótsze niż odwrócenie ciągu.

xnor
źródło
+1 za obejrzenie tego, czym jest - sumą, którą można wygenerować
rybo111,
7

V , 37 bajtów

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

Wypróbuj online!

Zawiera to niedrukowalne, więc oto zrzut heksowy:

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.
DJMcMayhem
źródło
5

05AB1E , 32 31 30 28 bajtów

Kod:

TG9N-ð×NLJðN"x8+ÿ="€ðJžmN£J,

Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .

Adnan
źródło
.cnie nadaje się tutaj?
Magic Octopus Urn
@carusocomputing To jest, ale to późniejsze wyzwanie.
Adnan
Ahhh ... Nie widziałem znacznika czasu.
Magic Octopus Urn
5

PHP, 105 89 60 57 bajtów

moja pierwsza gra w golfa tutaj (dzięki 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 (moja własna próba)

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

105 (pierwszy)

for($j='123456789';@$j[$i++];){printf("%9s x 8 + %s = %s\n",substr($j,0,$i),$i,strrev(substr($j,-$i)));}
Crypto
źródło
1
Nie ma potrzeby używania nawiasów klamrowych wokół jednej instrukcji. Sam $ i lepiej interpoluje bezpośrednio w ciągu bez specyfikatora formatu.
manatwork
1
Możesz upuścić 23 bajty więcej za pomocą kilku sztuczek: Zmiana @ ++ $ i <= 9 na $ i ++ <9 zapisuje 2 bajty. Nie musisz wyciszać powiadomień, ponieważ nie przerywają one wykonywania i zgodnie ze standardowymi zasadami PPCG możesz zignorować stderr, jeśli chcesz. Zmiana \ n na rzeczywisty znak nowej linii oszczędza bajt. Zmiana bitów sprzężenia (zakresu (...)) na $ s. = $ I oraz $ t. = 10- $ i zapisuje 15 bajtów. Działa to, ponieważ przypisania zwracają przypisaną wartość i jest to właściwie najcenniejsza sztuczka, jaką znalazłem dla golfisty php. Ostatnie 5 bajtów zostało wyszczególnionych powyżej przez manatwork
user55641
1
Możesz upuścić jeszcze 2 bajty, zastępując $t.=10-$ije $s*8+$i. tio.run/##K8go@G9jXwAk0/…
640 KB
1
To 59 bajtów. I $s*8+$izamiast $t.=10-$ioszczędzać jeszcze dwa.
Tytus
5

Pyth, 32 bajty

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

Wypróbuj 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

Dzięki @FryAmTheEggman za zapisanie 2 bajtów. Dzięki @KennyLau za oszczędność 3 bajtów.

Ven
źródło
snie łączy się ze spacją - łączy się bez separatora.
isaacg
@isaacg hah, a teraz myślę, że mógłbym uratować bajt łącząc się ze spacją
Ven
Liczba bajtów byłaby taka sama .
Leaky Nun
4

CJam, 39 38 36 bajtów

Dzięki Optimizer za oszczędność 2 bajtów.

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

Sprawdź to tutaj.

Ta sama liczba bajtów:

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

Wymaga to najnowszej wersji, dostępnej na Wypróbuj online!

Martin Ender
źródło
9
@Optimizer zasłużył więc na swoje imię!
rybo111,
4

Python 2, 87 84 78 75 bajtów

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

Wypróbuj online

Poprzednia wersja używała magii strun.

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]

Rzutowanie range(1,10)na ciąg daje [1, 2, 3, 4, 5, 6, 7, 8, 9], i jest to miłe, ponieważ każda liczba jest tylko jedną cyfrą. Tak więc otrzymanie łańcucha 123456789z tego jest proste `range(1,10)`[1::3]. Odwrócony zakres to `range(1,10)`[-2::-3]. Następnie, aby dostać się tylko tak daleko, jak tylko chcę, dla każdej iteracji, odcinam ją albo w albo 3*n, albo w 3*(9-n)( 27-3*n) dla odwróconych cyfr.

mbomb007
źródło
Można to zrobić for n in range(1,10):print"%9s"%s[:n]+" x 8 + %s = "%n+s[::-1][:n]na 80 bajtów.
TheBikingViking
s="123456789";n=1;exec'print"%9s"%s[:n],"x 8 + %s ="%n,s[::-1][:n];n+=1;'*9oszczędza jeszcze trzy! Do 75.
Lynn,
Fajnie, dzięki za pomoc! Szkoda, że ​​musiałem dwukrotnie pokroić
plastry
4

Perl, 49 bajtów

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

Stosowanie

perl -e 'printf"%9s x 8 + $_ = %s
",$@.=$_,$_+8*$@for 1..9'
Dom Hastings
źródło
4

Rubinowy, 77 73 65 60 bajtów

Wypróbuj online ~

Główne zmiany w @manatwork

Kolejny przegląd @xsot

a=i=0;9.times{puts"%9d x 8 + %d = %d"%[a=a*10+i+=1,i,a*8+i]}
Wartość tuszu
źródło
Wydaje się być krótsza o formacie ciąg: puts'%9d x 8 + %d = %d'%[k=[*1..i]*'',i,k.to_i*8+i].
manatwork
(1..9).map1.upto(9)
manatwork
Ach, nie wiedziałem o %9dbyciu opcją formatowania do wpisywania takich liczb całkowitych
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 to świetnie! Nie myślałem o obliczeniu początkowej liczby w ten sposób.
Wartość tuszu
4

Java 10, 151 133 130 129 126 110 bajtów

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

Wypróbuj online.

Wyjaśnienie:

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
Kevin Cruijssen
źródło
1
Myślę, że możesz zapisać bajty, używając xzamiast znaku mnożenia.
wizzwizz4
1
Można zaoszczędzić kilka bajtów przez inicjowanie sdo "\n"i usuwanie "\n"+z forpętli
cliffroot
@ wizzwizz4 Thanks. Powinny wiedzieć, że ×są 2 bajty zamiast 1 jak x..
Kevin Cruijssen
Czy nie dodajesz również sdo wyniku każdej iteracji?
Cliffroot
Wiem, że to stare, ale czy nie możesz return otego zrobić System.out.print(o)? Możesz także przejść na Javę 10 i zapisać za pomocą vari lambdas
Embodiment of Ignorance
3

C, 74 bajty

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);}
anatolig
źródło
3

C #, 113 bajtów

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

jeśli mimo to ulepszysz to rozwiązanie, możesz je udostępnić.

ScifiDeath
źródło
Możesz zapisać 1 bajt, usuwając spację: ;n=10*n+ ++iw pętli for można zmienić na ;n=++i+10*n. Ponadto, +" x "+"8 + "+można zmienić +" x 8 + "+. aby zapisać 3 kolejne bajty.
Kevin Cruijssen
void f () {for (int n = 1, i = 1; i <10; n = ++ i + 10 * n) Console.WriteLine ($ "{nowy ciąg ('', 9-i)} {n } x 8 + {i} = {(n * 8 + i)} ");} ------------ zapisał ci bajt!
downrep_nation 27.07.16
3

Partia, 117 bajtów

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

Tak, to 16% znaków w jednej linii; to jest partia dla ciebie!

Neil
źródło
2

Haskell, 92 bajty

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

Jak to działa:

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
nimi
źródło
2

Siatkówka , 66 bajtów

Liczba bajtów zakłada kodowanie ISO 8859-1. Wiodące podawanie linii jest znaczące.


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

Wypróbuj online!

Martin Ender
źródło
2

Pyke, 30 29 bajtów

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

Wypróbuj tutaj!

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(^))
niebieski
źródło
2

PowerShell v2 +, 85 64 58 57 52 bajty

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

Pętle od 8 do 0 8..0|%{...}za pośrednictwem operatora zakresu. W każdej iteracji generujemy ciąg konkatenacji składający się z (odpowiedniej liczby spacji " "*$_), plus -joinedytowany ciąg (zakres od 1do wstępnie zwiększonej liczby pomocnika ++$i, plus środkowy bit " x 8 + $i = ", plus końcowy zakres od 9do bieżącej liczby $_przed -zwiększone).

Jedna wielka sztuczka polega na tym, że wykorzystujemy „lewą preferencję” do rzutowania czcionek, co pozwala nam „dodawać” razem tablice wewnątrz -joinparens, co oznacza, że ​​używamy tylko jednego -joinoperatora.

Przykład

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
AdmBorkBork
źródło
4
%{Czy twoje oczy są w porządku?
gcampbell
@gcampbell Gdyby twoje oczy tak wyglądały, również byś zmarszczył brwi.
AdmBorkBork
Zależy, w jaki sposób czcionka renderuje procenty.
gcampbell
2

MATL , 38 36 35 bajtów

9:"9@-Z"@:!V' x 8 + '@VO61O58@:-v!D

Wypróbuj online!

Luis Mendo
źródło
2

J, 51 bajtów

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

Tworzy ciąg, 123456789a następnie działa na jego przedrostkach i przyrostkach, aby utworzyć wynik.

Stosowanie

   (|."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
mile
źródło
2

JavaScript ES6 (88)

Wykorzystując nową repeatmetodę, backtyki i szablony ...

i=10;for(y="";--i;)console.log(`${" ".repeat(i)+(y+=(x=10-i))} x 8 + ${x} = ${y*8+x}\n`)
WallyWest
źródło
niezła robota, bracie, powinieneś rozważyć usunięcie miejsca i użycie alertzamiast tego console.log, można zaoszczędzić trochę bajtów!
chau giang
Biorąc pod uwagę, że odpowiedziałem na to tuż przed północą, wydaje mi się, że byłem prawie w półśnie ... Wkrótce opublikuję aktualizację. LOL
WallyWest
2

R 107 107 bajtów

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

Nie golfowany:

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)

Wynik:

        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
Frédéric
źródło
96 bajtów
Giuseppe
2

APL (Dyalog Unicode) , 61 52 39 bajtów SBCS

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

Wypróbuj online!

-9 bajtów za pomocą 10⊥lewy do parsowania liczby zamiast redukcji. Dzięki @ Adám za -13!

Wyjaśnienie:

    ((¯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
Ven
źródło
1

JavaScript (ES6), 99 bajtów

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

Gdzie \nreprezentuje dosłowny znak nowej linii. Druga wersja generuje końcowy znak nowej linii. Wymyśliłem wzór na liczby, ('1'.repeat(9-i)+0+i)/9ale wypełnienie było łatwiejsze w ten sposób.

Neil
źródło
1

Brainfuck , 232 bajtów

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

Wypróbuj online!

Można grać w golfa znacznie dalej ...

Leaky Nun
źródło
1

JavaScript (przy użyciu biblioteki zewnętrznej) (143 bajty)

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

Objaśnienie kodu: Utwórz zakres od 1 do 9 i dla każdej wartości wpisz wiersz odpowiadający predykatowi złożonemu. Predykat jest przekazywany do bieżącej wartości całkowitej i tworzy zakres obejmujący elementy 10-currentValue, aby utworzyć tyle spacji. Te przestrzenie są łączone z częścią formuły wiersza, a następnie są łączone z krawędzią zakresu dopasowującą liczbę elementów jako frontend, w odwrotnej kolejności.

Uwaga: Na obrazie pierwszy wiersz jest przesunięty o jedną spację, ponieważ konsola dodała znak cudzysłowu, ponieważ zwracaną wartością jest ciąg. Rzeczywista wartość jest poprawnie sformatowana

wprowadź opis zdjęcia tutaj

applejacks01
źródło
1

05AB1E , 24 bajty

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

Wypróbuj online!

Używa nowszej wersji niż wyzwanie, które jest teraz dozwolone.

Erik the Outgolfer
źródło
To nie jest dużo, ale w jeszcze nowszej wersji 05AB1E można usunąć ©i zmienić ®, aby yzapisać bajt.
Kevin Cruijssen
@KevinCruijssen Eh, generalnie nie „aktualizuję” starych odpowiedzi w ten sposób. Ponadto „nowsza wersja” to zupełnie inny język (różne implementacje).
Erik the Outgolfer
1

VBA (Excel), 51 bajtów

Korzystanie z okna natychmiastowego

For z=1To 9:a=a &z:?Spc(9-z)a" x 8 +"z"="a*8+z:Next
remoel
źródło
0

k (77 bajtów)

Prawdopodobnie można go trochę skrócić

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

Przykład:

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
skeevey
źródło
0

golflua, 56 znaków

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

Przykładowy przebieg:

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
człowiek w pracy
źródło