Golf Chinese 9 * 9 multiple table


18

Keluarkan tabel berikut:

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

Atau Anda dapat menggunakan tiga huruf pertama dalam kata bahasa Inggrisnya, jika beberapa bahasa tidak mendukung karakter Cina:

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

Anda dapat menampilkan dalam format apa pun yang masuk akal, misalnya teks biasa yang dipisahkan dengan spasi / koma / tab dan baris baru, array 2D di mana tempat kosong kosong atau tidak ada (Tempat 2 * 1 kosong sehingga tidak boleh ada apa pun di Himpunan).

Golf kode, kode terpendek dalam byte menang. Pengkodean GBK diperbolehkan, di mana setiap karakter bahasa Mandarin menggunakan 2 byte.

Meja Konversi:

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

Sisanya tampaknya cukup intuitif, tetapi bisakah Anda setidaknya menjelaskan cara kerja 十 dan 得?
Dennis

得 hanya digunakan ketika produk lebih kecil dari 10
m 2

ahhh, jadi jika lebih besar dari 10, 得 kita seharusnya menggunakan 十?
Luis felipe De jesus Munoz

@LuisfelipeDejesusMunoz dan [11,19] spesial dengan 十 kosong.
FrownyFrog

我 能 确认 这 是 正确 的。 (Terjemahan: Saya dapat mengkonfirmasi bahwa ini benar)
Esolanging Fruit

Jawaban:


8

Stax , 66 karakter

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

Jumlah byte tergantung pada pengkodean yang digunakan untuk karakter Cina.

Jalankan dan debug online!

Penjelasan

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

Versi alternatif (Stax 1.0.6), 59 byte (oleh @recursive)

Ini menggunakan fitur yang terinspirasi oleh tantangan ini dan hanya termasuk dalam Stax 1.0.6 yang mengunggah tantangan.

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

Versi ASCII adalah

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

Versi ini membangun array indeks dan kemudian menggunakannya untuk indeks string karakter Cina untuk menghindari operasi stack berlebihan ( c, a, n) dan beberapa @s.

Penjelasan

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 dapat melakukannya di 59 , tetapi tantangannya sudah lewat, jadi IMO tidak memenuhi syarat.
rekursif

Layak disebutkan. Ini juga jelas menggunakan beberapa optimasi yang juga tersedia sebelum 1.0.6.
Weijun Zhou

1
Saya menduga masih ada ruang optimisasi yang tersisa, tetapi saya akan membiarkannya sendiri untuk saat ini.
rekursif

@recursive Saat ini, bahasa pemrograman baru yang tidak dibuat dengan sengaja untuk sebuah pertanyaan tidak harus ditandai 'tidak bersaing' (seseorang menautkan pos meta)
Stan Strum

1

5

Python 3 , 151 149 146 byte

-3 byte terima kasih kepada Rod .

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

Cobalah online!


Hanya sebuah catatan kecil, Anda bisa menggunakan spasi nol-lebar '\u200b'(+2 byte) sebagai ganti ruang untuk output yang tepat
Rod

3

Javascript, 190 byte

(_="得一二三四五六七八九十")=>{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 Ya, saya tidak melihat perbedaan ketika menggunakan 得
Luis felipe De jesus Munoz

1
@FrownyFrog kapan 10 一十tetapi kapan 15 atau 16 atau nomor lain yang kita hilangkan ?
Luis felipe De jesus Munoz

@FrownyFrog Bisakah Anda melihatnya sekarang?
Luis felipe De jesus Munoz

Semuanya baik-baik saja.
FrownyFrog

Coba (_="得一二三四五六七八九十")=>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"). Saya belum melihat terlalu dekat, tetapi pasti ada beberapa hal lain yang bisa Anda mainkan.
Mama Fun Roll

2

Ruby , 166 byte

->{(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]}*""}}}

Cobalah online!

Sebuah lambda mengembalikan deretan string 2D.

