Xuất ra một Trapezium Magical 8


41

Nhiệm vụ của bạn là xuất ra một 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
  • Đầu ra trong ngôn ngữ bạn đã chọn trong vài byte nhất có thể.
  • Lưu ý số lượng khoảng trống ở đầu mỗi dòng để duy trì hình dạng hình thang.
  • Không gian lưu trữ được cho phép.
  • Bạn có thể sử dụng ×hoặc chữ x - bất cứ điều gì bạn thích.


Không gian giữa là bắt buộc, có?
Mực giá trị

@ KevinLau-notKenny, nhưng bạn luôn có thể đăng một giải pháp thay thế nếu nó quan trọng.
rybo111

Đó là 6 byte tương ứng với 6 khoảng trống ở giữa, vì vậy không, tôi không nghĩ nó đủ quan trọng.
Mực giá trị

Câu trả lời:


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

Các số aiphương trình a * 8 + iđược tạo ra một cách hợp lý. Mỗi dòng, iđược tăng lên và acó chữ số tiếp theo được nối qua a=a*10+i. Ví dụ, nếu a=12345, i=5, sau đó itrở thành 6, vì vậy mới a12345*10 + 6đó là 123456.

Lưu trữ chúng dưới dạng số chứ không phải chuỗi cho phép chúng ta tính toán RHS như được đưa ra bởi phương trình a*8+i, ngắn hơn so với đảo ngược chuỗi.


+1 để thấy điều này vì nó là gì - một khoản tiền có thể được tạo ra
rybo111

7

V , 37 byte

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

Hãy thử trực tuyến!

Điều này chứa không thể in được, vì vậy đây là một 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

lần chơi gôn đầu tiên của tôi ở đây (nhờ 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 (cố gắng của riêng tôi)

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

105 (đầu tiên)

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

1
Không cần niềng răng xung quanh một tuyên bố duy nhất. $ I một mình tốt hơn nội suy trực tiếp trong chuỗi mà không cần định dạng định dạng.
manatwork

1
Bạn có thể giảm thêm 23 byte bằng một vài thủ thuật: Thay đổi @ ++ $ i <= 9 thành $ i ++ <9 tiết kiệm 2 byte. Bạn không cần phải im lặng thông báo vì chúng không dừng thực thi và theo quy tắc PPCG tiêu chuẩn, bạn có thể bỏ qua thiết bị lỗi chuẩn nếu bạn muốn. Thay đổi \ n thành một ký tự dòng mới thực tế sẽ tiết kiệm một byte. Thay đổi các bit nối (phạm vi (...)) thành $ s. = $ I và $ t. = 10- $ i tiết kiệm 15 byte. Điều này hoạt động vì các bài tập trả về giá trị được gán và gần như là mẹo có giá trị nhất mà tôi đã tìm thấy để chơi golf php. 5 byte cuối cùng được chi tiết bằng cách thao tác ở trên
user55641

1
Bạn có thể giảm thêm 2 byte bằng cách thay thế $t.=10-$ibằng $s*8+$i. tio.run/##K8go@G9jXwAk0/ Kẻ
640KB

1
Đó là 59 byte. Và $s*8+$ithay vì $t.=10-$itiết kiệm thêm hai.
Tít

5

Bình thường, 32 byte

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

Hãy thử trực tuyến!

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

Cảm ơn @FryAmTheEggman vì đã lưu 2 byte. Cảm ơn @KennyLau vì đã lưu 3 byte.


skhông tham gia với không gian - nó tham gia không có dấu phân cách.
isaacg

@isaacg hah, và bây giờ tôi nghĩ rằng tôi có thể tiết kiệm một byte bằng cách tham gia với không gian
Ven

Số lượng byte sẽ giống nhau .
Leaky Nun


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

Dùng thử trực tuyến

Một phiên bản trước sử dụng một số phép thuật chuỗi.

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]

