Spielen Sie den chinesischen 9 * 9-Mehrfachtisch


18

Geben Sie die folgende Tabelle aus:

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

Oder Sie können die ersten drei Buchstaben des englischen Wortes verwenden, falls einige Sprachen keine chinesischen Zeichen unterstützen:

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

Sie können in jedem vernünftigen Format ausgeben, z. B. durch Leerzeichen / Komma / Tabulator und Zeilenvorschub getrennter Nur-Text, 2D-Array, in dem leere Stellen leer sind oder nicht existieren (Die 2 * 1-Stelle ist leer, daher sollte nichts im Feld sein Array).

Code Golf, kürzester Code in Bytes gewinnen. GBK-Codierung ist zulässig, wobei jedes chinesische Zeichen 2 Byte verwendet.

Tabelle konvertieren:

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

Der Rest scheint ziemlich intuitiv zu sein, aber können Sie zumindest erklären, wie 十 und 得 funktionieren?
Dennis

得 wird nur verwendet, wenn das Produkt kleiner als 10
l4m2 ist.

ahhh, wenn es also größer als 10 ist, sollten wir stattdessen 十 verwenden?
Luis Felipe De Jesus Munoz

@ LuisfelipeDejesusMunoz und [11,19] sind etwas Besonderes mit einem nackten 十.
FrownyFrog

(Übersetzung: Ich kann bestätigen, dass dies korrekt ist)
Esolanging Fruit

Antworten:


8

Stax , 66 Zeichen

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

Die Anzahl der Bytes hängt von der für chinesische Zeichen verwendeten Kodierung ab.

Online ausführen und debuggen!

Erläuterung

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

Alternative Version (Stax 1.0.6), 59 Bytes (von @recursive)

Hierbei wird eine Funktion verwendet , die von dieser Herausforderung inspiriert ist und nur in Stax 1.0.6 enthalten ist, das die Herausforderung nachholt.

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

Die ASCII-Version ist

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

Diese Version baut das Index - Array und verwendet dann die Zeichenfolge der chinesischen Schriftzeichen zu indizieren redundante Stapeloperationen (um zu vermeiden c, a, n) und mehr @s.

Erläuterung

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 kann es in 59 , aber es gibt die Herausforderung nach, so dass es IMO nicht qualifiziert ist.
rekursiver

Trotzdem erwähnenswert. Offensichtlich wird auch eine Optimierung verwendet, die auch vor 1.0.6 verfügbar ist.
Weijun Zhou

1
Ich vermute, dass noch genügend Optimierungsraum vorhanden ist, aber ich werde ihn vorerst in Ruhe lassen.
rekursive

@recursive Heutzutage müssen neuere Programmiersprachen, die nicht gezielt für eine Frage erstellt wurden, nicht als "nicht konkurrierend" markiert werden (jemand
Stan Strum


5

Python 3 , 151 149 146 Bytes

-3 Bytes dank 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)])

Probieren Sie es online!


Nur eine kleine Anmerkung, Sie könnten '\u200b'stattdessen ein Leerzeichen mit der Breite Null (+2 Byte) für eine exakte Ausgabe verwenden
Rod

3

Javascript, 190 Bytes

