Гольф китайский 9 * 9 на несколько столов

18

Выведите следующую таблицу:

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

Или вы можете использовать первые три буквы в его английском слове, если некоторые языки не поддерживают китайские символы:

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
l4m2
источник
Все остальное кажется довольно интуитивным, но не могли бы вы объяснить, как работают explain и 得?
Денис
得 используется только тогда, когда продукт меньше 10
14 м2
аааа, так что если оно больше 10 вместо 得 мы должны использовать 十?
Луис Фелипе Де Иисус Муньос
@LuisfelipeDejesusMunoz и [11,19] особенные с голым 十.
FrownyFrog
Translation 能 确认 这 是 正确 的。 (Перевод: я могу подтвердить, что это правильно)
Esolanging Fruit

Ответы:

8

Stax , 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

Эта версия создает массив индексов , а затем использует его для индекса строки китайских символов , чтобы избежать избыточных операций стеки ( c, a, 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
Вейцзюнь Чжоу
источник
Stax 1.0.6 может сделать это за 59 лет , но это уже позже, так что это не квалифицированная IMO.
рекурсивный
Стоит упомянуть в любом случае. Он также явно использует некоторую оптимизацию, которая также доступна до 1.0.6.
Вейцзюнь Чжоу
1
Я подозреваю, что в нем все еще остается достаточно места для оптимизации, но я пока оставлю это в покое.
рекурсивный
@recursive В настоящее время, более новые языки программирования, которые не созданы целенаправленно для вопроса, не должны быть помечены как «не конкурирующие» (кто-то связывает мета-пост)
Stan Strum
1
@StanStrum Вот мета пост
PunPun1000
5

Python 3 , 151 149 146 байт

-3 байта благодаря Роду .

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

Попробуйте онлайн!

овс
источник
Просто небольшая заметка, вы можете использовать пробел нулевой ширины '\u200b'(+2 байта) вместо пробела для точного вывода
Rod
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, когда 10, 一十но когда 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"). Я не слишком внимательно присматривался, но есть некоторые другие вещи, которые можно сыграть в гольф.
Mama Fun Roll
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]}*""}}}

Попробуйте онлайн!

Лямбда, возвращающая двумерный массив строк.

->{
  (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
источник
2

YaBasic , 250 242 238 байт

ответ с Юникодом ?! Какая?

Анонимная функция и объявленная вспомогательная функция, 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

Python 3 , 196 байт

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

Попробуйте онлайн!

Dat
источник
二五一十九 二六一十二два вида неправильных
l4m2
@FrownyFrog фиксированной ...
Dat
c[(i*j%10)]=> c[i*j%10]?
14 м2
1

Сетчатка , 100 символов, 122 байта


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

Попробуйте онлайн! Объяснение:


9*

Вставьте девять _с.

_
$`_$n

Разверните до 9 строк от 1 до 9 _с.

_
$%`_$.%= 

(обратите внимание на завершающий пробел) Расширьте до 9 строк от 1 до i _s плюс i в виде цифры.

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

Преобразуйте _s в десятичное и умножьте на i.

\B.
:$&

Вставьте, :если ответ состоит из двух цифр. Это станет tenперсонажем.

:0
:

Удалить ноль единиц.

1:\b
:

Удалите 1из, 1:если только не 1:0было удалено ноль.

,(. )
,0$1

Вставить 0для однозначных ответов; это станет 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]]))

Попробуйте онлайн!

l4m2
источник
Не могли бы вы удалить "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

Попробуйте онлайн!

Уриэль
источник
Я хотел бы улучшить это, если downvoter скажет, что с ним не так.
Уриэль
О, верно, поэтому для
11-19
Исправлена ​​ошибка @FrownyFrog
Уриэль
0

Python 3 , 142 байта

Структура похожа на ОВС 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когда число десятков должно быть включено и в Trueпротивном случае.

Falseимеет целочисленное значение 0и Trueимеет целочисленное значение 1, поэтому, хотя n[y//10]длина всегда равна одному символу, индекс [20>y!=10:]эквивалентен [0:1](то есть «символ»), когда число десятков должно быть включено, и[1:1] (т. е. «нет символов») в противном случае.

Следующий термин,

'得十'[y>9]

легче понять; Обратите внимание, что:

  • Выход для каждого результата <= 9 должен содержать
  • Выход для каждого результата> 9 должен содержать
  • может быть обработано после термина «десятки», потому что термин «десятки» всегда оценивается как пустая строка, когда есть

Обратите внимание на конечные пробелы

Конечные пробелы, кратные десяти, немного растягивают спецификацию - как упоминалось в штанге , это можно сделать визуально идеальным, используя пробел нулевой ширины, но тогда вам также придется распаковать массивы, используя print(*[...])представленное пробел нулевой ширины. как литерал "\u200b"при печати в массиве.

mjayfrancis
источник
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"}`)

Я попробую сыграть в гольф позже.

ericw31415
источник
0

Рубин , 136 байт

Число байтов в UTF-8 должно составлять 128 байтов, при этом символы Хань считаются как 2 вместо 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","得一二三四五六七八九十"}}

Попробуйте онлайн!

  1. Построить строки из цифр множителей и продуктов с последними, разделенными Xкак заполнитель для .
  2. Порадуйте себя забавным регулярным выражением, чтобы упасть Xдля продуктов <10, лидирующих для "-надцать" продуктов и конечных нулей.
  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.

Эрик Outgolfer
источник
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
Sok
источник