Truyền range(1,10)tới một chuỗi cho [1, 2, 3, 4, 5, 6, 7, 8, 9], và điều này là tốt vì mỗi số chỉ là một chữ số. Vì vậy, nhận được chuỗi 123456789từ này là đơn giản với `range(1,10)`[1::3]. Phạm vi đảo ngược là `range(1,10)`[-2::-3]. Sau đó, để chỉ đi xa như tôi muốn mỗi lần lặp, tôi cắt nó ở một trong hai 3*nhoặc tại 3*(9-n)( 27-3*n) cho các chữ số đảo ngược.


Bạn có thể làm for n in range(1,10):print"%9s"%s[:n]+" x 8 + %s = "%n+s[::-1][:n]cho 80 byte.
TheBikingViking

s="123456789";n=1;exec'print"%9s"%s[:n],"x 8 + %s ="%n,s[::-1][:n];n+=1;'*9tiết kiệm thêm ba! Xuống đến 75.
Lynn

Rất vui, cảm ơn vì sự giúp đỡ! Thật tệ, tôi đã phải cắt đôi lần thứ hai ...
mbomb007

4

Perl, 49 byte

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

Sử dụng

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

4

Ruby, 77 73 65 60 byte

Dùng thử trực tuyến ~

Cải tiến lớn từ @manatwork

Một đại tu khác từ @xsot

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

Có vẻ ngắn hơn với chuỗi định dạng : puts'%9d x 8 + %d = %d'%[k=[*1..i]*'',i,k.to_i*8+i].
manatwork

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

À, tôi không biết về việc %9dtrở thành một tùy chọn định dạng cho các số nguyên như thế
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 thật tuyệt! Không nghĩ đến việc tính số ban đầu như thế.
Mực giá trị

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

Hãy thử trực tuyến.

Giải trình:

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
Tôi nghĩ rằng bạn có thể lưu byte bằng cách sử dụng xthay vì dấu nhân.
wizzwizz4

1
Bạn có thể tiết kiệm một vài byte bằng cách khởi tạo sđến "\n"và loại bỏ "\n"+khỏi forvòng lặp
cliffroot

@ wizzwizz4 Cảm ơn. ×x
Đáng

Bạn không thêm svào kết quả trên mỗi lần lặp sao?
vách đá

Tôi biết điều này đã cũ, nhưng bạn không thể làm gì return othay thế System.out.print(o)? Ngoài ra, bạn có thể thay đổi thành Java 10 và lưu với varvà lambdas
Hiện thân của sự thiếu hiểu biết

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

nếu bạn có cách nào để cải thiện giải pháp này, hãy chia sẻ.


Bạn có thể lưu 1 byte bằng cách xóa khoảng trắng: ;n=10*n+ ++itrong vòng lặp for có thể được thay đổi thành ;n=++i+10*n. Ngoài ra, +" x "+"8 + "+có thể được thay đổi thành +" x 8 + "+. để tiết kiệm thêm 3 byte.
Kevin Cruijssen

void f () {for (int n = 1, i = 1; i <10; n = ++ i + 10 * n) Console.WriteLine ($ "{chuỗi mới ('', 9-i)} {n } x 8 + {i} = {(n * 8 + i)} ");} ------------ đã tiết kiệm cho bạn một byte!
hạ cấp

3

Mẻ, 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%%

Vâng, đó là 16% dấu hiệu trên một dòng; Đó là Batch cho bạn!


2

Haskell, 92 byte

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

Làm thế nào nó hoạt động:

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 byte

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

Hãy thử nó ở đây!

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

Vòng lặp từ 8 đến 0 8..0|%{...}thông qua toán tử phạm vi. Mỗi lần lặp, chúng tôi đưa ra một phép nối chuỗi bao gồm (số lượng khoảng trắng thích hợp " "*$_), cộng với một -joinchuỗi ed (một phạm vi từ 1đến số của trình trợ giúp tăng trước ++$i, cộng với bit giữa " x 8 + $i = ", cộng với phạm vi cuối cùng từ trước 9số hiện tại $_-tăng lên).