->{
  (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 byte

Sebuah jawaban dengan karakter unicode ?! Apa?

Fungsi anonim dan fungsi pembantu yang dinyatakan, c(n)yang tidak memerlukan input dan output ke 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

Cobalah online!


1

Python 3 , 196 byte

lambda c=' 一二三四五六七八九':[[c[j]+c[i]+[('得'+c[(i*j%10)]),((c[(int(i*j/10))]*((i*j>19)or(i*j==10)))+'十'+(c[i*j%10])*(i*j%10!=0))][i*j>9]for j in range(1,i+1)]for i in range(1,10)]

Cobalah online!


二五一十九 二六一十二dua jenis kesalahan
l4m2

@FrownyFrog diperbaiki ...
Dat

c[(i*j%10)]=> c[i*j%10]?
l4m2

1

Retina , 100 karakter, 122 byte


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

Cobalah online! Penjelasan:


9*

Masukkan sembilan _s.

_
$`_$n

Luaskan ke 9 baris 1 hingga 9 _dtk.

_
$%`_$.%= 

(note trailing space) _Tambahkan 9 baris 1 ke i s plus i sebagai digit.

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

Ubah _s menjadi desimal dan kalikan dengan i.

\B.
:$&

Masukkan a :jika jawabannya memiliki dua digit. Ini akan menjadi tenkarakter.

:0
:

Hapus nol unit.

1:\b
:

Hapus 1dari 1:kecuali itu 1:0yang nol dihapus.

,(. )
,0$1

Masukkan 0jawaban satu digit; ini akan menjadi getkarakter.

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

Perbaiki semua karakter.


1

JavaScript (Node.js) , 141/130 byte

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

Cobalah online!


Bisakah Anda menghapus "UTF8" dari header? Itu tidak perlu, tetapi trik skrip leaderboard, membuat mereka berpikir jawaban ini hanya 8 byte.
RedClover

1

APL (Dyalog) , 75 100 karakter, 97 122 byte

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

Cobalah online!


Saya ingin memperbaikinya jika downvoter akan mengatakan apa yang salah dengannya.
Uriel

Oh, benar, jadi untuk 11 hingga 19 inklusif outputnya harus 4 karakter, tanpa 一
FrownyFrog

@FrownyFrog diperbaiki
Uriel

0

Python 3 , 142 byte

Struktur mirip dengan jawaban 146 byte ovs , tetapi istilah tengahnya bekerja dengan cara yang berbeda.

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

Cobalah online!

Penjelasan

Istilah yang paling menarik adalah istilah untuk jumlah puluhan:

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

Perhatikan itu 20>y!=10artinya 20 > y and y != 10, Falsesaat itulah jumlah puluhan harus dimasukkan dan Truesebaliknya.

Falsememiliki nilai integer 0dan Truememiliki nilai integer 1, jadi ketika n[y//10]panjang selalu satu karakter, subskripnya [20>y!=10:]sama dengan [0:1](yaitu "karakter") ketika jumlah puluhan harus dimasukkan dan [1:1](yaitu "tidak ada karakter") sebaliknya.

Istilah berikut,

'得十'[y>9]

lebih mudah dipahami; perhatikan bahwa:

  • Output untuk setiap hasil <= 9 harus berisi
  • Output untuk setiap hasil> 9 harus berisi
  • dapat ditangani setelah istilah 'puluhan' karena istilah 'puluhan' selalu dievaluasi menjadi string kosong ketika ada a

Catatan tentang spasi tambahan

Spasi trailing untuk kelipatan sepuluh meregangkan spesifikasi sedikit - seperti yang disebutkan oleh batang , ini bisa dibuat secara visual sempurna dengan menggunakan ruang lebar-nol, tetapi kemudian Anda juga harus membongkar array menggunakan print(*[...])sebagai ruang lebar-nol diwakili sebagai literal "\u200b"ketika dicetak dalam sebuah array.


0

JavaScript, 190 byte

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

Saya akan mencoba golf ini nanti.


0

Ruby , 136 byte

Jumlah byte dalam UTF-8, harus 128 byte dengan karakter Han dihitung sebagai 2 bukannya 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","得一二三四五六七八九十"}}

Cobalah online!

  1. Bangun string dari angka pengganda dan produk dengan yang kedua dipisahkan oleh Xsebagai pengganti .
  2. Lakukan beberapa kesenangan regex untuk menjatuhkan Xproduk <10, yang terkemuka untuk produk "-teen", dan tertinggal nol.
  3. Menerjemahkan digit dan Xke karakter Han.

0

/// , 301 byte (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

Cobalah online!

* Spec secara eksplisit memungkinkan GBK → Konversi Unicode.


0

Pyth , 49 karakter, 71 byte

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

Menggunakan pengkodean UTF-8. Cobalah online di sini .

Dalam penjelasan berikut, ?karakter adalah pengganti untuk karakter Cina yang benar - Saya terlalu malas untuk membuat semuanya sejalan dengan benar ...

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