Golf la mesa múltiple china 9 * 9

18

Salida de la siguiente tabla:

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

O puede usar las primeras tres letras en su palabra en inglés, en caso de que algunos idiomas no admitan caracteres chinos:

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

Puede imprimir en cualquier formato razonable, por ejemplo, texto plano separado con espacio / coma / tabulación y nueva línea, matriz 2D donde los lugares vacíos están vacíos o no existen (el lugar 2 * 1 está vacío, por lo que no debería haber nada en el formación).

Código de golf, el código más corto en bytes gana. Se permite la codificación GBK, donde cada carácter chino usa 2 bytes.

Tabla de conversión:

一   One
二   Two
三   Thr
四   Fou
五   Fiv
六   Six
七   Sev
八   Eig
九   Nin
十   Ten
得   Get
l4m2
fuente
El resto parece bastante intuitivo, pero ¿podría al menos explicar cómo funcionan 十 y 得?
Dennis
得 solo se usa cuando el producto es menor de 10
l4m2 el
ahhh, entonces si es mayor que 10 en su lugar 得 se supone que debemos usar 十?
Luis felipe De jesus Munoz
@LuisfelipeDejesusMunoz y [11,19] son ​​especiales con un simple 十.
FrownyFrog
我 能 确认 这 是 正确 的。 (Traducción: Puedo confirmar que esto es correcto)
Esolanging Fruit

Respuestas:

8

Stax , 66 caracteres

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

El número de bytes depende de la codificación utilizada para los caracteres chinos.

¡Ejecute y depure en línea!

Explicación

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ón alternativa (Stax 1.0.6), 59 bytes (por @recursive)

Utiliza una función inspirada en este desafío y solo se incluye en Stax 1.0.6, que es posterior al desafío.

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

La versión ASCII es

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

Esta versión construye la matriz de índice y luego lo utiliza para indexar la cadena de caracteres chinos para evitar operaciones de pila redundantes ( c, a, n) y múltiple @s.

Explicación

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
fuente
Stax 1.0.6 puede hacerlo en 59 , pero es posterior al desafío, por lo que no está calificado como IMO.
recursivo
Vale la pena mencionar de todos modos. Obviamente, también utiliza alguna optimización que también está disponible antes de 1.0.6.
Weijun Zhou
1
Sospecho que todavía queda una cantidad decente de espacio de optimización, pero voy a dejarlo solo por ahora.
recursivo
@recursive Hoy en día, los nuevos lenguajes de programación que no están hechos a propósito para una pregunta no tienen que ser marcados como 'no competitivos' (alguien vincula la meta publicación)
Stan Strum
1
@StanStrum Aquí está la meta publicación
PunPun1000
5

Pitón 3 , 151 149 146 bytes

-3 bytes gracias 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)])

Pruébalo en línea!

ovs
fuente
Solo una pequeña nota, podría usar espacio de ancho cero '\u200b'(+2 bytes) en lugar de espacio para una salida exacta
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()

Luis felipe De jesus Munoz
fuente
@ l4m2 Sí, no noté la diferencia al usar 得
Luis felipe De jesus Munoz
1
@FrownyFrog cuando es 10 一十pero cuando es 15 o 16 o cualquier otro número que omitimos ?
Luis felipe De jesus Munoz
@FrownyFrog ¿Puedes echar un vistazo ahora?
Luis felipe De jesus Munoz
Todo bien, bien hecho.
FrownyFrog
Tratar (_="得一二三四五六七八九十")=>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"). No he mirado muy de cerca, pero definitivamente hay otras cosas que puedes jugar al golf.
Mama Fun Roll
2

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

Pruébalo en línea!

Una lambda que devuelve una matriz 2D de cadenas.

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

Yabasic , 250 242 238 bytes

¿Una respuesta con caracteres unicode? ¿Qué?

Una función anónima y una función auxiliar declarada, c(n)que no lleva entradas y salidas a 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

Pruébalo en línea!

Taylor Scott
fuente
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)]

Pruébalo en línea!

Dat
fuente
二五一十九 二六一十二dos tipos de errores
l4m2 el
@FrownyFrog arreglado ...
Dat
c[(i*j%10)]=> c[i*j%10]?
l4m2
1