Một mẹo lớn ở đây là chúng ta tận dụng "ưu tiên bên trái" để đánh máy, cho phép chúng ta "thêm" các mảng lại với nhau bên trong các ô -join, nghĩa là chúng ta chỉ sử dụng một -jointoán tử.

Thí dụ

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
%{Mắt bạn có ổn không?
gcampbell

@gcampbell Nếu đôi mắt của bạn trông như thế, bạn cũng sẽ nhăn mặt.
admBorkBork

Phụ thuộc vào cách phông chữ của bạn hiển thị phần trăm.
gcampbell


2

J, 51 byte

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

Tạo chuỗi 123456789và sau đó hoạt động trên các tiền tố và hậu tố của chuỗi để tạo đầu ra.

Sử dụng

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

Tận dụng repeatphương pháp mới , backticks và templating ...

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

công việc tốt, bạn nên xem xét để loại bỏ một số không gian và sử dụng alertthay vì console.log, nó có thể tiết kiệm một số byte!
chau giang

Cho rằng tôi đã trả lời điều này ngay trước nửa đêm. Tôi nghĩ rằng tôi đã gần ngủ được một nửa ... Tôi sẽ sớm cập nhật thông tin này. 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)}

Ung dung:

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)

Kết quả :

        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

Hãy thử trực tuyến!

-9 byte bằng cách sử dụng 10⊥thủ thuật để phân tích số, thay vì giảm. Cảm ơn @ Adám cho -13!

Giải trình:

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

Trường hợp \nđại diện cho một nhân vật dòng chữ mới. Phiên bản thứ hai xuất ra một dòng mới. Tôi đã đưa ra một công thức cho các con số ('1'.repeat(9-i)+0+i)/9nhưng phần đệm dễ dàng hơn để làm theo cách này.


1

Brainfuck , 232 byte

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

Hãy thử trực tuyến!

Có thể chơi gôn hơn nữa ...


1

Javascript (sử dụng thư viện bên ngoài) (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(""))

Liên kết đến lib: https://github.com/mvegh1/Enumerable/

Giải thích mã: Tạo phạm vi từ 1 đến 9 và với mỗi giá trị, hãy viết một dòng tương ứng với vị từ phức. Vị từ được truyền giá trị số nguyên hiện tại và tạo một phạm vi bao gồm các phần tử 10-currentValue, để tạo ra nhiều khoảng trắng đó. Các không gian đó được nối với phần công thức của dòng và sau đó được nối với phần đuôi của phạm vi khớp với số phần tử là giao diện, theo thứ tự ngược lại.

Lưu ý: Trong hình ảnh, dòng đầu tiên bị tắt bởi một khoảng trắng vì bảng điều khiển đã thêm dấu ngoặc kép vì giá trị trả về là một chuỗi. Giá trị thực được định dạng chính xác

nhập mô tả hình ảnh ở đây


1

05AB1E , 24 byte

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

Hãy thử trực tuyến!

Sử dụng một phiên bản mới hơn so với thử thách, hiện đã được cho phép.


Đó không phải là nhiều, nhưng trong phiên bản mới hơn của thậm chí 05AB1E bạn có thể loại bỏ các ©, và thay đổi ®để ytiết kiệm một byte.
Kevin Cruijssen

@KevinCruijssen Eh, tôi thường không "cập nhật" các câu trả lời cũ như thế. Ngoài ra, "phiên bản mới hơn" là một ngôn ngữ hoàn toàn khác (cách triển khai khác nhau).
Erik the Outgolfer


1

VBA (Excel), 51 byte

Sử dụng cửa sổ ngay lập tức

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

0

k (77 byte)

Có lẽ có thể rút ngắn thêm một chút

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

Thí dụ:

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 ký tự

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

Chạy mẫu:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.