Golf il tavolo multiplo cinese 9 * 9


18

Output la seguente tabella:

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

Oppure puoi usare le prime tre lettere nella sua parola inglese, nel caso in cui alcune lingue non supportino i caratteri cinesi:

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

Puoi eseguire l'output in qualsiasi formato ragionevole, ad es. Testo semplice separato con spazio / virgola / tab e newline, array 2D in cui i posti vuoti sono vuoti o non esistono (il posto 2 * 1 è vuoto quindi non ci dovrebbe essere nulla nel Vettore).

Codice golf, il codice più breve in byte vince. È consentita la codifica GBK, in cui ogni carattere cinese utilizza 2 byte.

Tabella di conversione:

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

Il resto sembra abbastanza intuitivo, ma potresti almeno spiegare come funzionano 十 e 得?
Dennis

得 viene utilizzato solo quando il prodotto è più piccolo di 10
l4m2

ahhh, quindi se è maggiore di 10 invece 得 dovremmo usare 十?
Luis felipe De jesus Munoz

@LuisfelipeDejesusMunoz e [11,19] sono speciali con un nudo 十.
FrownyFrog

Translation I 确认 这 是 正确 的。 (Traduzione: posso confermare che questo è corretto)
Esolanging Fruit

Risposte:


8

Stax , 66 caratteri

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

Il numero di byte dipende dalla codifica utilizzata per i caratteri cinesi.

Esegui ed esegui il debug online!

Spiegazione

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

Versione alternativa (Stax 1.0.6), 59 byte (di @recursive)

Questo utilizza una funzionalità che si ispira a questa sfida ed è inclusa solo in Stax 1.0.6 che postdatifica la sfida.

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

La versione ASCII è

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

Questa versione costruisce la matrice indice e poi utilizza per indicizzare la stringa di caratteri cinesi, per evitare operazioni di stack ridondanti ( c, a, n) e multiple@ s.

Spiegazione

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 può farlo in 59 , ma ha superato la sfida, quindi non è qualificato IMO.
ricorsivo il

Vale la pena menzionare comunque. Ovviamente utilizza anche alcune ottimizzazioni disponibili anche prima della 1.0.6.
Weijun Zhou,

1
Sospetto che ci sia ancora una discreta quantità di spazio per l'ottimizzazione, ma per ora lo lascerò in pace.
ricorsivo

@recursive Al giorno d'oggi, i linguaggi di programmazione più recenti che non sono stati creati apposta per una domanda non devono essere contrassegnati come "non competitivi" (qualcuno collega il meta post)
Stan Strum


5

Python 3 , 151 149 146 byte

-3 byte grazie a 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)])

Provalo online!


Solo una piccola nota, è possibile utilizzare lo spazio di larghezza zero '\u200b'(+2 byte) anziché lo spazio per un output esatto
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 Sì, non ho notato la differenza quando ho usato 得
Luis felipe De jesus Munoz

1
@FrownyFrog quando è 10 è 一十ma quando è 15 o 16 o qualsiasi altro numero che omettiamo ?
Luis felipe De jesus Munoz

@FrownyFrog Puoi dare un'occhiata ora?
Luis felipe De jesus Munoz,

Tutto bene, ben fatto.
FrownyFrog

Prova (_="得一二三四五六七八九十")=>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"). Non ho guardato troppo da vicino, ma ci sono sicuramente altre cose che puoi giocare a golf.
Mama Fun Roll

2

Rubino , 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]}*""}}}

Provalo online!

Un lambda che restituisce una matrice 2D di stringhe.

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

Una risposta di con i caratteri Unicode ?! Che cosa?

Una funzione anonima e una funzione di aiuto dichiarata, c(n) che non accetta input e output su 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

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

Provalo online!


二五一十九 二六一十二due tipi di errori
l4m2

@FrownyFrog risolto ...
Dat

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

1

Retina , 100 caratteri, 122 byte


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

Provalo online! Spiegazione:


9*

Inserisci nove _secondi.

_
$`_$n

Espandere a 9 righe da 1 a 9 _s.

_
$%`_$.%= 

(nota lo spazio finale) Espandi a 9 righe da 1 a i _s più i come una cifra.

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

Converti la _s in decimale e moltiplica per i.

\B.
:$&

Inserire un :se la risposta ha due cifre. Questo diventerà il tenpersonaggio.

:0
:

Elimina zero unità.

1:\b
:

Elimina 1da a 1:meno che non sia 1:0stato rimosso lo zero.

,(. )
,0$1

Inserire a 0per risposte a una cifra; questo diventerà il getpersonaggio.

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

Risolvi tutti i personaggi.


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

Provalo online!


Potresti rimuovere "UTF8" dall'intestazione? Non è necessario, ma inganna gli script della classifica, facendoli pensare che questa risposta sia lunga solo 8 byte.
RedClover

1

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

Provalo online!


Mi piacerebbe migliorarlo se il downvoter dicesse cosa c'è che non va.
Uriel,

Oh, giusto, quindi per
11-19

@FrownyFrog risolto
Uriel

0

Python 3 , 142 byte

La struttura è simile alla risposta di 146 byte di ovs , ma i termini medi funzionano in modo diverso.

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

Provalo online!

Spiegazione

Il termine più interessante è il termine per il numero di decine:

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

Nota che 20>y!=10significa20 > y and y != 10 che è Falsequando dovrebbe essere incluso il numero di decine e in caso Truecontrario.

Falseha un valore intero di 0e Trueun valore intero di 1, quindi mentre n[y//10]è sempre lungo un carattere, il pedice[20>y!=10:] è equivalente a [0:1](cioè "il carattere") quando il numero di decine dovrebbe essere incluso e[1:1] (cioè "nessun carattere") in caso contrario.

Il seguente termine,

'得十'[y>9]

è più facile da capire; nota che:

  • L'output per ogni risultato <= 9 deve contenere
  • L'output per ogni risultato> 9 dovrebbe contenere
  • può essere gestito dopo il termine "decine" perché il termine "decine" restituisce sempre una stringa vuota quando è presente un

Nota sugli spazi finali

Gli spazi finali per multipli di dieci allungano leggermente le specifiche - come indicato da rod , questo potrebbe essere reso visivamente perfetto usando uno spazio di larghezza zero, ma quindi dovresti anche decomprimere le matrici usando print(*[...])come viene rappresentato lo spazio di larghezza zero come letterale "\u200b"se stampato in un 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"}`)

Proverò a giocare a golf più tardi.


0

Rubino , 136 byte

Il conteggio dei byte in UTF-8, dovrebbe essere di 128 byte con i caratteri Han conteggiati come 2 anziché 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","得一二三四五六七八九十"}}

Provalo online!

  1. Costruisci le stringhe dalle cifre dei moltiplicatori e dei prodotti con queste ultime separate da Xsegnaposto per .
  2. Fai un po 'di regex divertente da eliminare Xper prodotti <10, portando quelli per "-teen" prodotti e zero finali.
  3. Traduci cifre e Xcaratteri 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

Provalo online!

* La specifica consente esplicitamente la conversione GBK → Unicode.


0

Pyth , 49 caratteri, 71 byte

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

Utilizza la codifica UTF-8. Provalo online qui .

Nella seguente spiegazione, i ?personaggi sostituiscono i caratteri cinesi corretti: sono troppo pigro per allineare tutto correttamente ...

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.