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.

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.


+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.


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

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.


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

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.


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'

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

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

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

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ć.


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!


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


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

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

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

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

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

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


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

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.


1

Brainfuck , 232 bajtów

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

Wypróbuj online!

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


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


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.


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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.