Сколько сторон у этого многоугольника?

13

Итак, в 1 классе по математике вы узнаете названия полигонов. Три стороны - это треугольник, 4 - это квадрат, а 5 - это пятиугольник. Тем не менее, в 1-м классе отличием вы идете немного дальше.

Ваш вызов

Существует система именования полигонов выше нескольких сторон, поэтому произвольно большие полигоны имеют имя.

Ваша задача - написать программу или функцию, которая принимает имя многоугольника в качестве входных данных и выводит количество сторон него есть.

Имена полигонов определены как в левом столбце этой статьи в Википедии. с некоторыми исключениями.

Трехсторонние многоугольники будут называться треугольником вместо треугольника, а четырехсторонние многоугольники будут квадратом вместо четырехугольника (предположим, что все многоугольники правильные). В противном случае будут использованы имена в статье.

правила

  • Ввод будет строковым значением.
  • Программа должна напечатать результат в STDOUT (или она должна вернуть целое число).
  • Будут введены только полигоны от 3 до 99.
  • Ваша программа должна удовлетворять всем тестовым случаям.
  • Нет стандартных лазеек.
  • Программе не нужно ничего делать для недопустимых / недоступных входов.
  • Оценка в байтах. Поскольку это , выигрывает самая короткая программа.

Контрольные примеры

3   triangle
4   square
5   pentagon
10  decagon
11  hendecagon
12  dodecagon
13  triskaidecagon
20  icosagon
21  icosikaihenagon
22  icosikaidigon
34  triacontakaitetragon
35  triacontakaipentagon
36  triacontakaihexagon
47  tetracontakaiheptagon
48  tetracontakaioctagon
49  tetracontakaienneagon
64  hexacontakaitetragon
80  octacontagon
81  octacontakaihenagon
99  enneacontakaienneagon

