Menghasilkan Trapesium 8 Magis


41

Tugas Anda adalah menghasilkan Trapesium Magical 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
  • Output dalam bahasa yang Anda pilih dalam byte sesedikit mungkin.
  • Perhatikan jumlah spasi di awal setiap baris untuk mempertahankan bentuk trapesium.
  • Ruang tambahan diperbolehkan.
  • Anda dapat menggunakan ×atau huruf x - mana yang Anda inginkan.

1
Terkait (sedikit ...)
Martin Ender

Diperlukan ruang tengah, ya?
Nilai Tinta

@ KevinLau-notKenny, tapi Anda selalu bisa memposting alternatif jika itu signifikan.
rybo111

Ini 6 byte yang sesuai dengan 6 spasi di tengah, jadi tidak, saya tidak berpikir itu cukup signifikan.
Nilai Tinta

Jawaban:


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

Angka-angka adan ipersamaan a * 8 + idihasilkan secara hitung. Setiap baris, ibertambah, dan adigit berikutnya ditambahkan melalui a=a*10+i. Misalnya, jika a=12345, i=5, maka imenjadi 6, maka yang baru aadalah 12345*10 + 6yang mana 123456.

Menyimpan ini sebagai angka daripada string memungkinkan kita menghitung RHS seperti yang diberikan oleh persamaan a*8+i, yang lebih pendek dari pembalikan string.


+1 untuk melihat ini apa adanya - jumlah yang dapat dihasilkan
rybo111

7

V , 37 byte

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

Cobalah online!

Ini mengandung yang tidak patut dicetak, jadi inilah 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

golf pertama saya coba di sini (terima kasih kepada 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 (percobaan saya sendiri)

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

105 (pertama)

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

1
Tidak perlu untuk kawat gigi di sekitar satu pernyataan. $ I sendiri lebih baik diinterpolasi langsung dalam string tanpa penentu format.
manatwork

1
Anda dapat menjatuhkan 23 byte lebih banyak dengan beberapa trik: Mengubah @ ++ $ i <= 9 menjadi $ i ++ <9 menghemat 2 byte. Anda tidak perlu membungkam pemberitahuan karena tidak menghentikan eksekusi dan di bawah aturan PPCG standar, Anda dapat mengabaikan stderr jika mau. Mengubah \ n ke karakter baris baru yang sebenarnya menghemat satu byte. Mengubah bit join (range (...)) menjadi $ s = $ i dan $ t. = 10- $ i menghemat 15 byte. Ini berfungsi karena tugas mengembalikan nilai yang diberikan dan merupakan trik paling berharga yang saya temukan untuk golf php. 5 byte terakhir dirinci oleh manatwork di atas
user55641

1
Anda dapat menjatuhkan 2 byte lebih banyak dengan menggantinya $t.=10-$idengan $s*8+$i. tio.run/##K8go@G9jXwAk0/…
640KB

1
Itu 59 byte. Dan $s*8+$ibukannya $t.=10-$imenyimpan dua lagi.
Titus

5

Pyth, 32 byte

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

Cobalah 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

Terima kasih kepada @FryAmTheEggman karena telah menghemat 2 byte. Terima kasih kepada @KennyLau untuk menghemat 3 byte.


stidak bergabung dengan ruang - ia bergabung tanpa pembatas.
isaacg

@isaacg hah, dan sekarang saya berpikir saya bisa menghemat byte dengan bergabung dengan space
Ven

Penghitungan byte akan sama .
Leaky Nun

4

CJam, 39 38 36 byte

Terima kasih kepada Pengoptimal untuk menghemat 2 byte.

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

Uji di sini.

Jumlah byte yang sama:

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

Ini memerlukan versi terbaru, tersedia di Coba online!


9
@Optimizer memenuhi namanya, kalau begitu!
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

Cobalah online

Versi sebelumnya menggunakan beberapa string magic.

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]

Casting range(1,10)ke string memberi [1, 2, 3, 4, 5, 6, 7, 8, 9], dan ini bagus karena setiap angka hanya satu digit. Jadi mendapatkan string 123456789dari ini mudah dengan `range(1,10)`[1::3]. Kisaran terbalik adalah `range(1,10)`[-2::-3]. Kemudian, untuk mendapatkan hanya sejauh yang saya inginkan setiap iterasi, saya memotongnya di salah satu 3*n, atau di 3*(9-n)( 27-3*n) untuk digit terbalik.


Anda dapat melakukannya for n in range(1,10):print"%9s"%s[:n]+" x 8 + %s = "%n+s[::-1][:n]untuk 80 byte.
TheBikingViking

s="123456789";n=1;exec'print"%9s"%s[:n],"x 8 + %s ="%n,s[::-1][:n];n+=1;'*9hemat tiga lagi! Turun ke 75.
Lynn

Bagus, terima kasih atas bantuannya! Sayang sekali saya harus mengiris dua kali untuk yang kedua ...
mbomb007

4

Perl, 49 byte

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

Pemakaian

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

4

Ruby, 77 73 65 60 byte

Cobalah online ~

Perubahan besar dari @manatwork

Perombakan lain dari @xsot

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

Tampaknya menjadi lebih pendek dengan format string: puts'%9d x 8 + %d = %d'%[k=[*1..i]*'',i,k.to_i*8+i].
manatwork

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

Ah, saya tidak tahu tentang %9dmenjadi opsi pemformatan untuk membuat bilangan bulat seperti itu
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, itu hebat! Tidak terpikir untuk menghitung angka awal seperti itu.
Nilai Tinta

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

Cobalah online.

Penjelasan:

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
Saya pikir Anda bisa menyimpan byte dengan menggunakan xalih-alih tanda perkalian.
wizzwizz4

