เล่นกอล์ฟแบบจีน 9 * 9 หลายโต๊ะ


18

เอาท์พุทตารางต่อไปนี้:

一一得一
一二得二 二二得四
一三得三 二三得六 三三得九
一四得四 二四得八 三四十二 四四十六
一五得五 二五一十 三五十五 四五二十 五五二十五
一六得六 二六十二 三六十八 四六二十四 五六三十 六六三十六
一七得七 二七十四 三七二十一 四七二十八 五七三十五 六七四十二 七七四十九
一八得八 二八十六 三八二十四 四八三十二 五八四十 六八四十八 七八五十六 八八六十四
一九得九 二九十八 三九二十七 四九三十六 五九四十五 六九五十四 七九六十三 八九七十二 九九八十一

หรือคุณสามารถใช้ตัวอักษรสามตัวแรกเป็นคำภาษาอังกฤษในกรณีที่บางภาษาไม่รองรับตัวอักษรจีน:

OneOneGetOne
OneTwoGetTwo TwoTwoGetFou
OneThrGetThr TwoThrGetSix ThrThrGetNin
OneFouGetFou TwoFouGetEig ThrFouTenTwo FouFouTenSix
OneFivGetFiv TwoFivOneTen ThrFivTenFiv FouFivTwoTen FivFivTwoTenFiv
OneSixGetSix TwoSixTenTwo ThrSixTenEig FouSixTwoTenFou FivSixThrTen SixSixThrTenSix
OneSevGetSev TwoSevTenFou ThrSevTwoTenOne FouSevTwoTenEig FivSevThrTenFiv SixSevFouTenTwo SevSevFouTenNin
OneEigGetEig TwoEigTenSix ThrEigTwoTenFou FouEigThrTenTwo FivEigFouTen SixEigFouTenEig SevEigFivTenSix EigEigSixTenFou
OneNinGetNin TwoNinTenEig ThrNinTwoTenSev FouNinThrTenSix FivNinFouTenFiv SixNinFivTenFou SevNinSixTenThr EigNinSevTenTwo NinNinEigTenOne

คุณสามารถส่งออกในรูปแบบที่เหมาะสมเช่นข้อความธรรมดาคั่นด้วยช่องว่าง / เครื่องหมายจุลภาค / แท็บและขึ้นบรรทัดใหม่อาร์เรย์ 2D ที่ว่างเปล่าว่างเปล่าหรือไม่มีอยู่ (สถานที่ 2 * 1 ว่างเปล่าดังนั้นไม่ควรมีอะไรใน อาร์เรย์)

รหัสกอล์ฟรหัสที่สั้นที่สุดเป็นไบต์ชนะ อนุญาตการเข้ารหัส GBK โดยที่ตัวอักษรจีนแต่ละตัวใช้ 2 ไบต์

ตารางการแปลง:

一   One
二   Two
三   Thr
四   Fou
五   Fiv
六   Six
七   Sev
八   Eig
九   Nin
十   Ten
得   Get

ส่วนที่เหลือดูเหมือนจะค่อนข้างเป็นธรรมชาติ แต่อย่างน้อยคุณสามารถอธิบายได้ว่า十และ得ทำงานอย่างไร?
Dennis

得ใช้เฉพาะเมื่อผลิตภัณฑ์มีขนาดเล็กกว่า 10
l4m2

อ๊ะถ้าเป็นมากกว่านั้น 10 แทนที่จะเป็น得เราควรใช้十?
Luis felipe De jesus Munoz

@LuisfelipeDejesusMunoz และ [11,19] มีความพิเศษด้วยเปลือย bare
FrownyFrog

Translation 能确认这是正确的。 (การแปล: ฉันสามารถยืนยันได้ว่าสิ่งนี้ถูกต้อง)
ผลไม้ที่แยกออก

คำตอบ:


8

Stax , 66 ตัวอักษร

9mYF"得一二三四五六七八九"cacy*~@ny@\p;11AH:b!n;A/X@]z?px'十z?p,A%sn@]z?' +qD

จำนวนไบต์ขึ้นอยู่กับการเข้ารหัสที่ใช้สำหรับตัวอักษรจีน

เรียกใช้และแก้ไขข้อบกพร่องออนไลน์!

คำอธิบาย

9mYF...D    Loop `n` times and print a newline after each loop, `n`=1..9

