เอาท์พุต Magical 8 Trapezium


41

งานของคุณคือการส่งออก 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
  • เอาต์พุตในภาษาที่คุณเลือกในจำนวนไบต์น้อยที่สุดเท่าที่จะเป็นไปได้
  • สังเกตจำนวนช่องว่างที่จุดเริ่มต้นของแต่ละบรรทัดเพื่อรักษารูปร่างสี่เหลี่ยมคางหมู
  • อนุญาตให้เว้นวรรคต่อท้าย
  • คุณสามารถใช้×หรือตัวอักษร x - ตามที่คุณต้องการ

1
ที่เกี่ยวข้อง (เล็กน้อย ... )
Martin Ender

ต้องการช่องว่างกลางใช่ไหม
หมึกมูลค่า

@ KevinLau-notKenny เป็น แต่คุณสามารถโพสต์ทางเลือกได้เช่นกันหากเป็นเรื่องสำคัญ
rybo111

ตรงกลางกับ 6 ช่องว่างตรงกลาง 6 ช่องดังนั้นไม่ฉันไม่คิดว่ามันจะสำคัญพอ
หมึกมูลค่า

คำตอบ:


15

Python 2, 59 ไบต์

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

ตัวเลขaและiสมการa * 8 + iจะถูกสร้างขึ้นทางคณิตศาสตร์ แต่ละบรรทัดiมีการเพิ่มค่าและaมีการต่อดิa=a*10+iจิตถัดไปผ่าน ตัวอย่างเช่นถ้าa=12345, i=5ไปแล้วiจะกลายเป็น6ดังนั้นใหม่aมีที่ซึ่งเป็น12345*10 + 6123456

การจัดเก็บสิ่งเหล่านี้เป็นตัวเลขแทนที่จะเป็นสตริงช่วยให้เราสามารถคำนวณ RHS ตามที่ได้รับจากสมการa*8+iซึ่งสั้นกว่าการย้อนกลับสตริง


+1 เมื่อเห็นสิ่งนี้ว่าเป็นอะไร - ผลรวมที่สามารถสร้างได้
rybo111

7

V , 37 ไบต์

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

ลองออนไลน์!

สิ่งนี้มี unprintable ดังนั้นนี่คือ 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

05AB1E , 32 31 30 28 ไบต์

รหัส:

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

ใช้การเข้ารหัสCP-1252 ลองออนไลน์! .


.cไม่สามารถใช้งานได้ที่นี่
Magic Octopus Urn

@carusocomputing มันเป็น แต่นั่นเป็นสิ่งที่ท้าทาย
Adnan

Ahhh ... ไม่เห็นเวลาประทับ
Magic Octopus Urn

5

PHP, 105 89 60 57 ไบต์