Leaderboards

Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Если вы хотите включить в свой заголовок несколько чисел (например, потому что ваш счет равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:

# Perl, 43 + 2 (-p flag) = 45 bytes

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

# [><>](http://esolangs.org/wiki/Fish), 121 bytes
Даниэль М.
источник
10
Связанный
FryAmTheEggman
1
Не все четырехугольники являются квадратами.
Деннис
@Dennis Но все правильные тетрагоны.
Даниэль М.
Обратите внимание, что вопрос, на который указывает FryAmTheEggman, идет в противоположном направлении: этот вопрос идет от имени к числу сторон, а предыдущий - от количества сторон к имени.
Исаак
Близкие избиратели: эти вопросы не совпадают.
Даниэль М.

Ответы:

7

Рубин, 405 207 байт

207 байтов

->a{i,n=0,"#{a}";[/ontag|sa/,/(he|mo)n/,/di|do|ic/,/tri/,/tet|q/,/pe/,/hex/,/hep/,/oc/,/enn/,/^d/,/1d/,/2d/].each{|r|n.gsub!(r,i.to_s);i+=1;};n=n.gsub(/ide/,'!').gsub(/[a-z]/,'');n='1'+n[0] if /!/=~n;n.to_i}

Ungolfed 207

    sides = ->a{
          i,n=0,"#{a}";
          # Match patterns for zero, one, two, etc. 
          # Each regex corresponds to a digit.
          # Special patterns for 10, 11 and 12.
          [/ontag|sa/,/(he|mo)n/,/di|do|ic/,/tri/,
             /tet|q/,/pe/,/hex/,/hep/,/oc/,/enn/,
             /^d/,/1d/,/2d/].each {|r| n.gsub!(r, i.to_s);i+=1;};
          n=n.gsub(/ide/,'!').  # Change part of the teens to exclamation
              gsub(/[a-z]/,''); # Remove remaining unmatched letters
          n='1'+n[0] if /!/=~n; # Fixup the teens
          n.to_i
      }

405 байтов:

->a{d=%w(on hen d tr te p hex hep oc e);case a when/de/ then %w(de hen do tr te p hex hep o e ).index(a[/^(he|t|d)?./]||:de)+10;when/^([mdtspoe]|he[xp]).{,7}$/ then %w(z m d t s p hex hep o e).index($1);when/^i.*[ks]a.([dep]|on|oc|tr|te|hen|hex|hep)/ then d.index($1)+20;when/^((he|t)?[^ht]).*nta(kai)?([gdpoe]|tr|te|hen|hex|hep)/ then (3+%w(tr te p hex hep o e).index($1))*10+(d.index($4)||0)else 0;end}

Ungolfed 405

def sides(a)
  d=%w(on hen d tr te p hex hep oc e);
  case a 
    when /de/ then %w(de hen do tr te p hex hep o e ).index(a[/^(he|t|d)?./]||:de)+10;
    when /^([mdtspoe]|he[xp]).{,7}$/ then %w(z m d t s p hex hep o e).index($1);when/^i.*[ks]a.([dep]|on|oc|tr|te|hen|hex|hep)/ then d.index($1)+20;
    when /^((he|t)?[^ht]).*nta(kai)?([gdpoe]|tr|te|hen|hex|hep)/ then (3+%w(tr te p hex hep o e).index($1))*10+(d.index($4)||0)
    else 0;
  end
end

Может быть, не самая лучшая подача в гольф, но она может выиграть в конкурсе запутанного кода!

Тестовое задание

polygons = %w(
  gone
  monogon digon
  triangle square
  pentagon hexagon  
  heptagon octagon  
  enneagon decagon  
  hendecagon dodecagon
  triskaidecagon tetrakaidecagon
  pentakaidecagon hexakaidecagon
  heptakaidecagon octakaidecagon
  enneakaidecagon icosagon
  icosikaihenagon icosikaidigon
  icosikaitrigon icosikaitetragon
  icosikaipentagon icosikaihexagon
  icosikaiheptagon icosikaioctagon
  icosikaienneagon triacontagon  
  triacontakaihenagon triacontakaidigon
  triacontakaitrigon triacontakaitetragon
  triacontakaipentagon triacontakaihexagon
  triacontakaiheptagon triacontakaioctagon
  triacontakaienneagon tetracontagon
  tetracontakaihenagon tetracontakaidigon
  tetracontakaitrigon tetracontakaitetragon
  tetracontakaipentagon tetracontakaihexagon
  tetracontakaiheptagon tetracontakaioctagon
  tetracontakaienneagon pentacontagon
  pentacontakaihenagon pentacontakaidigon
  pentacontakaitrigon pentacontakaitetragon
  pentacontakaipentagon pentacontakaihexagon
  pentacontakaiheptagon pentacontakaioctagon
  pentacontakaienneagon hexacontagon
  hexacontakaihenagon hexacontakaidigon
  hexacontakaitrigon hexacontakaitetragon
  hexacontakaipentagon hexacontakaihexagon
  hexacontakaiheptagon hexacontakaioctagon
  hexacontakaienneagon heptacontagon
  heptacontakaihenagon heptacontakaidigon
  heptacontakaitrigon heptacontakaitetragon
  heptacontakaipentagon heptacontakaihexagon
  heptacontakaiheptagon heptacontakaioctagon
  heptacontakaienneagon octacontagon
  octacontakaihenagon octacontakaidigon
  octacontakaitrigon octacontakaitetragon
  octacontakaipentagon octacontakaihexagon
  octacontakaiheptagon octacontakaioctagon
  octacontakaienneagon enneacontagon
  enneacontakaihenagon enneacontakaidigon
  enneacontakaitrigon enneacontakaitetragon  
  enneacontakaipentagon enneacontakaihexagon
  enneacontakaiheptagon enneacontakaioctagon
  enneacontakaienneagon
  )

sides =  ->a{i,n=0,"#{a}";[/ontag|sa/,/(he|mo)n/,/di|do|ic/,/tri/,/tet|q/,/pe/,/hex/,/hep/,/oc/,/enn/,/^d/,/1d/,/2d/].each{|r|n.gsub!(r,i.to_s);i+=1;};n=n.gsub(/ide/,'!').gsub(/[a-z]/,'');n='1'+n[0] if /!/=~n;n.to_i}

polygons.each {|p| puts "#{p} -> #{sides.call(p)}"; }
Павел Чернох
источник
4

Python2 - 357 368 байт

Поскольку единственными реальными исключениями для системы являются «квадрат», «hendecagon» и «dodecagon», все остальные числа следуют той же схеме: «kai» для вторых цифр и «conta» / «deca» для их первой цифры.

import sys;s=input();e=eval;x='y(str(10*i(b)+i(a)))';y=sys.exit;a=b='0';l=['0','hen','di','tri','tet','pen','hex','hep','oct','enn'];i=l.index
if'kai'in s:
 a=[f for f in l if f in s[-8:]][0]
if'ca'in s:
 if l[1]in s:y("11")
 if'do'in s:y("12")
 b=l[1];e(x)
elif'co'in s:
 l[2]='ico';b=[f for f in l if f in s[:5]][0];e(x)
if'sq'in s:y("4")
y(str(i(s[:3])))

Объяснение:

import sys;s=input();e=eval;x='y(str(10*i(b)+i(a)))';y=sys.exit;a=b='0'
l=['0','hen','di','tri','tet','pen','hex','hep','oct','enn']
# List of all defining numerals, index equals the number.
i=l.index

if'kai'in s:                       # check if the input is a two-digit number 
                                   # with a second digit greater than 0
 a=[f for f in l if f in s[-8:]][0] # get the second digit, and store it.

if'ca'in s:                        # Special case for 10-19
 if l[1]in s:y("11")               # Exceptions 11 & 12 
 if'do'in s:y("12")                #
 b=l[1];e(x)
elif'co'in s:                      # All other two digit numbers
 l[2]='ico'
 b=[f for f in l if f in s[:5]][0] # Get the first digit, and store it
 e(x) 
if'sq'in s:y("4")                  # Exception "square"
y(str(i(s[:3])))                   # All other single digit numbers 

Это работает для всех входов от 3 до 99 и выводит результат на консоль.

Может быть, лучше играть в гольф, но это насколько я могу пойти прямо сейчас.

** Редактировать: я только что понял, это напечатано в STDERR, а не STDOUT. Фиксированный код немного длиннее:

import sys;s=input();e=eval;x="10*i(b)+i(a)";y=sys.exit;a=b='0';l=['0','hen','di','tri','tet','pen','hex','hep','oct','enn'];i=l.index
if'kai'in s:a=[f for f in l if f in s[-8:]][0]
if'ca'in s:
 if l[1]in s:print"11"
 if'do'in s:print"12"
 b=l[1];print e(x);y()
elif'co'in s:l[2]='ic';b=[f for f in l if f in s[:5]][0];print e(x);y()
if'q'in s:print"4"
print(i(s[:3]))
Kijata
источник
Можете ли вы сохранить байт, просто протестировав qвместо sq?
Нил
Да, ты прав. Ты
Киджата
Вы удаляете import sys;и просто используете y=exit. Это делает то же самое.
Rɪᴋᴇʀ
2

Корица, 430 байт

0000000: 6c4c ce85 0d04 4108 05d0 6e36 9e5b 379a  lL....A...n6.[7.
0000010: 5977 f7f2 6f02 8410 fdbc 11fe 75f4 f9d2  Yw..o.......u...
0000020: 4eb5 e5c1 b9df f951 5b3e 6cf5 72e5 edba  N......Q[>l.r...
0000030: 5801 74f5 8729 3469 238c 602d 29c5 502f  X.t..)4i#.`-).P/
0000040: 4b8d 3181 aa2e 3139 b6b9 bac8 e440 b5ca  K.1...19.....@..
0000050: e082 5977 8e79 2fe2 c155 5f47 ae89 f76b  ..Yw.y/..U_G...k
0000060: a21e 5ab8 8f26 eaa5 85fb 694a a02f d713  ..Z..&....iJ./..
0000070: b36b 63ee cdb1 294c e408 553d 822b 701d  .kc...)L..U=.+p.
0000080: 249e 0836 47f3 c5b0 3a5a a07e ff88 4245  $..6G...:Z.~..BE
0000090: 1b5f 8bc4 d692 2916 c2fa 6809 98fd 79b9  ._....)...h...y.
00000a0: f2ef 9e0d 32ff 9baa 8b43 3982 288a a121  ....2....C9.(..!
00000b0: 35d4 c3fc 03b3 3f4b cbd2 1d3a 43ad d77f  5.....?K...:C...
00000c0: 1ef2 9fe1 bc44 1ce7 b862 39e1 8ee7 a43a  .....D...b9....:
00000d0: a653 ceb8 4eab 633b e38c efec d7f7 0060  .S..N.c;.......`
00000e0: dc04 0be3 a143 8c57 1563 1c67 2123 3c48  .....C.W.c.g!#<H
00000f0: 19c9 6066 94bb 9cd1 0c86 c6b8 4b1a fbf5  ..`f........K...
0000100: f546 9a37 c1d2 7ce8 48f3 a54a 9ac7 59d2  .F.7..|.H..J..Y.
0000110: 0c0f 9266 7a40 9ae5 2e69 b607 a439 ee92  ...fz@...i...9..
0000120: e67e fe6a 81d6 cd59 ce7a c87f cc7a 8928  .~.j...Y.z...z.(
0000130: eb50 8dac a0db 5849 17b1 8a6c 6135 5dc0  .P....XI...la5].
0000140: 1ab2 7db5 5fff 4100 fb26 58d8 0f1d 62bf  ..}._.A..&X...b.
0000150: 5419 fb28 1bd9 a1c1 ca4e 0633 bbd4 edec  T..(.....N.3....
0000160: 6630 b447 ddd2 decf bf56 a073 7396 739e  f0.G.....V.ss.s.
0000170: bf0c 735e 22ca 3954 2327 e836 4ed2 459c  ..s^".9T#'.6N.E.
0000180: 225b 384d 1770 866c dfec d785 02e0 de04  "[8M.p.l........
0000190: 0bf7 a143 dc97 2ae3 1e65 2337 3458 b9c9  ...C..*..e#74X..
00001a0: 60e6 96ba 9ddb 0c86 eea8 5bba fb1f       `.........[...

Не конкурирует, так как Корица Gum была сделана после этого испытания. Это hexdump исходного кода; Вы можете изменить это, используяxxd -r .

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

спагетто
источник