Golf Çin 9 * 9 çoklu masa


18

Aşağıdaki tabloyu çıktılayın:

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

Veya bazı dillerin Çince karakterleri desteklememesi durumunda, İngilizce kelimesindeki ilk üç harfi kullanabilirsiniz:

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

Herhangi bir makul formatta çıktı alabilirsiniz, örneğin boşluk / virgül / sekme ve satırsonu ile ayrılmış düz metin, boş yerlerin boş olduğu veya mevcut olmadığı 2B dizi (2 * 1 yer boştur, bu nedenle dizi).

Kod golf, bayt kazanmak en kısa kodu. GBK kodlamasına izin verilir, burada her Çince karakter 2 bayt kullanır.

Dönüştürme Tablosu:

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

Gerisi oldukça sezgisel görünüyor, ama en azından nasıl çalıştığını açıklayabilir misiniz?
Dennis

Ürün daha küçük 10 olduğunda得sadece kullanılır
l4m2

ahhh, yani 10'dan büyükse 得 kullanmalıyız 十?
Luis felipe De jesus Munoz

@LuisfelipeDejesusMunoz ve [11,19] çıplak 十 ile özeldir.
FrownyFrog

Translation this 确认 这 是 正确 的。 (Çeviri: Bunun doğru olduğunu onaylayabilirim)
Esolanging Fruit

Yanıtlar:


8

Stax , 66 karakter

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

Bayt sayısı Çince karakterler için kullanılan kodlamaya bağlıdır.

Çevrimiçi çalıştırın ve hata ayıklayın!

açıklama

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

Alternatif sürüm (Stax 1.0.6), 59 bayt (@recursive tarafından)

Bu, bu zorluktan esinlenen bir özellik kullanır ve yalnızca bu zorluğun önündeki Stax 1.0.6'ya dahil edilir.

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

ASCII sürümü

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

Bu sürüm endeks dizisi oluşturur ve daha sonra gereksiz yığın işlemleri önlemek için endekse Çince karakter dizesini kullanır ( c, a, n) ve çoklu @s.

açıklama

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 bunu 59'da yapabilir , ancak meydan okumayı sonlandırır, bu nedenle nitelikli IMO değildir.
özyinelemeli

Yine de kayda değer. Ayrıca, 1.0.6'dan önce de kullanılabilen bazı optimizasyonları da kullanıyor.
Weijun Zhou

1
Hala içinde iyi bir optimizasyon odası kalmış şüpheli, ama şimdilik yalnız bırakacağım.
özyinelemeli

@recursive Günümüzde, bir soru için kasıtlı olarak yapılmayan daha yeni programlama dillerinin 'rakip olmayan' olarak işaretlenmesi gerekmez (birisi meta gönderiyi bağlar)
Stan Strum


5

Piton 3 , 151 149 146 bayt

Rod sayesinde -3 bayt .

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

Çevrimiçi deneyin!


Sadece küçük bir not, tam çıkış'\u200b' için boşluk yerine sıfır genişlikli alanı (+2 bayt) kullanabilirsiniz
Rod

3

Javascript, 190 bayt

