Гольф китайський 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

Решта здається досить інтуїтивно зрозумілим, але ви могли хоч би пояснити, як 十 і 得 працюють?
Денніс

得 застосовується лише тоді, коли виріб менше 10
м2

ах, так, якщо це більше, ніж 10 замість 得 ми повинні використовувати 十?
Luis felipe De jesus Munoz

@LuisfelipeDejesusMunoz і [11,19] є особливими з голою 十.
FrownyFrog

我 能 确认 这 是 正确 的。 (Переклад: Я можу підтвердити, що це правильно)
Esolanging Fruit

Відповіді:


8

Стакс , 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 , але він відкладає виклик, тому він не є кваліфікованим ІМО.
рекурсивна

Варто згадати все одно. Він також очевидно використовує деяку оптимізацію, яка також доступна до 1.0.6.
Вейджун Чжоу

1
Я підозрюю, що в ній ще залишилося пристойну кількість оптимізаційних приміщень, але я зараз залишаю її в спокої.
рекурсивна

@recursive У наш час новіші мови програмування, які не зроблені цілеспрямовано для запитання, не повинні позначатись «не конкуруючий» (хтось посилається на мета-повідомлення)
Stan Strum

1
@StanStrum Ось
PunPun1000

5

Пітон 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 Так, я не помітив різниці при використанні 得
Luis felipe De jesus Munoz

1
@FrownyFrog, коли дорівнює 10, 一十але коли 15 чи 16, або будь-яке інше число ми опускаємо ?
Luis felipe De jesus Munoz

@FrownyFrog Чи можете ви зараз поглянути?
Luis felipe De jesus Munoz

Все добре, молодець.
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]}*""}}}

Спробуйте в Інтернеті!

Лямбда, що повертає 2D масив рядків.

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

Ябасич , 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

Сітківка , 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]]))

Спробуйте в Інтернеті!


Не могли б ви видалити "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

Спробуйте в Інтернеті!


Я хотів би вдосконалити його, якби поточник сказав, що з цим не так.
Уріель

О, правда, тому для 11 до 19 включно вихід повинен становити 4 символи, без 一
FrownyFrog

@FrownyFrog виправлено
Уріель

0

Пітон 3 , 142 байти

Структура схожа на ovs 's 146 byte відповідь, але середні члени працюють по-іншому.

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"при друкуванні в масиві.


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

Я спробую пограти в гольф пізніше.


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, провідних для продуктів "-teen" та кінцевих нулів.
  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

Спробуйте в Інтернеті!

* Spec явно дозволяє конвертувати GBK → Unicode.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.