Analysez votre chaise

11

Ce défi est basé sur Ajustez votre chaise de Downgoat .

Défi

Vous venez de régler votre nouvelle chaise! Cela vous va parfaitement. Cependant, la roue grince et vous savez que les réparateurs changeront le réglage. Le problème est que vous n'avez pas de règle, vous devrez donc écrire un programme pour le mesurer pour vous. Les réparateurs ne peuvent attendre que si longtemps. Votre code doit donc être aussi court que possible.
Exemple de chaise réglable

Exemples

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

5,3,2,2,1

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

3,5,2,3,5

O
|      _
|______|______
 ______|______
 OOOOOOOOOOOOO

2,13,1,1,13

Pièces de chaise

La chaise a différents composants:

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

Descriptions détaillées de la chaise

Les parties de la chaise sont:


Appui-tête: Il y aura toujours un appui-tête au-dessus du dossier

O
|

Dossier: Le nombre de |est la hauteur du dossier

O
|
|

Siège: Le nombre de _est la largeur du siège , il y a un |au milieu pour l'accoudoir.

__|__

Accoudoir: Le nombre de |est la hauteur de l' accoudoir . Celui-ci sera inséré au milieu du siège.

_
|
|

Jambe: Le nombre de |est la hauteur de la jambe

|
|

Roues: les roues sont centrées sous les jambes. S'ils sont plus d'un, tous sauf la roue centrale seront _alignés au-dessus d'eux.

_ _
OOO

Production

Étant donné une chaise, vous sortirez diverses variables.

La sortie doit être dans l'ordre suivant:

  1. Hauteur dossier
  2. Largeur du siège toujours étrange
  3. Hauteur de l'accoudoir Toujours inférieure à la hauteur du dossier
  4. Hauteur de jambe
  5. Nombre de roues Toujours inférieur ou égal à la largeur du siège et toujours impair

La sortie peut avoir une nouvelle ligne de fin ou être sous forme de tableau / liste s'il s'agit d'une fonction.

Classement

Pour vous assurer que votre réponse s'affiche, veuillez commencer votre réponse avec un titre, en utilisant le modèle de démarque suivant:

# Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:

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

Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:

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

Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes
wizzwizz4
la source
L'accoudoir est-il mesuré?
J Atkin

Réponses:

3

Lua, 187 octets

Je pense que je pourrais peut-être jouer au golf un peu plus, mais je pense que c'est bien pour le moment. En outre, si la sortie doit être séparée par des virgules, je peux résoudre ce problème, mais cela répond toujours aux exigences.

De plus, l'entrée est alimentée sur une ligne à la fois. Une fois les roues entrées, appuyez sur Entrée avec une ligne vide pour finaliser la saisie.

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

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

(Les positions sont mesurées de haut en bas, donc le `` O '' supérieur est la position 1, et les roues sont la position la plus grande.

  • La hauteur du dossier est la position du siège moins un, compensant le «O» en haut.
  • La taille du siège est la longueur de la corde à la position du siège moins un, compensant le dossier.
  • La hauteur de l'accoudoir est la position du siège moins la position de l'accoudoir.
  • La hauteur des jambes est la hauteur du fauteuil ( #c) moins la position du siège moins 2, pour compenser les roues et le siège.
  • Le nombre de roues est la longueur de la chaîne finale.
Cyv
la source
3

Groovy, 161 octets !!!

Yay!! Pas en dernier !!

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

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

Tests de programme non 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
la source
2

Pyth, 57 54 53 50 octets

Peut probablement être joué au golf plus loin. -3 octets grâce à issacg pour l'astuce de chaîne de caractères unique.

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

Explication:

=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
la source
1
Pour créer une chaîne à un caractère, utilisez \. Donc "_"=\_
isaacg
Aïe, je ne vais pas battre ça;)
J Atkin
2

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

Apparemment, la sortie n'a pas besoin de séparation par des virgules

Invoquer avec perl -n chair.pl chairInput(pénalité 1B pour le drapeau).

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

Non 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

La version précédente:

Invoquer avec 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

Explication:

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
la source
1

Python 3, 160 158 octets

Ce code fonctionne mais uniquement dans les conditions suivantes: 1) armrest height > 0sinon le _comptage se casse et 2) seat width > 1sinon l'accoudoir bloque le siège de largeur 1 et le _comptage se casse.

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
la source