(_="得一二三四五六七八九十")=>{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 Evet, when kullanırken fark etmedim
Luis felipe De jesus Munoz

1
@FrownyFrog 10, 一十ancak 15 veya 16 veya atladığımız başka bir sayı ne zaman ?
Luis felipe De jesus Munoz

@FrownyFrog Şimdi bir göz atabilir misiniz?
Luis felipe De jesus Munoz

Hepsi iyi, aferin.
FrownyFrog

Deneyin (_="得一二三四五六七八九十")=>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"). Çok yakından bakmadım, ama kesinlikle golf oynayabileceğiniz başka şeyler var.
Mama Fun Roll

2

Ruby , 166 bayt

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

Çevrimiçi deneyin!

2B dizgi dizisi döndüren lambda.

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

Bir unicode karakterleri ile cevap ?! Ne?

c(n)STDOUT'a girdi ve çıktı almayan anonim işlev ve bildirilen yardımcı işlev

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

Çevrimiçi deneyin!


1

Python 3 , 196 bayt

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

Çevrimiçi deneyin!


二五一十九 二六一十二iki çeşit yanlış
l4m2

@FrownyFrog sabit ...
Dat

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

1

Retina , 100 karakter, 122 bayt


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

Çevrimiçi deneyin! Açıklama:


9*

Dokuz _saniye ekleyin .

_
$`_$n

1 ila 9 _sn'lik 9 satıra genişletin .

_
$%`_$.%= 

(sondaki boşluğu not edin) _Rakam olarak 1 ila i s artı i arasındaki 9 satıra genişletin .

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

S'yi _ondalık sayıya dönüştürün ve i ile çarpın.

\B.
:$&

Bir ekleme :cevap iki basamağa sahipse. Bu tenkarakter olacak .

:0
:

Sıfır birimi silin.

1:\b
:

Sıfır kaldırılmadığı sürece 1gelen 1:öğeyi silin 1:0.

,(. )
,0$1

0Tek basamaklı cevaplar için a ekleyin ; bu getkarakter olacak .

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

Tüm karakterleri düzeltin.


1

JavaScript (Node.js) , 141/130 bayt

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

Çevrimiçi deneyin!


"UTF8" i başlıktan çıkarır mısınız? Gerekli değildir, ancak afiş tablosu komut dosyalarını kandırır ve bu cevabın sadece 8 bayt uzunluğunda olduğunu düşünmelerini sağlar.
18:34 RedClover

1

APL (Dyalog) , 75 100 karakter, 97 122 bayt

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

Çevrimiçi deneyin!


Düşürücü onun neyin yanlış olduğunu söylese onu geliştirmek isterim.
Uriel

Oh, doğru, yani 11 ila 19 dahil olmak üzere çıktı 4 karakter olmalı, hayır 一
FrownyFrog

@FrownyFrog sabit
Uriel

0

Python 3 , 142 bayt

Yapı, ovs'un 146 baytlık cevabına benzer , ancak orta terimler farklı bir şekilde çalışır.

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

Çevrimiçi deneyin!

açıklama

En ilginç terim onlarca sayı terimidir:

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

Not 20>y!=10aracı 20 > y and y != 10olan Falseon sayısı dahil edilmesi gerektiği zaman True, aksi.

Falsebir tamsayı değerine sahiptir 0ve Truebir tamsayı değerine sahiptir 1, bu nedenle n[y//10]her zaman bir karakter uzunluğunda olsa da, onlarca sayı dahil edilmesi gerektiğinde alt simge [20>y!=10:]eşdeğerdir [0:1](yani "karakter") ve[1:1] aksi takdirde "karakter yok").

Aşağıdaki terim,

'得十'[y>9]

anlaşılması daha kolaydır; Bunu not et:

  • Her sonuç için çıktı <= 9 içermelidir
  • 9'dan büyük her sonuç için çıktı şunları içermelidir:
  • 'onlarca' teriminden sonra işlenebilir çünkü 'onlarca' terim her zaman boş bir dizeye

Sondaki boşluklar hakkında not

On katların sonundaki boşluklar spesifikasyonu hafifçe uzatır - çubukla belirtildiği gibi , bu sıfır genişlikli bir boşluk kullanılarak görsel olarak mükemmel hale getirilebilir, ancak daha sonra print(*[...])sıfır genişlikli alan temsil edildiğinde dizileri paketinden çıkarmanız gerekir. "\u200b"dizide yazdırıldığında değişmez olarak .


0

JavaScript, 190 bayt

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

Bunu daha sonra golf yapmaya çalışacağım.


0

Yakut , 136 bayt

UTF-8'deki bayt sayısı, Han karakterleri 3 yerine 2 olarak sayılan 128 bayt olmalıdır.

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","得一二三四五六七八九十"}}

Çevrimiçi deneyin!

  1. Dizeleri çarpan ve ürün basamaklarından ayırarak dizeleri X için yer tutucu olarak olarak oluşturun .
  2. Bırakmak için biraz regex eğlenceli yapın X"10" ürün için önde gelen ürünler ve sondaki sıfırlar için, <10 ürüne için .
  3. Rakamları ve XHan karakterlerine çevirin.

0

/// , 301 bayt (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

Çevrimiçi deneyin!

* Spec açıkça GBK → Unicode dönüşüm sağlar.


0

Pyth , 49 karakter, 71 bayt

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

UTF-8 kodlamasını kullanır. Burada çevrimiçi deneyin .

Aşağıdaki açıklamada, ?karakterler doğru Çince karakterlerin yerine geçiyor - her şeyi düzgün bir şekilde sıralamak için çok tembelim ...

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.