Retina , 100 caracteres, 122 bytes


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

Pruébalo en línea! Explicación:


9*

Insertar nueve _s.

_
$`_$n

Expandir a 9 filas de 1 a 9 _s.

_
$%`_$.%= 

(observe el espacio final) Expanda a 9 filas de 1 a i _s más i como un dígito.

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

Convierta la _s en decimal y multiplique por i.

\B.
:$&

Inserte un :si la respuesta tiene dos dígitos. Esto se convertirá en el tenpersonaje.

:0
:

Eliminar cero unidades.

1:\b
:

Elimina el 1de a 1:menos que sea el 1:0que tiene su cero eliminado.

,(. )
,0$1

Inserte una 0para respuestas de un solo dígito; Esto se convertirá en el getpersonaje.

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

Arregla todos los personajes.

Neil
fuente
1

JavaScript (Node.js) , 141/130 bytes

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

Pruébalo en línea!

l4m2
fuente
¿Podría por favor eliminar el "UTF8" del encabezado? No es necesario, pero engaña los scripts de la tabla de clasificación, haciéndoles pensar que esta respuesta tiene solo 8 bytes de longitud.
RedClover
1

APL (Dyalog) , 75 100 caracteres, 97 122 bytes

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

Pruébalo en línea!

Uriel
fuente
Me encantaría mejorarlo si el votante negativo dijera qué tiene de malo.
Uriel
Ah, claro, de 11 a 19 inclusive, la salida debe ser de 4 caracteres, sin 一
FrownyFrog
@FrownyFrog arreglado
Uriel
0

Python 3 , 142 bytes

La estructura es similar a la respuesta de 146 bytes de ovs , pero los términos medios funcionan de manera diferente.

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

Pruébalo en línea!

Explicación

El término más interesante es el término para el número de decenas:

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

Tenga en cuenta que 20>y!=10significa 20 > y and y != 10, que es Falsecuando se debe incluir el número de decenas y de lo Truecontrario.

Falsetiene un valor entero de 0y Truetiene un valor entero de 1, por lo tanto, mientras n[y//10]que siempre tiene un carácter de largo, el subíndice [20>y!=10:]es equivalente a [0:1](es decir, "el carácter") cuando se debe incluir el número de decenas y[1:1] (es decir, "sin caracteres") de lo contrario.

El siguiente término,

'得十'[y>9]

es más fácil de entender tenga en cuenta que:

  • La salida para cada resultado <= 9 debe contener
  • La salida para cada resultado> 9 debe contener
  • se puede manejar después del término 'decenas' porque el término 'decenas' siempre se evalúa como una cadena vacía cuando hay un

Nota sobre espacios finales

Los espacios finales para múltiplos de diez estiran ligeramente la especificación; como se mencionó en la barra , esto podría hacerse visualmente perfecto usando un espacio de ancho cero, pero luego también tendría que desempaquetar las matrices usando print(*[...])el espacio de ancho cero. como literal "\u200b"cuando se imprime en una matriz.

mjayfrancis
fuente
0

JavaScript, 190 bytes

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

Intentaré jugar golf más tarde.

ericw31415
fuente
0

Rubí , 136 bytes

El recuento de bytes en UTF-8 debe ser de 128 bytes con caracteres Han contados como 2 en lugar de 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","得一二三四五六七八九十"}}

Pruébalo en línea!

  1. Construya las cadenas a partir de dígitos de multiplicadores y productos con estos últimos separados por X un marcador de posición para .
  2. Haz un poco de diversión regex para soltar X de productos <10, los -teen para "" productos y ceros que lleva.
  3. Traduce dígitos y Xcaracteres Han.
Kirill L.
fuente
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

Pruébalo en línea!

* Las especificaciones permiten explícitamente la conversión de GBK → Unicode.

Erik el Outgolfer
fuente
0

Pyth , 49 caracteres, 71 bytes

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

Utiliza codificación UTF-8. Pruébalo en línea aquí .

En la siguiente explicación, los ?caracteres son sustitutos de los caracteres chinos correctos: soy demasiado vago para hacer que todo se alinee correctamente ...

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
fuente