1
Anda dapat menyimpan beberapa byte dengan menginisialisasi suntuk "\n"dan menghapus "\n"+dari forlingkaran
cliffroot

@ wizzwizz4 Terima kasih. Seharusnya tahu ×adalah 2 byte, bukan 1 seperti x..
Kevin Cruijssen

Tidakkah Anda menambahkan shasil pada setiap iterasi juga?
cliffroot

Aku tahu ini sudah tua, tapi tidak bisa Anda lakukan return obukan System.out.print(o)? Juga, Anda dapat mengubah ke Java 10 dan menyimpan dengan vardan lambdas
Perwujudan Ketidaktahuan

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

jika Anda tetap harus meningkatkan solusi ini, jangan ragu untuk berbagi.


Anda dapat menyimpan 1 byte dengan menghapus spasi: ;n=10*n+ ++ifor-loop dapat diubah menjadi ;n=++i+10*n. Juga, +" x "+"8 + "+bisa diubah menjadi +" x 8 + "+. untuk menghemat 3 byte lagi.
Kevin Cruijssen

membatalkan f () {untuk (int n = 1, i = 1; i <10; n = ++ i + 10 * n) Console.WriteLine ($ "{string baru ('', 9-i)} {n } x 8 + {i} = {(n * 8 + i)} ");} ------------ menyelamatkan Anda satu byte!
downrep_nation

3

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

Ya, itu adalah 16% tanda pada satu baris; itu Batch untukmu!


2

Haskell, 92 byte

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

Bagaimana itu bekerja:

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

Hitungan byte mengasumsikan penyandian ISO 8859-1. Linefeed terkemuka sangat penting.


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

Cobalah online!


2

Pyke, 30 29 byte

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

Coba di sini!

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

Loop dari 8 hingga 0 8..0|%{...}melalui operator jangkauan. Setiap iterasi, kita output Rangkaian string yang terdiri dari (jumlah yang tepat dari ruang " "*$_), ditambah -joinserangkaian ed dari (berkisar dari 1ke sejumlah pembantu pra-bertambah ++$i, ditambah sedikit tengah " x 8 + $i = ", ditambah kisaran akhir dari 9pada jumlah saat $_pra -tingkat).

Satu trik besar di sini adalah kita memanfaatkan "preferensi kiri" untuk typecasting, yang memungkinkan kita untuk "menambahkan" array bersama di dalam -joinparens, yang berarti kita hanya menggunakan satu -joinoperator.

Contoh

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
%{Apakah matamu baik-baik saja?
gcampbell

@ gcampbell Jika mata Anda terlihat seperti itu, Anda juga akan mengerutkan kening.
AdmBorkBork

Tergantung bagaimana font Anda menghasilkan persen.
gcampbell


2

J, 51 byte

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

Membuat string 123456789dan kemudian beroperasi pada awalan dan akhiran untuk membuat output.

Pemakaian

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

Mengambil keuntungan dari repeatmetode baru , backticks dan templating ...

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

bro pekerjaan yang bagus, Anda harus mempertimbangkan untuk menghapus beberapa ruang dan menggunakan alertalih-alih console.log, itu dapat menghemat beberapa byte!
chau giang

Mengingat saya menjawab ini tepat sebelum tengah malam saya pikir saya hampir setengah tertidur ... Saya akan memposting pembaruan tentang ini segera. 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)}

Tidak Disatukan:

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)

Hasil:

        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

Cobalah online!

-9 byte dengan menggunakan 10⊥trik untuk menguraikan angka, bukan pengurangan. Terima kasih kepada @ Adám untuk -13!

Penjelasan:

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

Dimana \nmewakili karakter baris baru literal. Versi kedua menghasilkan baris tambahan. Saya datang dengan formula untuk angka ('1'.repeat(9-i)+0+i)/9tetapi padding lebih mudah dilakukan dengan cara ini.


1

Brainfuck , 232 byte

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

Cobalah online!

Dapat bermain golf lebih jauh ...


1

Javascript (menggunakan perpustakaan eksternal) (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(""))

Tautan ke lib: https://github.com/mvegh1/Enumerable/

Penjelasan kode: Buat rentang 1 hingga 9, dan untuk setiap nilai, tulis baris yang sesuai dengan predikat kompleks. Predikat ini dilewatkan nilai integer saat ini, dan menciptakan rentang yang mencakup elemen 10-currentValue, untuk membuat banyak ruang. Ruang-ruang tersebut disatukan dengan bagian formula dari garis, dan kemudian disatukan dengan penjahit rentang yang cocok dengan jumlah elemen sebagai garis depan, dalam urutan terbalik.

Catatan: Pada gambar, baris pertama dimatikan oleh satu spasi karena konsol menambahkan tanda kutip karena nilai kembali adalah string. Nilai aktual diformat dengan benar

masukkan deskripsi gambar di sini


1

05AB1E , 24 byte

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

Cobalah online!

Menggunakan versi yang lebih baru daripada tantangan, yang sekarang diizinkan.


Itu tidak banyak, tetapi dalam versi yang lebih baru bahkan dari 05AB1E Anda dapat menghapus ©, dan mengubah ®untuk ymenyimpan byte.
Kevin Cruijssen

@KevinCruijssen Eh, saya biasanya tidak "memperbarui" jawaban lama seperti itu. Juga, "versi yang lebih baru" adalah bahasa yang sama sekali berbeda (implementasi yang berbeda).
Erik the Outgolfer


1

VBA (Excel), 51 byte

Menggunakan Jendela Segera

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

0

k (77 byte)

Mungkin bisa dipersingkat sedikit lagi

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

Contoh:

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 karakter

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

Contoh dijalankan:

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.