ลองกอล์ฟครั้งแรกของฉันที่นี่ (ขอบคุณ 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 (ลองเอง)

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

105 (แรก)

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

1
ไม่จำเป็นต้องใช้เครื่องมือจัดฟันรอบคำสั่งเดียว $ i โดดเดี่ยวดีกว่าสอดแทรกโดยตรงในสตริงโดยไม่มีตัวระบุรูปแบบ
จัดการ

1
คุณสามารถวางเพิ่มเติม 23 ไบต์ด้วยเทคนิคเล็กน้อย: การเปลี่ยน @ ++ $ i <= 9 เป็น $ i ++ <9 บันทึก 2 ไบต์ คุณไม่จำเป็นต้องปิดเสียงประกาศเนื่องจากไม่หยุดการทำงานและภายใต้กฎ PPCG มาตรฐานคุณสามารถเพิกเฉย stderr ได้หากต้องการ การเปลี่ยน \ n เป็นอักขระขึ้นบรรทัดใหม่จริงจะบันทึกเป็นไบต์ การเปลี่ยนบิตเข้าร่วม (ช่วง (... )) เป็น $ s. = $ i และ $ t. = 10- $ i บันทึก 15 ไบต์ สิ่งนี้ได้ผลเพราะการบ้านส่งคืนค่าที่ได้รับมอบหมายและเป็นเคล็ดลับที่มีค่าที่สุดที่ฉันได้พบสำหรับการเล่น php 5 ไบต์สุดท้ายมีรายละเอียดตามการผลิตด้านบน
user55641

1
คุณสามารถวาง 2 ไบต์มากขึ้นโดยการแทนที่ด้วย$t.=10-$i tio.run/##K8go@G9jXwAk0/…$s*8+$i
640KB

1
นั่นคือ 59 ไบต์ และ$s*8+$iแทนที่จะ$t.=10-$iบันทึกอีกสองรายการ
ติตัส

5

Pyth, 32 ไบต์

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

ลองออนไลน์!

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

ขอบคุณ @FryAmTheEggman สำหรับการบันทึก 2 ไบต์ ขอบคุณ @KennyLau สำหรับการบันทึก 3 ไบต์


sไม่ได้เข้าร่วมกับพื้นที่ - มันรวมกับไม่มีตัวคั่น
isaacg

@isaacg ฮะและตอนนี้ฉันคิดว่าฉันจะสามารถประหยัดไบต์โดยการเข้าร่วมที่มีพื้นที่
Ven

ไบต์นับจะเป็นแบบเดียวกัน
Leun Nun

4

CJam, 39 38 36 ไบต์

ขอบคุณเครื่องมือเพิ่มประสิทธิภาพสำหรับการบันทึก 2 ไบต์

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

ทดสอบที่นี่

จำนวนไบต์เดียวกัน:

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

ต้องใช้รุ่นล่าสุดพร้อมใช้งานในลองออนไลน์!


9
@Optimizer ตามชื่อของเขาแล้ว!
rybo111

4

Python 2, 87 84 78 75 ไบต์

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

ลองออนไลน์

รุ่นก่อนหน้านี้ใช้เวทมนต์สตริง

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]

การrange(1,10)ส่งสตริงให้[1, 2, 3, 4, 5, 6, 7, 8, 9]และนี่เป็นสิ่งที่ดีเนื่องจากทุกหมายเลขมีเพียงตัวเลขเดียว เพื่อรับสายจากนี้เป็นเรื่องง่ายด้วย123456789 ช่วงที่ตรงกันข้ามคือ`range(1,10)`[1::3] `range(1,10)`[-2::-3]จากนั้นเพื่อให้ได้มากที่สุดเท่าที่ฉันต้องการการทำซ้ำแต่ละครั้งฉันก็ตัดมันที่ทั้ง3*nหรือที่3*(9-n)( 27-3*n) สำหรับตัวเลขที่ตรงกันข้าม


คุณสามารถทำได้for n in range(1,10):print"%9s"%s[:n]+" x 8 + %s = "%n+s[::-1][:n]80 ไบต์
TheBikingViking

s="123456789";n=1;exec'print"%9s"%s[:n],"x 8 + %s ="%n,s[::-1][:n];n+=1;'*9ประหยัดอีกสาม! ลงไปที่ 75.
ลินน์

เยี่ยมมากขอบคุณสำหรับความช่วยเหลือ! เสียดายที่ผมต้องเป็นสองเท่า-slice ครั้งที่สอง ...
mbomb007


4

Ruby, 77 73 65 60 ไบต์

ลองออนไลน์สิ ~

การปรับปรุงครั้งใหญ่จาก @ manatwork

ยกเครื่องอื่นจาก @xsot

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

puts'%9d x 8 + %d = %d'%[k=[*1..i]*'',i,k.to_i*8+i]ดูเหมือนว่าจะสั้นลงด้วยสตริงรูปแบบ:
จัดการ

(1..9).map1.upto(9)
จัดการ

