Analiza tu silla

11

Este desafío se basa en Ajustar su silla de Downgoat .

Desafío

¡Acabas de ajustar tu nueva silla! Te queda perfectamente. Sin embargo, la rueda está chirriando y usted sabe que las personas de reparación cambiarán el ajuste. El problema es que no tienes una regla, así que tendrás que escribir un programa para medirlo por ti. El personal de reparación solo puede esperar tanto tiempo. Por lo tanto, su código debe ser lo más corto posible.
Ejemplo de una silla ajustable.

Ejemplos

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

5,3,2,2,1

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

3,5,2,3,5

O
|      _
|______|______
 ______|______
 OOOOOOOOOOOOO

2,13,1,1,13

Partes de la silla

La silla tiene varios componentes:

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

Descripciones detalladas de la silla

Las partes de la silla son:


Reposacabezas: siempre habrá un reposacabezas sobre el respaldo

O
|

Respaldo: el número |es la altura del respaldo

O
|
|

Asiento: el número _es el ancho del asiento , hay un |en el medio para el reposabrazos.

__|__

Reposabrazos: el número |es la altura del reposabrazos . Esto se insertará en el medio del asiento.

_
|
|

Pierna: el número |es la altura de la pierna

|
|

Ruedas: las ruedas están centradas debajo de las patas. Si son más de uno, todos menos la rueda central tendrán _en la línea sobre ellos.

_ _
OOO

Salida

Dada una silla, generará varias variables.

La salida debe estar en el siguiente orden:

  1. Altura del respaldo
  2. Ancho del asiento siempre impar
  3. Altura del reposabrazos Siempre menor que la altura del respaldo
  4. Altura de la pierna
  5. Recuento de ruedas Siempre menor o igual que el ancho del asiento y Siempre impar

La salida puede tener una nueva línea final o estar en forma de matriz / lista si es una función.

Tabla de clasificación

Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:

# Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

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

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

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

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes
wizzwizz4
fuente
¿Se mide el reposabrazos?
J Atkin

Respuestas:

3

Lua, 187 bytes

Creo que podría jugar un poco más, pero creo que esto es bueno en este momento. Además, si la salida necesita estar separada por comas, puedo arreglar eso, pero esto aún cumple con los requisitos.

Además, la entrada se alimenta en una línea a la vez. Después de ingresar las ruedas, presione Intro con una línea vacía para finalizar la 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())

Sin golf

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

(Las posiciones se miden de arriba a abajo, por lo que la 'O' superior es la posición 1 y las ruedas son la posición más grande.

  • La altura del respaldo es la posición del asiento menos uno, compensando la 'O' en la parte superior.
  • El tamaño del asiento es la longitud de la cuerda en la posición del asiento menos uno, compensando el respaldo.
  • La altura del reposabrazos es la posición del asiento menos la posición del reposabrazos.
  • La altura de las piernas es la altura de la silla ( #c) menos la posición del asiento menos 2, para compensar las ruedas y el asiento.
  • El recuento de ruedas es la longitud de la cadena final.
Cyv
fuente
3

Groovy, 161 bytes !!!

¡¡Hurra!! ¡No en el ú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}"}

Sin golf:

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

Pruebas de programa sin golf:

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
fuente
2

Pyth, 57 54 53 50 bytes

Probablemente se pueda jugar más al golf. -3 bytes gracias a issacg por el truco de la cadena de un solo carácter.

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

Explicación:

=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
fuente
1
Para hacer una cadena de un carácter, use \. So "_"=\_
isaacg
Ay, de ninguna manera voy a vencer esto;)
J Atkin
2

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

Aparentemente, la salida no necesita separar comas

Invocar con perl -n chair.pl chairInput(1B de penalización por la bandera).

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

Sin golf:

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

Versión previa:

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

Explicación:

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
fuente
1

Python 3, 160 158 bytes

Este código funciona pero solo en las siguientes condiciones: 1) de lo armrest height > 0contrario, el _recuento se rompe y 2) de lo seat width > 1contrario, el reposabrazos bloquea el ancho del asiento y el _recuento se rompe.

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
fuente