"..."cay*~@ny@\p
"..."c              Push the string and duplicate it
      ay            Fetch the outer loop variable
        *           Multiply with the inner loop variable
         ~          Move the product to input stack for later use
          @         Take character at the index specified by inner loop variable
           ny@      Take character at the index specified by outer loop variable
              \p    Print the two characters

;11AH:b!n;A/X@]z?p
;11AH:b!        ?p    Is the product not in range [11,20)?
                      Output (*) if true, (**) if false.
        n;A/X@        Character at the index of the "ten" digit of product
              ]       Convert character to string (*)
               z      Empty string (**)

x'十z?p,A%sn@]z?' +q
x'十z?p                Print "十" if the "ten" digit is non-zero, nothing otherwise
       ,A%sn@]z?       Get the character specified by the last digit if that digit is non-zero, empty string otherwise
                ' +q   Append a space and print

รุ่นทางเลือก (Stax 1.0.6), 59 ไบต์ (โดย @recursive)

สิ่งนี้ใช้คุณสมบัติที่ได้รับแรงบันดาลใจจากความท้าทายนี้และรวมอยู่ใน Stax 1.0.6 เท่านั้นซึ่งจะเป็นการโพสต์ความท้าทาย

éz░╖▐5à{│`9[mLùÜ•ëO╞îπl▼Γ─§╥|▒╛Δ◙Φµ'r╠eƒÿQ╫s♪Ω]£ï♪D3╚F◙δÿ%‼

เวอร์ชัน ASCII คือ

9mX{x\_x*YA/]yA-y20<*!*+y9>A*+yA%]0-+"NT|,,t.%,p&()(!'^pq kzi !X6"!s@mJ

รุ่นนี้สร้างอาร์เรย์ดัชนีแล้วใช้มันเพื่อดัชนีสตริงของตัวอักษรจีนที่จะหลีกเลี่ยงการดำเนินงานของสแต็คซ้ำซ้อน ( c, a, n) และหลาย@s

คำอธิบาย

9mX{...m    Loop `n` times and map `1..n` to a list of strings, `n`=1..9
        J   Join the strings with space and print with a newline

x\_x*YA/]yA-y20<*!*+y9>A*+yA%]0-+"..."!s@
x\                                           A pair: (inner loop variable, outer loop variable)
  _x*Y                                       Product of inner and outer loop variable
      A/                                     floor(product/10)
        ]                                    [floor(product/10)]
         yA-                                 Product does not equal 10
            y20<                             Product is less than 20
                *!                           `Nand` of them
                                             This is true (1) if the product is in the range {10}U[20,81]
                  *                          Repeat [floor(product/10)] this many times
                                             This results in itself if the predicate above is true, or empty array if it is false
                   +                         Add it to the list of [inner loop var, outer loop var]
                                             This list will be used to index the string "得一二三四五六七八九十"
                    y9>A*                    Evaluates to 10 if the product is larger than 9, 0 otherwise
                                             When indexed, they become "十" and "得", respectively
                         +                   Append to the list of indices
                          yA%                Product modulo 10
                             ]0-             [Product modulo 10] if that value is not zero, empty array otherwise
                                +            Append to the list of index
                                 "..."!      "得一二三四五六七八九十"
                                       s@    Index with constructed array

Stax 1.0.6 สามารถทำได้ใน59แต่มันลงวันที่ท้าทายดังนั้นจึงไม่มีคุณสมบัติ IMO
เรียกซ้ำ

น่าเอ่ยถึงเลยล่ะค่ะ นอกจากนี้ยังเห็นได้ชัดว่าใช้การเพิ่มประสิทธิภาพบางอย่างที่ยังมีอยู่ก่อน 1.0.6
Weijun Zhou

1
ฉันสงสัยว่ายังมีห้องเพิ่มประสิทธิภาพเหลืออยู่พอสมควร แต่ตอนนี้ฉันจะทิ้งไว้คนเดียว
เรียกซ้ำ

@recursive ทุกวันนี้ภาษาการเขียนโปรแกรมที่ใหม่กว่าที่ไม่ได้ทำขึ้นมาเพื่อคำถามไม่จำเป็นต้องทำเครื่องหมายว่า 'ไม่ใช่การแข่งขัน' (บางคนเชื่อมโยงโพสต์เมตา)
Stan Strum


5

Python 3 , 151 149 146 ไบต์

-3 ไบต์ขอบคุณที่ร็อด

l=" 一二三四五六七八九"
for i in range(1,10):print([l[j//i]+l[i]+('得',l[j//10][10<j<20:]+'十')[j>9]+l[j%10]for j in range(i,i*i+1,i)])

ลองออนไลน์!


เพียงโน้ตเล็ก ๆ คุณสามารถใช้ช่องว่างที่มีความกว้างเป็นศูนย์'\u200b'(+2 ไบต์) แทนช่องว่างสำหรับเอาต์พุตที่แน่นอน
Rod

3

Javascript, 190 ไบต์

(_="得一二三四五六七八九十")=>{for(i=1;i<10;i++){for(t="",v=0;v<i;t+=_[++v]+_[i]+[...(v*i+'')].map((a,b,c) => c.length>1&&b==0?(a>1?_[a]+'十':'十'):b==0?'得'+_[a]:_[a]).join``+' ');console.log(t)}}

a=(_=" 一二三四五六七八九")=>{for(i=1;i<10;i++){for(t="",v=0;v<i;t+=_[++v]+_[i]+[...(v*i+'')].map((a,b,c) => c.length>1&&b==0?(a>1||c[1]==0?_[a]+'十':'十'):b==0?'得'+_[a]:_[a]).join``+' ');console.log(t)}}
a()


@ l4m2 ใช่ฉันไม่ได้สังเกตเห็นความแตกต่างเมื่อใช้得
Luis felipe De jesus Munoz

1
@ FronyFrog เมื่อเป็น 10 一十แต่เมื่อเป็น 15 หรือ 16 หรือหมายเลขอื่น ๆ ที่เราละเว้น?
Luis felipe De jesus Munoz

@FrownyFrog คุณช่วยดูได้ไหม?
Luis felipe De jesus Munoz

ทั้งหมดนี้ทำได้ดีมาก
FrownyFrog

ลอง(_="得一二三四五六七八九十")=>eval("for(i=1;i<10;i++){for(t='',v=0;v<i;t+=_[++v]+_[i]+[...(v*i+'')].map((a,b,c)=>c.length>1&&b==0?(a>1?_[a]+'十':'十'):b==0?'得'+_[a]:_[a]).join``+' ');t")ดู ฉันไม่ได้มองอย่างใกล้ชิด แต่มีบางสิ่งที่แน่นอนที่คุณสามารถเล่นกอล์ฟได้
Mama Fun Roll

2

Ruby , 166 ไบต์

->{(1..9).map{|a|(1..a).map{|b|p=a*b;([b,a]+(p<10?[0,p]:p<11?[1,10]:p<20?[10,p%10]:[p/10,10]+(p%10<1?[]:[p%10]))).map{|d|"得一二三四五六七八九十"[d]}*""}}}

ลองออนไลน์!

แลมบ์ดาส่งคืนอาร์เรย์ของสตริงแบบสองมิติ

->{
  (1..9).map{|b|                  # b is the multiplier
    (1..b).map{|a|                # a is the multiplicand
      p=a*b;                      # p is the product
      (                           # We will build an array of indexes into a ref string:
        [a,b] + (                 #   The first two indexes will be a and b
        p<10 ? [0,p] :            #   Case 1: abGp (single digit sums)
        p<11 ? [1,10] :           #   Case 2: 251X (only happens once)
        p<20 ? [10,p%10] :        #   Case 3: abXd (12-18, d is the ones digit)
        [p/10,10]+(               #   (Cases 4 and 5 share a prefix)
          p%10<1 ? [] :           #   Case 4: abcX (20, 30, 40, c is the tens digit)
          [p%10]))                #   Case 5: abcXd (two-digit product, p = 10*c+d)
      ).map{|d|
        "得一二三四五六七八九十"[d] # Fetch the character for each index
      }*""                        # Join the characters into words
    }
  }
}

2

Yabasic , 250 242 238 ไบต์

คำตอบด้วยตัวอักษร Unicode ?! อะไร?

ฟังก์ชั่นที่ไม่ระบุชื่อและประกาศฟังก์ชั่นตัวช่วยc(n)ที่ไม่รับอินพุตและเอาต์พุตไปยัง STDOUT

For r=1To 9
For c=1To r
c(c)
c(r)
If!r*c>9Then?"得";Fi
c(r*c)
?" ";
Next
?
Next
Sub c(n)
s$="一二三四五六七八九"
If n>19Then?Mid$(s$,Int(n/10)*3-2,3);Fi
If n=10Then?"一";Fi
If n>9Then?"十";Fi
?Mid$(s$,Mod(n,10)*3-2,3);
End Sub

ลองออนไลน์!



1

Retina , 100 ตัวอักษร, 122 ไบต์


9*
_
$`_$n
_
$%`_$.%= 
(_+)(.)
$.1,$2,$.($.1*$2*)
\B.
:$&
:0
:
1:\b
:
,(. )
,0$1
T`,d:`_得一二三四五六七八九十

ลองออนไลน์! คำอธิบาย:


9*

แทรกเก้า_วิ

_
$`_$n

ขยาย 9 แถว 1 ถึง 9 _s

_
$%`_$.%= 

(เว้นวรรคต่อท้ายโน้ต) ขยาย 9 แถวของ 1 ถึง i _s บวก i เป็นตัวเลข

(_+)(.)
$.1,$2,$.($.1*$2*)

แปลง_s เป็นทศนิยมและคูณด้วย i

\B.
:$&

แทรก:ถ้าคำตอบมีตัวเลขสองหลัก นี่จะกลายเป็นtenตัวละคร

:0
:

ลบศูนย์หน่วย

1:\b
:

ลบ1ออกจาก1:เว้นเสียแต่ว่าจะ1:0ลบออกจากศูนย์

,(. )
,0$1

ใส่ a 0สำหรับคำตอบดิจิตเดียว สิ่งนี้จะกลายเป็นgetตัวละคร

T`,d:`_得一二三四五六七八九十

แก้ไขตัวละครทั้งหมด


1

JavaScript (Node.js) , 141/130 ไบต์

(s=[...'得一二三四五六七八九'])=>s.map((A,i)=>s.map((B,j)=>i<j|!j?'':B+A+[s[(q=i*j)/10|-(q>11&q<19)]]+(q>9?'十':'')+[s[q%10||s]]))

ลองออนไลน์!


คุณกรุณาลบ "UTF8" ออกจากส่วนหัวได้ไหม มันไม่จำเป็น แต่มันหลอกสคริปต์ลีดเดอร์บอร์ดทำให้พวกเขาคิดว่าคำตอบนี้มีความยาวเพียง 8 ไบต์
RedClover

1

APL (Dyalog) , 75 100 ตัวอักษร, 97 122 ไบต์

k t' 一二三四五六七八九得十'10
∘.{⍺<⍵:''⋄(s=10)∨19<s←⍺×⍵:k[1+⍵⍺(⌊s÷t)11,t|s]⋄9<s:k[1+⍵⍺,11,t|s]⋄k[⍵⍺t s+1]}⍨⍳9

ลองออนไลน์!


ฉันชอบที่จะปรับปรุงหากผู้ลงคะแนนจะบอกว่ามีอะไรผิดปกติ
Uriel

โอ้ใช่แล้วสำหรับ 11 ถึง 19 รวมเอาท์พุทควรมี 4 ตัวอักษรโดยไม่มี no
FrownyFrog

@FrownyFrog แก้ไขแล้ว
Uriel

0

Python 3 , 142 ไบต์

โครงสร้างคล้ายกับคำตอบของ 146 ไบต์ของovsแต่คำกลางทำงานในวิธีที่ต่างออกไป

n=" 一二三四五六七八九"
for x in range(1,10):print([n[y//x]+n[x]+n[y//10][20>y!=10:]+'得十'[y>9]+n[y%10]for y in range(x,x*x+1,x)])

ลองออนไลน์!

คำอธิบาย

เทอมที่น่าสนใจที่สุดคือเทอมสำหรับจำนวนสิบ:

n[y//10][20>y!=10:]

โปรดทราบว่า20>y!=10หมายถึง20 > y and y != 10ซึ่งFalseควรรวมเมื่อจำนวนสิบและTrueอื่น ๆ

Falseมีค่าจำนวนเต็ม0และTrueมีค่าจำนวนเต็ม1ดังนั้นในขณะที่n[y//10]มีความยาวหนึ่งอักขระเสมอตัวห้อย[20>y!=10:]จะเท่ากับ[0:1] (เช่น "ตัวอักษร") เมื่อจำนวนของสิบควรรวมและ[1:1] (เช่น "ไม่มีตัวอักษร") เป็นอย่างอื่น

คำต่อไปนี้

'得十'[y>9]

ง่ายต่อการเข้าใจ ทราบว่า:

  • ผลลัพธ์สำหรับทุกผลลัพธ์ <= 9 ควรมี
  • ผลลัพธ์สำหรับทุกผลลัพธ์> 9 ควรมี
  • สามารถจัดการได้หลังจากคำ 'ten' เพราะคำว่า 'ten' จะประเมินเป็นสตริงว่างเสมอเมื่อมี a

หมายเหตุเกี่ยวกับช่องว่างต่อท้าย

ต่อท้ายช่องว่างสำหรับหลายของการยืดสิบเปเล็กน้อย - ดังกล่าวโดยคันนี้อาจจะทำให้สายตาที่สมบูรณ์แบบโดยใช้ช่องว่างความกว้างศูนย์ แต่แล้วคุณยังจะต้องแกะอาร์เรย์โดยใช้print(*[...])เป็นช่องว่างความกว้างศูนย์เป็นตัวแทน เป็นตัวอักษร"\u200b"เมื่อพิมพ์ในอาร์เรย์


0

JavaScript, 190 ไบต์

(s="得一二三四五六七八九十",o="")=>eval(`for(i=1;i<10;i++){for(j=1;j<=i;j++){o+=s[j]+s[i]+(i*j<10?s[0]:i*j<11?s[1]+s[10]:i*j<20?s[10]:s[i*j/10|0]+s[10])+(i*j%10?s[i*j%10]:"")+" "}o+="\\n"}`)

ฉันจะลองเล่นกอล์ฟนี้ภายหลัง


0

ทับทิม 136 ไบต์

จำนวนไบต์ใน UTF-8 ควรเป็น 128 ไบต์โดยที่ตัวอักษรฮั่นนับเป็น 2 แทน 3

1.upto(9){|x|p (1..x).map{|y|[y,x,x*y/10,?X,x*y%10].join.sub(/(?<=0)X|1(?=X[1-9])|0$/,'').tr"0-9X","得一二三四五六七八九十"}}

ลองออนไลน์!

  1. สร้างสตริงจากตัวเลขของตัวคูณและผลิตภัณฑ์โดยที่หลังคั่นด้วยXตัวยึดตำแหน่งเป็นตัวยึดสำหรับ
  2. ทำบางอย่างสนุก regex เพื่อวาง Xสินค้า <10 นำไปสู่ผลิตภัณฑ์ "-teen" และเลขศูนย์ต่อท้าย
  3. แปลตัวเลขและXตัวอักษรฮัน

0

/// , 301 ไบต์ (GBK *)

/*/\/\///1/一*2/二*3/三*4/四*5/五*6/六*7/七*8/八*9/九*0/十*=/得*I/
1*t/ 2*T/ 3/11=1I2=2t2=4I3=3t3=6T3=9I4=4t4=8T402 4406I5=5t510T505 4520 55205I6=6t602T608 46204 5630 66306I7=7t704T7201 47208 57305 67402 77409I8=8t806T8204 48302 5840 68408 78506 88604I9=9t908T9207 49306 59405 69504 79603 89702 99801

ลองออนไลน์!

* Spec ช่วยให้สามารถแปลง GBK → Unicode ได้อย่างชัดเจน


0

Pyth , 49 ตัวอักษร, 71 ไบต์

J" 一二三四五六七八九"jmj;m+s@LJkr6>3+\得j\十@LJj*FkT,RdSdS9

ใช้การเข้ารหัส UTF-8 ลองออนไลน์ได้ที่นี่ที่นี่

ในคำอธิบายต่อไปนี้?ตัวละครเป็นตัวสำรองสำหรับตัวอักษรจีนที่ถูกต้อง - ฉันขี้เกียจเกินไปที่จะทำให้ทุกอย่างเข้ากันได้ดี ...

J" ?????????"jmj;m+s@LJkr6>3+\?j\?@LJj*FkT,RdSdS9   
J" ?????????"                                       Assign space + glyphs for 1-9 to J
                                               S9   [1-9]
              m                                     Map each element, as d, using:
                                             Sd       [1-d]
                                          ,Rd         Pair each element of the above with d
                                                        e.g. for d=3, yields [[1,3],[2,3],[3,3]]
                 m                                    Map each element, as k, using:
                                      *Fk               Get the product of the pair
                                     j   T              Get decimal digits of the above (convert to base 10)
                                  @LJ                   Map each digit to its index in J
                               j\?                      Join the above on ? ("Ten")
                            +\?                         Prepend ? ("Get")
                          >3                            Take the last 3 characters of the above
                        r6                              Strip whitespace
                  +                                     Prepend to the above...
                   s@LJk                                Concatenated digits of k in lookup string
               j;                                     Join result on spaces
             j                                      Join result on newlines, implicit print
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.