Zagraj w golfa na chińskim stole 9 * 9

18

Wyjdź z poniższej tabeli:

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

Możesz też użyć pierwszych trzech liter w angielskim słowie, w przypadku gdy niektóre języki nie obsługują chińskich znaków:

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

Możesz wydrukować w dowolnym rozsądnym formacie, np. Zwykły tekst oddzielony spacją / przecinkiem / tabulatorem i znakiem nowej linii, tablica 2D, w której puste miejsca są puste lub nie istnieją (miejsce 2 * 1 jest puste, więc nie powinno być niczego w szyk).

Kod golfa, najkrótszy kod w bajtach wygrywa. Dozwolone jest kodowanie GBK, gdzie każdy chiński znak używa 2 bajtów.

Konwersja tabeli:

一   One
二   Two
三   Thr
四   Fou
五   Fiv
六   Six
七   Sev
八   Eig
九   Nin
十   Ten
得   Get
l4m2
źródło
Reszta wydaje się dość intuicyjna, ale czy możesz przynajmniej wyjaśnić, jak działają 十 i 得?
Dennis
得 jest używany tylko wtedy, gdy produkt jest mniejszy niż 10
14m2
ahhh, więc jeśli jest większa niż 10 zamiast 得 powinniśmy użyć 十?
Luis Felipe De Jesus Munoz
@LuisfelipeDejesusMunoz i [11,19] są wyjątkowe z gołym 十.
FrownyFrog,
我 能 确认 这 是 正确 的。 (Tłumaczenie: Potwierdzam, że jest to poprawne)
Esolanging Fruit

Odpowiedzi:

8

Stax , 66 znaków

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

Liczba bajtów zależy od kodowania użytego dla chińskich znaków.

Uruchom i debuguj online!

Wyjaśnienie

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

Alternatywna wersja (Stax 1.0.6), 59 bajtów (autor @recursive)

Korzysta z funkcji zainspirowanej tym wyzwaniem i jest zawarta tylko w Stax 1.0.6, który jest późniejszy niż wyzwanie.

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

Wersja ASCII to

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

Ta wersja konstruuje tablicę indeksu, a następnie wykorzystuje je do indeksu ciąg znaków chińskich, aby uniknąć zbędnych operacji stosu ( c, a, n) i stwardnienie @s.

Wyjaśnienie

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
Weijun Zhou
źródło
Stax 1.0.6 może to zrobić w 59 , ale postdatuje wyzwanie, więc nie jest kwalifikowanym IMO.
rekurencyjny
W każdym razie warto o tym wspomnieć. Oczywiście używa także optymalizacji, która jest dostępna także przed 1.0.6.
Weijun Zhou
1
Podejrzewam, że pozostało jeszcze sporo miejsca na optymalizację, ale na razie zostawię to w spokoju.
rekurencyjny
@recursive W dzisiejszych czasach nowsze języki programowania, które nie zostały stworzone celowo na pytanie, nie muszą być oznaczone jako „nie konkurujące” (ktoś link do meta postu)
Stan Strum
1
@StanStrum Oto meta post
PunPun1000,
5

Python 3 , 151 149 146 bajtów

-3 bajty dzięki 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)])

Wypróbuj online!

ovs
źródło
Tylko mała uwaga, możesz użyć spacji o zerowej szerokości '\u200b'(+2 bajty) zamiast spacji dla dokładnego wyniku
Rod
3

JavaScript, 190 bajtów

(_="得一二三四五六七八九十")=>{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()

Luis Felipe De Jesus Munoz
źródło
@ l4m2 Tak, nie zauważyłem różnicy przy użyciu 得
Luis felipe De jesus Munoz
1
@FrownyFrog, kiedy jest 10, 一十ale kiedy jest 15 lub 16 lub jakikolwiek inny numer, który pomijamy ?
Luis Felipe De Jesus Munoz
@FrownyFrog Czy możesz rzucić okiem teraz?
Luis felipe De jesus Munoz
Wszystko dobrze, dobrze zrobione.
FrownyFrog,
Spróbować (_="得一二三四五六七八九十")=>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"). Nie przyjrzałem się zbyt uważnie, ale na pewno można grać w golfa.
Mama Fun Roll
2

Rubin , 166 bajtów

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

Wypróbuj online!

Lambda zwraca tablicę 2D ciągów.

->{
  (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
    }
  }
}
benj2240
źródło
2

Yabasic , 250 242 238 bajtów

odpowiedź ze znaków Unicode ?! Co?

Anonimowa funkcja i zadeklarowana funkcja pomocnicza, c(n)która nie pobiera danych wejściowych i wyjściowych do 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

Wypróbuj online!

Taylor Scott
źródło
1

Python 3 , 196 bajtów

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

Wypróbuj online!