อาฉันไม่รู้เกี่ยวกับ%9dการเป็นตัวเลือกการจัดรูปแบบเพื่อปัดเลขจำนวนเต็มเช่นนั้น
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 นั้นยอดเยี่ยม! ไม่คิดว่าจะคำนวณจำนวนเริ่มต้นเช่นนั้น
หมึกมูลค่า

4

Java 10, 151 133 130 129 126 110 ไบต์

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

ลองออนไลน์

คำอธิบาย:

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
ฉันคิดว่าคุณสามารถบันทึกไบต์โดยใช้xแทนเครื่องหมายการคูณ
wizzwizz4

1
คุณสามารถบันทึกคู่ของไบต์โดยเริ่มต้นsไป"\n"และลบ"\n"+จากforวง
cliffroot

@ wizzwizz4 ขอบคุณ ควรจะรู้×คือ 2 ไบต์แทน 1 เช่นx..
เควิน Cruijssen

คุณไม่ได้เพิ่มsลงในผลลัพธ์ในการทำซ้ำแต่ละครั้งหรือไม่
หน้าผา

ฉันรู้ว่ามันเก่า แต่คุณทำreturn oแทนSystem.out.print(o)ไม่ได้ใช่ไหม นอกจากนี้คุณสามารถเปลี่ยนเป็น Java 10 และบันทึกด้วยvarและ lambdas
ศูนย์รวมของความไม่รู้


3

C #, 113 ไบต์

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

หากคุณมีวิธีการปรับปรุงวิธีแก้ปัญหานี้อย่าลังเลที่จะแบ่งปัน


คุณสามารถบันทึก 1 ไบต์โดยการเอาพื้นที่: ในสำหรับวงสามารถเปลี่ยนเป็น;n=10*n+ ++i ;n=++i+10*nนอกจากนี้ยังสามารถเปลี่ยนเป็น+" x "+"8 + "+ +" x 8 + "+เพื่อประหยัดอีก 3 ไบต์
Kevin Cruijssen

เป็นโมฆะ f () {สำหรับ (int n = 1, i = 1; i <10; n = ++ ฉัน + 10 * n) Console.WriteLine ($ "{สตริงใหม่ ('', 9-i)} {n } x 8 + {i} = {(n * 8 + i)} ");} ------------ คุณบันทึกไบต์!
downrep_nation

3

แบตช์ 117 ไบต์

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

ใช่นั่นคือเครื่องหมาย 16% ในหนึ่งบรรทัด นั่นคือชุดของคุณ!


2

Haskell, 92 ไบต์

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

มันทำงานอย่างไร:

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

PowerShell v2 +, 85 64 58 57 52 ไบต์

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

วนซ้ำจาก 8 เป็น 0 8..0|%{...}ผ่านโอเปอเรเตอร์ช่วง การวนซ้ำแต่ละครั้งเราส่งออกการรวมสตริงที่ประกอบด้วย (จำนวนช่องว่างที่เหมาะสม" "*$_) บวก-joinสตริง ed ของ (ช่วงจาก1ไปยังหมายเลขผู้ช่วยที่เพิ่มขึ้นล่วงหน้า++$iบวกบิตกลาง" x 8 + $i = "และช่วงสุดท้ายจาก9ไปยังหมายเลขปัจจุบัน$_ก่อน -incremented)

เคล็ดลับสำคัญอย่างหนึ่งที่นี่คือเราใช้ประโยชน์จาก "การตั้งค่าด้านซ้าย" สำหรับ typecasting ซึ่งช่วยให้เรา "เพิ่ม" อาร์เรย์เข้าด้วยกันภายใน-joinparens ซึ่งหมายความว่าเราใช้-joinตัวดำเนินการเดียวเท่านั้น

