Проаналізуйте свою кафедру


11

Цей виклик заснований на налаштуванні стільця Downgoat's .

Виклик

Ви щойно налаштували свій новий крісло! Він вам ідеально підходить. Однак колесо скрипить, і ви знаєте, що ремонтники змінить регулювання. Проблема в тому, що у вас немає лінійки, тому вам доведеться написати програму, щоб її виміряти. Люди з ремонту можуть чекати лише так довго. Тому ваш код повинен бути якомога коротшим.
Приклад регульованого крісла

Приклади

O
|
|
| _
| |
|_|_
  |
  |
  O

5,3,2,2,1

O
|  _
|  |
|__|__
   |
   |
 __|__
 OOOOO

3,5,2,3,5

O
|      _
|______|______
 ______|______
 OOOOOOOOOOOOO

2,13,1,1,13

Частини крісла

Стілець має різні компоненти:

O  <- Headrest
|
|  <- Backrest
|  _  <- Armrest
|  |
|__|__ <- Seat
   |  
   |   <- Leg
  _|_
  OOO  <- Wheels

Детальний опис стільця

Частини крісла:


Підголівник: Над спинкою завжди буде одна підголівник

O
|

Спинка спинки: кількість |- це висота спинки

O
|
|

Сидіння: Число _є Ширина сидіння , є |в середині для підлокітника.

__|__

Підлокітник: Кількість |- це висота підлокітника . Це буде вставлено посередині сидіння.

_
|
|

Нога: Кількість |- висота ноги

|
|

Колеса: колеса по центру розташовані нижче ніжок. Якщо їх декілька, усі, крім центрального колеса, матимуть _рядок над ними.

_ _
OOO

Вихідні дані

Давши крісло, ви будете виводити різні змінні.

Вихід повинен бути у такому порядку:

  1. Висота спинки
  2. Ширина сидіння завжди непарна
  3. Висота підлокітника Завжди менше висоти спинки
  4. Висота ноги
  5. Кількість коліс Завжди менше або дорівнює ширині сидінь та Завжди непарних

Вихід може мати зворотний новий рядок або бути у формі масиву / списку, якщо це функція.

Таблиця лідерів

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# 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

Вимірюється підлокітник?
Дж. Аткін

Відповіді:


3

Луа, 187 байт

Я думаю, що я міг би ще трохи пограти в нього, але думаю, що це добре зараз. Крім того, якщо висновок потрібно розділити комою, я можу це виправити, але це все ще відповідає вимогам, що містяться в принципі.

Також введення подається в один рядок. Після введення коліс натисніть клавішу Enter з порожнім рядком для завершення введення.

