Przeanalizuj swoje krzesło

11

To wyzwanie opiera się na Downgoat's Adjust your chair .

Wyzwanie

Właśnie dostosowałeś swoje nowe krzesło! Idealnie do ciebie pasuje. Jednak koło jest skrzypiące i wiesz, że osoby naprawiające zmienią regulację. Problem polega na tym, że nie masz linijki, więc będziesz musiał napisać program do jej zmierzenia. Pracownicy naprawy mogą tylko czekać tak długo. Więc twój kod musi być jak najkrótszy.
Przykład regulowanego krzesła

Przykłady

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

5,3,2,2,1

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

3,5,2,3,5

O
|      _
|______|______
 ______|______
 OOOOOOOOOOOOO

2,13,1,1,13

Części do krzeseł

Krzesło ma różne elementy:

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

Szczegółowe opisy krzeseł

Częściami krzesła są:


Zagłówek: Zawsze będzie jeden zagłówek powyżej oparcia

O
|

Oparcie: Liczba |to wysokość oparcia

O
|
|

Siedzisko: Liczba _to szerokość siedziska , |na środku jest podłokietnik.

__|__

Podłokietnik: liczba |to Wysokość Podłokietnika . Zostanie on wstawiony na środku siedzenia.

_
|
|

Noga: liczba |to wysokość nogi

|
|

Koła: koła są wyśrodkowane poniżej nóg. Jeśli jest ich więcej niż jeden, wszystkie koła oprócz środkowego będą miały _linię nad nimi.

_ _
OOO

Wynik

Biorąc pod uwagę krzesło, będziesz generować różne zmienne.

Dane wyjściowe powinny być w następującej kolejności:

  1. Wysokość oparcia
  2. Szerokość siedziska zawsze nieparzysta
  3. Wysokość podłokietnika Zawsze mniejsza niż wysokość oparcia
  4. Wysokość nóg
  5. Liczba kół Zawsze mniejsza lub równa szerokości siedziska i Zawsze nieparzysta

Dane wyjściowe mogą mieć końcowy znak nowej linii lub być w formie tablicy / listy, jeśli jest to funkcja.

Tabela liderów

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes
wizzwizz4
źródło
Czy podłokietnik jest mierzony?
J Atkin

Odpowiedzi:

3

Lua, 187 bajtów

Myślę, że mógłbym jeszcze trochę zagrać w golfa, ale myślę, że w tej chwili jest to dobre. Ponadto, jeśli dane wyjściowe muszą być oddzielone przecinkami, mogę to naprawić, ale nadal spełnia to wymagania metinks.

Ponadto dane wejściowe są podawane w jednym wierszu na raz. Po wprowadzeniu kół naciśnij klawisz Enter z pustą linią, aby zakończyć wprowadzanie.

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

Nie golfił

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

(Pozycje są mierzone od góry do dołu, więc górna „O” jest pozycją 1, a koła są największą pozycją.

  • Wysokość oparcia to pozycja siedziska minus jeden, kompensująca „O” u góry.
  • Rozmiar siedziska to długość sznurka w pozycji siedzenia minus jeden, co kompensuje oparcie.
  • Wysokość podłokietnika to pozycja siedzenia minus pozycja podłokietnika.
  • Wysokość nóg to wysokość fotela ( #c) minus pozycja siedzenia minus 2, aby zrekompensować koła i siedzisko.
  • Liczba kół to długość ostatniego ciągu.
Cyv
źródło
3

Groovy, 161 bajtów !!!

Tak !! Nie ostatni !!

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

Nie golfowany:

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

Testy programu bez golfa:

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
źródło
2

Pyth, 57 54 53 50 bajtów

Prawdopodobnie można dalej grać w golfa. -3 bajty dzięki issacgowi za lewy ciąg znaków.

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

Wyjaśnienie:

=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
źródło
1
Aby utworzyć ciąg jednoznakowy, użyj \. Więc "_"=\_
isaacg
Ojej, nie ma mowy, żebym to pokonał;)
J Atkin
2

Perl, 93 + 2 = 95 90 + 1 = 91 83 + 1 = 84 bajtów

Najwyraźniej dane wyjściowe nie wymagają oddzielania przecinków

Wywołaj z perl -n chair.pl chairInput(kara 1B za flagę).

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

Nie golfowany:

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

Poprzednia wersja:

Wywołaj z 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

Wyjaśnienie:

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
źródło
1

Python 3, 160 158 bajtów

Ten kod działa, ale tylko pod następującymi warunkami: 1) w armrest height > 0przeciwnym razie _licznik się psuje i 2) w seat width > 1przeciwnym razie podłokietnik blokuje siedzisko o szerokości 1 i _licznik się psuje.

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
źródło