中国の9 * 9マルチテーブルをゴルフ


18

次の表を出力します。

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

または、一部の言語が中国語の文字をサポートしていない場合、英語の単語の最初の3文字を使用できます。

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

残りはかなり直感的に思えますが、少なくとも十と得がどのように機能するかを説明できますか?
デニス

得られるのは、製品が10
l4m2

ああ、だから代わりに10よりも大きい場合は、十を使うことになりますか?
ルイスフェリペデジェススムニョス

@LuisfelipeDejesusMunozと[11,19]は裸の十を持つ特別なものです。
-FrownyFrog

(翻訳:これが正しいことを確認できます)
エソランジングフルーツ

回答:


8

スタックス、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

このバージョンでは、インデックス配列を構築し、その後、冗長スタック操作を避けるために、インデックスに漢字の文字列を、それを使用しています(can)と複数@の。

説明

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より前に利用可能な最適化も使用します。
ウェイジュン周

1
最適化の余地はまだかなり残っていると思いますが、今のところはそのままにしておきます。
再帰的

@recursive最近では、質問のために意図的に作られていない新しいプログラミング言語を「非競合」とマークする必要はありません(誰かがメタ投稿にリンクします)
Stan Strum

1
@StanStrum メタ投稿
PunPun1000


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はい、得を使用したときに違いに気付きませんでした
ルイスフェリペデジェスムニョス

1
@FrownyFrog whenは10です一十が、whenは15または16またはその他の数字を省略しますか?
ルイスフェリペデジェススムニョス

@FrownyFrog今すぐ見てもらえますか?
ルイスフェリペデジェススムニョス

すべてうまくいきました。
-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")。私はあまりよく見ていませんが、ゴルフできることは他にもいくつかあります。
ママファンロール

2

ルビー、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]}*""}}}

オンラインでお試しください!

文字列の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

Yabasic250 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

網膜、100文字、122バイト


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

オンラインでお試しください!説明:


9*

9を挿入し_ます。

_
$`_$n

1〜9 _秒の9行に展開します。

_
$%`_$.%= 

(末尾のスペースに注意してください)9行の1からi _sおよびiとして数字に展開します。

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

_sを10進数に変換し、iを乗算します。

\B.
:$&

:回答が2桁の場合は、aを挿入します。これがtenキャラクターになります。

:0
:

ゼロ単位を削除します。

1:\b
:

ゼロが削除されていない限り、1fromを削除します。1:1:0

,(. )
,0$1

01桁の回答の場合はInser 。これが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

オンラインでお試しください!


ダウンボッターが何が悪いのかを教えてくれるなら、私はそれを改善したいと思っています。
ウリエル

ああ、そう、11から19までの場合、出力は4文字で、一文字ではないはずです
FrownyFrog

@FrownyFrogは、固定
ウリエル

0

Python 3、142バイト

構造はovsの146バイトの回答に似ていますが、中間の用語は異なる方法で機能します。

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、10の数を含めるべきときなどTrueです。

False整数値を持っている0Trueの整数値を持っている1ので、一方では、n[y//10]常に1つの文字、下付きです[20>y!=10:]と等価である[0:1](すなわち、「文字」)数十の数が含まれなければならないときには[1:1](つまり、「文字なし」)そう。

次の用語、

'得十'[y>9]

理解しやすいです。ご了承ください:

  • すべての結果<= 9の出力には、
  • 9を超えるすべての結果の出力には、
  • 「10」という用語が存在する場合、「10」という用語は常に空の文字列に評価されるため

末尾のスペースに関する注意

わずか10ストレッチの倍数のための末尾のスペース仕様-で述べたように、ロッド、これは視覚的にゼロ幅スペースを使用することによって完璧作ることができるが、その後あなたも使って、配列を解凍しなければならない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のバイトカウントは、ハン文字が3ではなく2としてカウントされる128バイトである必要があります。

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. ドロップする正規表現の楽しみをしてください X10個未満の製品、「-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

オンラインでお試しください!

*スペックは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.