(_="得一二三四五六七八九十")=>{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 Ja, ich habe den Unterschied bei der Verwendung von 得 nicht bemerkt
Luis Felipe De Jesus Munoz

1
@FrownyFrog wann ist 10 一十aber wann ist 15 oder 16 oder irgendeine andere Zahl, die wir weglassen ?
Luis Felipe De Jesus Munoz

@FrownyFrog Können Sie jetzt einen Blick darauf werfen?
Luis Felipe De Jesus Munoz

Alles in Ordnung, gut gemacht.
FrownyFrog

Versuchen Sie es (_="得一二三四五六七八九十")=>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"). Ich habe nicht zu genau hingeschaut, aber es gibt definitiv noch ein paar andere Dinge, die Sie golfen können.
Mama Fun Roll

2

Ruby , 166 Bytes

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

Probieren Sie es online!

Ein Lambda, das ein 2D-Array von Zeichenfolgen zurückgibt.

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

Eine Antwort mit Unicode-Zeichen ?! Was?

Eine anonyme Funktion und deklarierte c(n)Hilfsfunktion, die keine Ein- und Ausgaben für STDOUT akzeptiert

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

Probieren Sie es online!


1

Python 3 , 196 Bytes

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

Probieren Sie es online!


二五一十九 二六一十二zwei Arten von Unrecht
l4m2

@FrownyFrog festen ...
Dat

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

1

Retina , 100 Zeichen, 122 Bytes


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

Probieren Sie es online! Erläuterung:


9*

Fügen Sie neun _s ein.

_
$`_$n

Erweitern Sie auf 9 Zeilen von 1 bis 9 _s.

_
$%`_$.%= 

(Leerzeichen am Ende beachten) Erweitern Sie das Feld auf 9 Zeilen von 1 bis i _s plus i als Ziffer.

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

Wandle das _s in eine Dezimalzahl um und multipliziere es mit i.

\B.
:$&

Fügen Sie ein ein, :wenn die Antwort zweistellig ist. Dies wird der tenCharakter.

:0
:

Löschen Sie keine Einheiten.

1:\b
:

Löschen Sie das 1von, es 1:sei denn, 1:0die Null wurde entfernt.

,(. )
,0$1

Inser a 0für einstellige Antworten; Dies wird der getCharakter.

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

Repariere alle Charaktere.


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

Probieren Sie es online!


Könnten Sie bitte das "UTF8" aus dem Header entfernen? Es ist nicht notwendig, aber es täuscht über Bestenlisten-Skripte hinweg und lässt sie glauben, dass diese Antwort nur 8 Byte lang ist.
RedClover

1

APL (Dyalog) , 75 100 Zeichen, 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

Probieren Sie es online!


Ich würde es gerne verbessern, wenn der Downvoter sagen würde, was daran falsch ist.
Uriel

Oh, richtig, also für 11 bis einschließlich 19 sollte die Ausgabe 4 Zeichen sein, ohne 一
FrownyFrog

@FrownyFrog behoben
Uriel

0

Python 3 , 142 Bytes

Die Struktur ähnelt der 146-Byte-Antwort von ovs , die Mittelbegriffe funktionieren jedoch anders.

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

Probieren Sie es online!

Erläuterung

Der interessanteste Begriff ist der Begriff für die Anzahl der Zehner:

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

Beachten Sie, dass dies 20>y!=10bedeutet 20 > y and y != 10, Falsewann die Anzahl der Zehner eingeschlossen werden soll und Trueansonsten.

Falsehat einen ganzzahligen Wert von 0und Trueeinen ganzzahligen Wert von 1. Während n[y//10]also immer ein Zeichen lang ist, ist der Index [20>y!=10:]äquivalent zu [0:1](dh "das Zeichen"), wenn die Anzahl der Zehner eingeschlossen werden soll, und [1:1](dh "keine Zeichen") ansonsten.

Der folgende Begriff,

'得十'[y>9]

ist leichter zu verstehen; beachten Sie, dass:

  • Die Ausgabe für jedes Ergebnis <= 9 sollte enthalten
  • Die Ausgabe für jedes Ergebnis> 9 sollte enthalten
  • kann nach dem 'Zehner'-Term behandelt werden, da der' Zehner'-Term immer eine leere Zeichenfolge ergibt, wenn es einen gibt

Hinweis zu Leerzeichen

Die nachgestellten Leerzeichen für ein Vielfaches von zehn erweitern die Spezifikation geringfügig - wie von rod erwähnt , könnte dies durch die Verwendung eines Leerzeichens mit der Breite Null optisch perfektioniert werden. Dann müssten Sie jedoch auch die Arrays mit print(*[...])der Breite Null entpacken, da das Leerzeichen dargestellt wird als Literal, "\u200b"wenn es in einem Array gedruckt wird.


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

Ich werde später versuchen, Golf zu spielen.


0

Rubin , 136 Bytes

Die Byteanzahl in UTF-8 sollte 128 Bytes betragen, wobei Han-Zeichen als 2 statt als 3 gezählt werden.

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","得一二三四五六七八九十"}}

Probieren Sie es online!

  1. Konstruieren Sie die Zeichenfolgen aus den Ziffern von Multiplikatoren und Produkten, wobei letztere durch Xeinen Platzhalter für getrennt werden .
  2. Mach ein bisschen Regex-Spaß beim Ablegen X Produkte <10 zu löschen, führende für "-teen" -Produkte und nachgestellte Nullen.
  3. Übersetzen Sie Ziffern und Xin Han-Zeichen.

0

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

Probieren Sie es online!

* Die Spezifikation erlaubt ausdrücklich die GBK → Unicode-Konvertierung.


0

Pyth , 49 Zeichen, 71 Bytes

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

Verwendet UTF-8-Codierung. Probieren Sie es hier online aus .

In der folgenden Erklärung sind die ?Zeichen Ersatz für die richtigen chinesischen Zeichen - ich bin zu faul, um alles richtig auszurichten ...

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.