Awalan poligon

17

Poligon diberi nama berdasarkan jumlah sisi yang mereka miliki. Sebuah segi lima memiliki 5 sisi, segi delapan memiliki 8 sisi. Tapi bagaimana namanya? Apa nama untuk poligon bersisi 248?

Semua poligon diakhiri dengan -gon. Ada awalan khusus untuk setiap poligon tergantung pada jumlah sisi. Berikut adalah awalan untuk angka yang lebih rendah:

3 - tri
4 - tetra
5 - penta
6 - hexa
7 - hepta
8 - octa
9 - nona
10 - deca
11 - undeca
12 - dodeca
13 - triskaideca
14 - tetradeca
15 - pentadeca
16 - hexadeca
17 - heptadeca
18 - octadeca
19 - nonadeca
20 - icosa

Poligon dengan sisi 21 hingga 99 memiliki sistem yang berbeda. Ambil awalan untuk puluhan digit (ditemukan di kolom kiri), digit yang (kolom kanan di bawah), dan kemudian tempelkan "kai" di antara mereka untuk mendapatkan (tens)kai(ones)gon.

10 - deca        | 1 - hena
20 - icosi       | 2 - di
30 - triaconta   | 3 - tri
40 - tetraconta  | 4 - tetra
50 - pentaconta  | 5 - penta
60 - hexaconta   | 6 - hexa
70 - heptaconta  | 7 - hepta
80 - octaconta   | 8 - octa
90 - nonaconta   | 9 - nona

Poligon sisi 3 digit diberi nama dengan cara yang sama. Poligon bersisi 100 disebut satu hektogon. Ambil ratusan digit, temukan di kolom untuk digit satu, lalu tempelkan "hekta" di sebelah kanannya. Sekarang jumlah dari puluhan dan satuan seperti di atas: (hundreds)hecta(tens)kai(ones)gon. Jika digit angka ratusan adalah 1, jangan letakkan awalan di belakang "hekta"; jika tempat yang adalah 0, maka abaikan bagian (yang).

Jadi, diberi bilangan bulat (3 <= n <= 999), kembalikan nama poligon bersisi-n. n-gonbukan jawaban yang valid: P

Seperti semua kode golf, kode terpendek menang.

beary605
sumber
100-sisi adalah hektogon atau hektagon? Angka puluhan di atas 100 juga tidak jelas. Saya kira 110 dan 120 adalah hektahenakaigon dan hektadikaigon (atau hektaicosikaigon?)
ugoren
Juga, 101-sisi adalah "hektakaihenagon" (seperti yang saya mengerti dari aturan Anda) atau "hektahenagon"?
ugoren
@ beary605 Saya pikir tidak ada yang salah. Itu akan dari bahasa latin dan yang lainnya, hepta-, hexa berasal dari bahasa yunani. Itu harus ennea-. Saya tahu wikipedia mengatakan nonagon OK!
felipa
@ Felipa: Saya berdebat apakah itu akan terjadi ennea-, tapi saya sudah sering mendengar "nonagon" daripada "enneagon", jadi saya setuju.
beary605
@ugoren: 100 - hektagon, dan saya tidak melihat bahwa saya tidak punya deca, terima kasih sudah menunjukkannya. 110 - hektadecagon, 120 - hektaicosigon. 101 - hektakaihenagon.
beary605

Jawaban:

5

C, 401 , 391

Mari kita letakkan sesuatu di sana sehingga setidaknya ada satu jawaban untuk referensi :-)

char*s[]={"","hena","di","tri","tetra","penta","hexa","hepta","octa","nona","un","do","triskai","deca","icosi","tria","conta","kai","icosa","hecto","hecta","gon\n"};
p(i){printf(s[i]);}
t;n(i){
    if(i<10)
        p(i);   // ones
    else if(i<20){
        i-=10; 
        p(i+(i&&i<4)*9); // teens
        p(13); // "deca"
    }else if(i==20)
        p(18); // "icosa"
    else if(i==100)
        p(19); // "hecto"
    else{
        t=i/100;
        p(t>1?t:0); // hundreds
        p(t?20:0);  // "hecta"
        i%=100;
        t=i/10;
        p(t+(t&&t<4)*12); // tens
        p(t>2?16:0);      // "conta"
        i%=10;
        p(i?17:0); // "kai"
        p(i);      // ones
    }
    p(21); // "gon\n"
}

Uji dengan:

main(){
    for(int i=3;i<=999;i++){
        printf("%3d: ",i);n(i);
    }
}