c={}i=1t=""while c[i-1]~=""do c[i]=io.read():gsub("%s+","")t=t..c[i]a=(not a and c[i]:find("_")and i or a)s=(not s and c[i]:find("_|_")and i or s)i=i+1 end print(s-1,c[s]:len()-1,s-a,#c-s-2,c[#c-1]:len())

Безумовно

c={}
i=1
while c[i-1]~=""do 
    c[i]=io.read():gsub("%s+","")          --remove spaces
    a=(not a and c[i]:find"_"and i or a)   --armrest position
    s=(not s and c[i]:find"_|_"and i or s) --seat position
    i=i+1
end
print(s-1, c[s]:len()-1, s-a, #c-s-2, c[#c-1]:len())

(Позиції вимірюються зверху вниз, тому верхнє "O" - це позиція 1, а колеса - найбільше.

  • Висота спинки спинки - це положення сидіння мінус одне, компенсуючи "O" вгорі.
  • Розмір сидіння - це довжина гонитви в положенні сидіння мінус одна, компенсуючи спинку спинки.
  • Висота підлокітника - це положення сидіння мінус положення підлокітника.
  • Висота ноги - це висота стільця ( #c) мінус положення сидіння мінус 2, щоб компенсувати колеса та сидіння.
  • Кількість коліс - це довжина заключної струни.

3

Groovy, 161 байт !!!

Так !! Не в останню !!

f={s->a=s.split(/\n/)
b=a.findIndexOf{it.contains('|_')}
d=b-a.findIndexOf{it.contains('_')}
print"$b,${a[b].count('_')+1},$d,${a.size()-b-2},${s.count('O')-1}"}

Безголівки:

f={String s ->
    split = s.split(/\n/)
    bottomOfChairBack = split.findIndexOf {it.contains('|_')}
    armHeight = bottomOfChairBack-split.findIndexOf {it.contains('_')}
    width = split[bottomOfChairBack].count('_')+1
    height = split.size() - bottomOfChairBack - 2

    wheelCount = s.count('O')-1
    return [bottomOfChairBack, width, armHeight, height, wheelCount]
}

Випробування невольфної програми:

assert f('''O
|
|
| _
| |
|_|_
  |
  |
  O''') == [5, 3, 2, 2, 1]

assert f('''O
|  _
|  |
|__|__
   |
   |
 __|__
 OOOOO''') == [3,5,2,3,5]

assert f('''O
|  _
|  |
|__|__
   |
   |
 __|__
 OOOOO''') == [3,5,2,3,5]

assert f('''O
|      _
|______|______
 ______|______
 OOOOOOOOOOOOO''') == [2,13,1,1,13]

2

Pyth, 57 54 53 50 байт

Напевно, можна пограти далі в гольф. -3 байти завдяки issacg за фокус з однорядним символом.

=kjb.z
=H/k+b\|
-/k\_=G-/k\O2
--/k\|H=Nt/k+bd
N
hG

Пояснення:

=kjb.z
=k              Assign k
     z          Input
  jb.           Join list by newlines

=H/k+b\|
=H              Assign H
  / +b\|        Count occurrences of "\n|"
   k            In input
                (Implicit: print backrest height)

-/k\_=G-/k\O2
     =G         Assign G
       -/k\O2   The number of wheels minus 1
-/k\_           Count the number of "_"
                (Implicit: print seat width)

--/k\|H=Nt/k+bd
       =N       Assign N
          /k+bd Count the number of lines starting with " "
         t      Subtract 1 (N is now the leg height)
  /k\|          Count the number of "|"
 -    H         Subtract the "|" for the backrest
-               Subtract leg height
                (Implicit: print armrest height)

N               Print leg height

hG              Print the number of wheels

1
Щоб створити односимвольний рядок, використовуйте \. Отже "_"=\_
isaacg

Ой, жодним чином я не збираюся це перемогти;)
J Atkin

2

Perl, 93 + 2 = 95 90 + 1 = 91 83 + 1 = 84 байти

Мабуть, вихід не потребує розділення комами

Викликати з perl -n chair.pl chairInput(1B штраф за прапор).

END{print$b,2+$u-$o,$a,$.-$b-2,$o-1}$u+=s/_//g;$o+=s/O//g;s/^\|//&&$b++&&/\|/&&$a++

Безголівки:

END{         # Put the END block first to save 1 ;
    print
        $b,   
    2+$u-$o,
    $a,
    $.-$b-2, # $. is the number of lines total
    $o-1
}
$u+=s/_//g; # count _s incrementally
$o+=s/O//g; # count Os incrementally
s/^\|// && $b++ # it's backrest if it starts with |
    && /\|/ && $a++ # and it's armrest if it has another one

Попередня версія:

Викликати с perl -0n chair.pl < chairInput

s/^\|//&&$b++?/\|/&&$a++:$h++for split"
",$_;$,=",";print$b,2+s/_//g-($o=s/O//g),$a,$h-3,$o-1

Пояснення:

s/^\|// && $back++   # the backrest is all lines starting with |
    ? /\|/ && $arm++ # the armrest is all of those lines with another |
    : $height++      # otherwise it counts for the seat height
    for split"
",$_;       # literal newline for 1 byte saved
$,=",";     # output separator
print
    $back,
    2+s/_//g-($o_count=s/O//g),  # you can find the seat size
                                 # from the different between the number
                                 # of Os and _s
    $arm,
    $height-3,
    $o_count-1

1

Пітон 3, 160 158 байт

Цей код працює, але лише за таких умов: 1) в armrest height > 0іншому випадку _лічильник ламається і 2) в seat width > 1іншому випадку підлокітник блокує ширину - одне сидіння, і _кількість розривається.

def f(s):
 a=s.split("\n");x=[];y=[];l=len(a)
 for i in range(l):
  m=a[i].count("_")
  if m:x+=i,;y+=m,
 return x[1],y[1]+1,x[1]-x[0],l-x[1]-2,s.count("O")-1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.