Dat
źródło
二五一十九 二六一十二dwa rodzaje zła
l4m2
@FrownyFrog naprawiono ...
Dat
c[(i*j%10)]=> c[i*j%10]?
l4m2
1

Siatkówka , 100 znaków, 122 bajty


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

Wypróbuj online! Wyjaśnienie:


9*

Wstaw dziewięć _s.

_
$`_$n

Rozwiń do 9 rzędów od 1 do 9 _s.

_
$%`_$.%= 

(uwaga końcowa spacja) Rozwiń do 9 wierszy od 1 do i _s plus i jako cyfrę.

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

Konwertuj _s na dziesiętne i pomnóż przez i.

\B.
:$&

Wstaw a, :jeśli odpowiedź ma dwie cyfry. To stanie się tenpostacią.

:0
:

Usuń jednostki zerowe.

1:\b
:

Usuń 1z, 1:chyba że 1:0usunięto zero.

,(. )
,0$1

Wpisz a w 0przypadku jednocyfrowych odpowiedzi; to stanie się getpostacią.

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

Napraw wszystkie postacie.

Neil
źródło
1

JavaScript (Node.js) , 141/130 bajtów

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

Wypróbuj online!

l4m2
źródło
Czy możesz usunąć „UTF8” z nagłówka? Nie jest to konieczne, ale oszukiwa skrypty tabeli liderów, co powoduje, że myślą, że odpowiedź ma tylko 8 bajtów.
RedClover,
1

APL (Dyalog) , 75 100 znaków, 97 122 bajtów

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

Wypróbuj online!

Uriel
źródło
Chciałbym to poprawić, jeśli downvoter powiedziałby, co jest z tym nie tak.
Uriel
Och, racja, więc dla 11 do 19 włącznie wynik powinien wynosić 4 znaki, bez 一
FrownyFrog
@FrownyFrog naprawiono
Uriel
0

Python 3 , 142 bajty

Struktura jest podobna do 146-bajtowej odpowiedzi ovsa , ale warunki środkowe działają w inny sposób.

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

Wypróbuj online!

Wyjaśnienie

Najciekawszym terminem jest liczba dziesiątek:

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

Zauważ, że 20>y!=10oznacza to 20 > y and y != 10, Falsekiedy należy podać liczbę dziesiątek i Trueinaczej.

Falsema wartość całkowitą 0i Truema wartość całkowitą wynoszącą 1, więc podczas gdy n[y//10]zawsze ma długość jednego znaku, indeks dolny [20>y!=10:]jest równoważny [0:1](tj. „znakowi”), gdy liczba dziesiątek powinna być uwzględniona, i [1:1](tj. „bez znaków”) w przeciwnym razie.

Następujący termin

'得十'[y>9]

jest łatwiejszy do zrozumienia; zauważ, że:

  • Dane wyjściowe dla każdego wyniku <= 9 powinny zawierać
  • Dane wyjściowe dla każdego wyniku> 9 powinny zawierać
  • można obsługiwać po wyrażeniu „dziesiątki”, ponieważ wyrażenie „dziesiątki” zawsze zmienia się w pusty ciąg, gdy występuje

Uwaga na końcowe spacje

Końcowe spacje dla wielokrotności dziesięciu nieznacznie rozciągają specyfikację - jak wspomniano przez pręt , można to zrobić wizualnie perfekcyjnie, stosując spację o zerowej szerokości, ale wtedy trzeba też rozpakować tablice, używając print(*[...])reprezentowanej przestrzeni o zerowej szerokości jako literał "\u200b"po wydrukowaniu w tablicy.

mjayfrancis
źródło
0

JavaScript, 190 bajtów

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

Spróbuję zagrać w golfa później.

ericw31415
źródło
0

Rubin , 136 bajtów

Liczba bajtów w UTF-8 powinna wynosić 128 bajtów, przy czym znaki Hana liczone są jako 2 zamiast 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","得一二三四五六七八九十"}}

Wypróbuj online!

  1. Zbuduj ciągi znaków z cyfr mnożnika i cyfr produktów, używając tych ostatnich oddzielonych Xjako symbol zastępczy dla .
  2. Zrób kilka wyrażeń regularnych, upuszczając Xprodukty <10, wiodące dla produktów „-nastu” i końcowe zera.
  3. Przetłumacz cyfry i Xznaki Han.
Kirill L.
źródło
0

/// , 301 bajtów (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

Wypróbuj online!

* Spec wyraźnie zezwala na konwersję GBK → Unicode.

Erik the Outgolfer
źródło
0

Pyth , 49 znaków, 71 bajtów

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

Wykorzystuje kodowanie UTF-8. Wypróbuj online tutaj .

W poniższym objaśnieniu ?znaki są zamiennikami poprawnych chińskich znaków - jestem zbyt leniwy, aby wszystko poprawnie ułożyć ...

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
Sok
źródło