Subset dari output:

  3: trigon
  4: tetragon
  5: pentagon
  6: hexagon
  7: heptagon
  8: octagon
  9: nonagon
 10: decagon
 11: undecagon
 12: dodecagon
 13: triskaidecagon
 14: tetradecagon
 15: pentadecagon
 16: hexadecagon
 17: heptadecagon
 18: octadecagon
 19: nonadecagon
 20: icosagon
 21: icosikaihenagon
 22: icosikaidigon
 23: icosikaitrigon
...
 99: nonacontakainonagon
100: hectogon
101: hectakaihenagon
102: hectakaidigon
103: hectakaitrigon
104: hectakaitetragon
105: hectakaipentagon
106: hectakaihexagon
107: hectakaiheptagon
108: hectakaioctagon
109: hectakainonagon
110: hectadecagon
111: hectadecakaihenagon
...
997: nonahectanonacontakaiheptagon
998: nonahectanonacontakaioctagon
999: nonahectanonacontakainonagon
bayi-kelinci
sumber
1
Bagus. Anda dapat mengganti if..elsedengan ?:(dan ;dengan ,) untuk menyimpan beberapa karakter. Juga t>1&&p(t)dan perubahan serupa dapat membantu. Dan saya tidak yakin, tapi mungkin Anda bisa mengatur ulang ssehingga konstanta yang Anda gunakan adalah satu digit.
ugoren
1

JavaScript - 405 386

Versi 1: (405 karakter)

i=prompt(),o='0hena0di0tri0tetra0penta0hexa0hepta0octa0nona'.split(0),d='0W0icosi0triaQ0tetraQ0pentaQ0hexaQ0heptaQ0octaQ0nonaQ'.split(0),t='W0unW0doW0triskaiW0tetraW0pentaW0hexaW0heptaW0octaW0nonaW0icosa'.split(0),x=('000'+i).substr(-3).split('');alert((i<10?o[i]:i<21?t[i-10]:i==100?'hecto':(i<100?'':i<200?'hecta':o[x[0]]+'hecta')+d[x[1]]+'kai'+o[x[2]]).replace(/Q/g,'conta').replace(/W/g,'deca')+'gon')

Versi 2: (386 karakter)

i=prompt(),p='0tetra0penta0hexa0hepta0octa0nona',o='0hena0di0tri'+p,t=('W0unW0doW0triskai'+p.replace(/0/g,'W0')+'W0icosa').split(0),x=('000'+i).substr(-3).split(''),o=o.split(0);alert((i<10?o[i]:i<21?t[i-10]:i==100?'hecto':(i<100?'':i<200?'hecta':o[x[0]]+'hecta')+('0W0icosi0tria'+p.replace(/0/g,'Q0')+'Q').split(0)[x[1]]+'kai'+o[x[2]]).replace(/Q/g,'conta').replace(/W/g,'deca')+'gon')

Contoh keluaran:

3: trigon
4: tetragon
5: pentagon
6: hexagon
7: heptagon
8: octagon
9: nonagon
10: decagon
11: undecagon
12: dodecagon
13: triskaidecagon
14: tetradecagon
15: pentadecagon
16: hexadecagon
17: heptadecagon
18: octadecagon
19: nonadecagon
20: icosagon
21: icosikaihenagon
22: icosikaidigon
23: icosikaitrigon
99: nonacontakainonagon
...
100: hectogon
101: hectakaihenagon
102: hectakaidigon
103: hectakaitrigon
104: hectakaitetragon
105: hectakaipentagon
106: hectakaihexagon
107: hectakaiheptagon
108: hectakaioctagon
109: hectakainonagon
110: hectadecakaigon
111: hectadecakaihenagon
...
997: nonahectanonacontakaiheptagon
998: nonahectanonacontakaioctagon
999: nonahectanonacontakainonagon 
Дамян Станчев
sumber
0

Cobra - 370 byte

Ini saat ini fungsi, tetapi jika itu tidak diizinkan maka saya akan mengubahnya.

def f(x) as String
    o='. hena di tri tetra penta hexa hepta octa nona'.split
    o[0],t,h,d='',['','deca','icosci','triconta'],['','hecta','dihecta','trihecta'],['undeca','dodeca','triskaideca']
    for z in 4:10,t,h,d=t+[o[z]+'conta'],h+[o[z]+'hecta'],d+[o[z]+'deca']
    for z in 10,t[z]+='kai'
    return if(x-100,h[x//100]+if(10<x<20,d[x-11],t[x%100//10]+o[x%10]),'hecto')+'gon'

Dan untuk beberapa alasan stabilo kobra telah //ditetapkan sebagai komentar, yang salah.

Suram
sumber