ตัวอย่าง

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
%{ดวงตาของคุณสบายดีไหม?
gcampbell

@ gcampbell ถ้าดวงตาของคุณดูเหมือนคุณจะทำหน้าบึ้งเกินไป
AdmBorkBork

ขึ้นอยู่กับว่าแบบอักษรของคุณแสดงผลเป็นเปอร์เซ็นต์อย่างไร
gcampbell


2

J, 51 ไบต์

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

สร้างสตริง 123456789และดำเนินการกับคำนำหน้าและคำต่อท้ายของมันเพื่อสร้างผลลัพธ์

การใช้

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

ใช้ประโยชน์จากrepeatวิธีการใหม่backticks และ templating ...

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

พี่ชายที่ดีคุณควรพิจารณาที่จะลบที่ว่างและใช้alertแทนconsole.logมันสามารถบันทึกบางไบต์!
chau giang

ให้ฉันตอบนี้ก่อนเที่ยงคืนฉันคิดว่าฉันเกือบครึ่งหลับ ... ฉันจะโพสต์การอัปเดตเกี่ยวกับเรื่องนี้ในไม่ช้า LOL
WallyWest

2

R, 107 103 ไบต์

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)

ผลลัพธ์ :

        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 ไบต์SBCS

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

ลองออนไลน์!

-9 ไบต์โดยใช้10⊥เคล็ดลับในการแยกตัวเลขแทนการลด ขอบคุณ @ Adámสำหรับ -13!

คำอธิบาย:

    ((¯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 ไบต์

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

ซึ่ง\nหมายถึงอักขระขึ้นบรรทัดใหม่ตามตัวอักษร รุ่นที่สองจะแสดงบรรทัดขึ้นบรรทัดใหม่ ฉันคิดสูตรสำหรับตัวเลข('1'.repeat(9-i)+0+i)/9แต่การขยายนั้นง่ายกว่าที่จะทำแบบนี้



1

Javascript (ใช้ไลบรารีภายนอก) (143 ไบต์)

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

ลิงก์ไปยัง lib: https://github.com/mvegh1/Enumerable/

คำอธิบายของรหัส: สร้างช่วง 1 ถึง 9 และสำหรับแต่ละค่าเขียนบรรทัดที่สอดคล้องกับเพรดิเคตที่ซับซ้อน เพรดิเคตถูกส่งผ่านค่าจำนวนเต็มปัจจุบันและสร้างช่วงซึ่งครอบคลุมองค์ประกอบ 10-currentValue เพื่อสร้างช่องว่างจำนวนมาก ช่องว่างเหล่านั้นถูกต่อกับส่วนสูตรของบรรทัดและจากนั้นจะต่อกับส่วนท้ายของช่วงที่ตรงกับจำนวนขององค์ประกอบเป็นส่วนหน้าในลำดับย้อนกลับ

หมายเหตุ: ในอิมเมจบรรทัดแรกจะถูกปิดโดยหนึ่งช่องว่างเนื่องจากคอนโซลเพิ่มเครื่องหมายคำพูดเนื่องจากค่าส่งคืนเป็นสตริง ค่าจริงถูกจัดรูปแบบอย่างถูกต้อง

ป้อนคำอธิบายรูปภาพที่นี่


1

05AB1E , 24 ไบต์

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

ลองออนไลน์!

ใช้เวอร์ชันที่ใหม่กว่าความท้าทายซึ่งขณะนี้ได้รับอนุญาต


มันไม่มาก แต่ในรุ่นใหม่ของแม้ 05AB1E คุณสามารถลบ©และเปลี่ยน®ไปyเพื่อประหยัดไบต์
Kevin Cruijssen

@KevinCruijssen เอ๊ะฉันไม่ปกติ "อัปเดต" คำตอบเก่า ๆ แบบนั้น นอกจากนี้ "เวอร์ชั่นที่ใหม่กว่า" เป็นภาษาที่แตกต่างกันโดยสิ้นเชิง
Erik the Outgolfer



0

k (77 ไบต์)

อาจสั้นลงอีกเล็กน้อย

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

ตัวอย่าง:

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 ตัวอักษร

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

วิ่งตัวอย่าง:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.