Проанализируйте свой стул


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. Количество колес Всегда меньше или равно ширине сиденья и Всегда нечетно

Вывод может иметь завершающий символ новой строки или быть в форме массива / списка, если это функция.

Leaderboard

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

# 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 байт

Я думаю, что я мог бы играть в гольф еще немного, но я думаю, что это хорошо в данный момент. Кроме того, если выходные данные должны быть разделены запятыми, я могу это исправить, но это все еще соответствует требованиям метинкса.

Кроме того, ввод подается по одной строке за раз. После ввода колес нажмите клавишу ввода с пустой строкой, чтобы завершить ввод.

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

Ungolfed

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, а колеса - самая большая позиция.

  • Высота спинки - это положение сиденья минус один, компенсирующее букву «О» сверху.
  • Размер сиденья - это длина струны в положении сиденья минус один, компенсирующая спинку.
  • Высота подлокотника - это положение сиденья минус положение подлокотника.
  • Высота ноги - это высота кресла ( #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}"}

Ungolfed:

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
Чтобы создать односимвольную строку, используйте \. Итак "_"=\_
Исаак

Ой, ни за что я не буду бить это;)
Дж Аткин

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++

Ungolfed:

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

Python 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.