Analise sua cadeira

11

Esse desafio é baseado no ajuste da cadeira do Downgoat .

Desafio

Você acabou de ajustar sua nova cadeira! Você se encaixa perfeitamente. No entanto, a roda está estridente e você sabe que o pessoal do reparo alterará o ajuste. O problema é que você não tem uma régua; portanto, terá que escrever um programa para medi-lo. O pessoal de reparo só pode esperar por tanto tempo. Portanto, seu código precisa ser o mais curto possível.
Exemplo de uma cadeira ajustável

Exemplos

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

5,3,2,2,1

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

3,5,2,3,5

O
|      _
|______|______
 ______|______
 OOOOOOOOOOOOO

2,13,1,1,13

Peças de cadeira

A cadeira possui vários componentes:

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

Descrições detalhadas da cadeira

As partes da cadeira são:


Encosto de cabeça: sempre haverá um encosto de cabeça acima do encosto

O
|

Encosto: O número de |é a Altura do Encosto

O
|
|

Assento: O número de _é a largura do assento , existe um |no meio para o apoio de braço.

__|__

Apoio de braço: O número de |é a altura do apoio de braço . Isso será inserido no meio do assento.

_
|
|

Perna: O número de |é a Altura da Perna

|
|

Rodas: as rodas estão centralizadas abaixo das pernas. Se forem mais de um, todos, exceto a roda central, terão _a linha acima deles.

_ _
OOO

Resultado

Dada uma cadeira, você produzirá várias variáveis.

A saída deve estar na seguinte ordem:

  1. Altura do encosto
  2. Largura do assento sempre ímpar
  3. Altura do apoio de braço Sempre menor que a altura do encosto
  4. Altura da perna
  5. Contagem de rodas Sempre menor ou igual à largura do assento e Sempre ímpar

A saída pode ter uma nova linha à direita ou estar em um formato de matriz / lista, se for uma função.

Entre os melhores

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

# Language Name, N bytes

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

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

Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:

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

Você também pode transformar o nome do idioma em um link que será exibido no snippet do placar de líderes:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes
wizzwizz4
fonte
O apoio de braço é medido?
J Atkins

Respostas:

3

Lua, 187 bytes

Acho que posso jogar mais, mas acho que isso é bom no momento. Além disso, se a saída precisar ser separada por vírgula, posso corrigir isso, mas isso ainda atende aos requisitos dos metinks.

Além disso, a entrada é alimentada em uma linha por vez. Após a entrada das rodas, pressione enter com uma linha vazia para finalizar a entrada.

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

(As posições são medidas de cima para baixo, então o 'O' superior é a posição 1 e as rodas são a maior posição.

  • A altura do encosto é a posição do banco menos um, compensando o 'O' na parte superior.
  • O tamanho do assento é o comprimento da corda na posição do assento menos um, compensando o encosto.
  • A altura do apoio de braço é a posição do assento menos a posição do apoio de braço.
  • Altura da perna é a altura da cadeira ( #c) menos a posição do assento menos 2, para compensar as rodas e o assento.
  • Contagem de rodas é o comprimento da sequência final.
Cyv
fonte
3

Groovy, 161 bytes !!!

Yay!! Não no último !!

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

Testes de programa não destruído:

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]
J Atkin
fonte
2

Pitão, 57 54 53 50 bytes

Provavelmente pode ser jogado mais. -3 bytes graças a issacg para o truque de cadeia de caracteres únicos.

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

Explicação:

=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
Element118
fonte
1
Para criar uma cadeia de um caractere, use \. Então "_"=\_
isaacg
Ouch, de jeito nenhum que eu vou bater este;)
J Atkin
2

Perl, 93 + 2 = 95 90 + 1 = 91 83 + 1 = 84 bytes

Aparentemente, a saída não precisa separar vírgulas

Invoque com perl -n chair.pl chairInput(1B de penalidade pela bandeira).

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

Versão anterior:

Invocar com 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

Explicação:

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
alexander-brett
fonte
1

Python 3, 160 158 bytes

Este código funciona mas apenas nas seguintes condições: 1) armrest height > 0caso contrário, a _contagem quebra e 2) seat width > 1caso contrário, o apoio de braço bloqueia o assento de largura um e a _contagem quebra.

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
Sherlock9
fonte