Analizza la tua sedia


11

Questa sfida si basa su Downgoat's Adjust your chair .

Sfida

Hai appena adattato la tua nuova sedia! Ti sta perfettamente. Tuttavia, la ruota è cigolante e sai che le persone che effettuano la riparazione cambieranno la regolazione. Il problema è che non hai un righello, quindi dovrai scrivere un programma per misurarlo per te. Gli addetti alle riparazioni possono solo aspettare così a lungo. Quindi il tuo codice deve essere il più breve possibile.
Esempio di sedia regolabile

Esempi

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

5,3,2,2,1

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

3,5,2,3,5

O
|      _
|______|______
 ______|______
 OOOOOOOOOOOOO

2,13,1,1,13

Parti della sedia

La sedia ha vari componenti:

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

Descrizioni dettagliate della sedia

Le parti della sedia sono:


Poggiatesta: ci sarà sempre un poggiatesta sopra lo schienale

O
|

Schienale: il numero di |è l' altezza dello schienale

O
|
|

Sedile: il numero di _è la larghezza del sedile , |al centro è presente un bracciolo.

__|__

Bracciolo: il numero di |è l' altezza del bracciolo . Questo verrà inserito al centro del sedile.

_
|
|

Gamba: il numero di |è l' altezza della gamba

|
|

Ruote: le ruote sono centrate sotto le gambe. Se sono più di uno, tutti tranne la ruota centrale avranno _nella linea sopra di loro.

_ _
OOO

Produzione

Data una sedia, verranno emesse varie variabili.

L'output dovrebbe essere nel seguente ordine:

  1. Altezza dello schienale
  2. Larghezza del sedile sempre dispari
  3. Altezza bracciolo Sempre inferiore all'altezza dello schienale
  4. Altezza delle gambe
  5. Conteggio delle ruote Sempre inferiore o uguale alla larghezza del sedile e sempre dispari

L'output può avere una nuova riga finale o essere in una matrice / elenco se è una funzione.

Classifica

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, usando il seguente modello Markdown:

# Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

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

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

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

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet della classifica:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

Il bracciolo è misurato?
J Atkin,

Risposte:


3

Lua, 187 byte

Penso che potrei essere in grado di giocarci ancora un po ', ma penso che al momento sia buono. Inoltre, se l'output deve essere separato da virgola, posso risolverlo, ma ciò soddisfa ancora i methink dei requisiti.

Inoltre, l'input viene immesso in una riga alla volta. Dopo aver inserito le ruote, premere Invio con una riga vuota per finalizzare l'immissione.

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

(Le posizioni sono misurate dall'alto verso il basso, quindi la 'O' superiore è la posizione 1 e le ruote sono la posizione più grande.

  • L'altezza dello schienale è la posizione del sedile meno una, compensando la "O" nella parte superiore.
  • La dimensione del sedile è la lunghezza della corda nella posizione del sedile meno una, compensando lo schienale.
  • L'altezza del bracciolo è la posizione del sedile meno la posizione del bracciolo.
  • L'altezza della gamba è l'altezza della sedia ( #c) meno la posizione del sedile meno 2, per compensare le ruote e il sedile.
  • Il conteggio delle ruote è la lunghezza della stringa finale.

3

Groovy, 161 byte !!!

Sìì!! Non in ultimo !!

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

Test di programma non golfato:

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 byte

Probabilmente può essere ulteriormente giocato a golf. -3 byte grazie a issacg per il trucco della stringa a carattere singolo.

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

Spiegazione:

=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
Per creare una stringa di un carattere, utilizzare \. Quindi "_"=\_
isaacg il

Ouch, non riuscirò mai a batterlo;)
J Atkin il

2

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

Apparentemente l'output non ha bisogno di separare le virgole

Richiama con perl -n chair.pl chairInput(penalità 1B per la bandiera).

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

Versione precedente:

Invocare 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

Spiegazione:

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 byte

Questo codice funziona ma solo alle seguenti condizioni: 1) armrest height > 0altrimenti il _conteggio si interrompe e 2) seat width > 1altrimenti il ​​bracciolo blocca la larghezza di un sedile e il _conteggio si interrompe.

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.