Analisis Kursi Anda

11

Tantangan ini didasarkan pada Downgoat's Adjust your chair .

Tantangan

Anda baru saja menyesuaikan kursi baru Anda! Ini sangat cocok untuk Anda. Namun, roda berderit dan Anda tahu orang yang memperbaiki akan mengubah penyesuaian. Masalahnya adalah, Anda tidak memiliki penggaris, jadi Anda harus menulis sebuah program untuk mengukurnya untuk Anda. Orang-orang perbaikan hanya bisa menunggu begitu lama. Jadi, kode Anda harus sesingkat mungkin.
Contoh kursi yang bisa disesuaikan

Contohnya

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

5,3,2,2,1

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

3,5,2,3,5

O
|      _
|______|______
 ______|______
 OOOOOOOOOOOOO

2,13,1,1,13

Bagian kursi

Kursi memiliki berbagai komponen:

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

Deskripsi Kursi Terperinci

Bagian-bagian kursi adalah:


Headrest: Akan selalu ada satu headrest di atas sandaran

O
|

Sandaran: Jumlahnya |adalah Tinggi Sandaran

O
|
|

Kursi: Jumlahnya _adalah Lebar Kursi , ada |di tengah untuk sandaran tangan.

__|__

Sandaran tangan: Jumlahnya |adalah Tinggi Sandaran Tangan . Ini akan dimasukkan di tengah kursi.

_
|
|

Kaki: Jumlahnya |adalah Tinggi Kaki

|
|

Roda: Roda dipusatkan di bawah kaki. Jika mereka lebih dari satu, semua kecuali roda tengah akan memiliki _garis di atas mereka.

_ _
OOO

Keluaran

Diberi kursi, Anda akan menghasilkan berbagai variabel.

Outputnya harus dalam urutan sebagai berikut:

  1. Tinggi sandaran
  2. Lebar Kursi selalu aneh
  3. Tinggi Sandaran Tangan Selalu kurang dari tinggi sandaran
  4. Tinggi kaki
  5. Hitungan roda Selalu kurang dari atau sama dengan lebar kursi dan Selalu aneh

Output mungkin memiliki baris baru, atau dalam bentuk array / daftar jika itu adalah fungsi.

Papan peringkat

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Misalnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar penalti penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir dalam tajuk:

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

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes
wizzwizz4
sumber
Apakah sandaran tangan diukur?
J Atkin

Jawaban:

3

Lua, 187 Bytes

Saya pikir saya mungkin bisa bermain golf lagi, tapi saya pikir ini bagus saat ini. Juga, jika output perlu dipisahkan dengan koma saya dapat memperbaikinya, tetapi ini masih memenuhi persyaratan metode.

Juga, input dimasukkan dalam satu baris sekaligus. Setelah roda dimasukkan, tekan enter dengan garis kosong untuk menyelesaikan input.

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

Tidak disatukan

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

(Posisi diukur dari atas ke bawah, sehingga 'O' atas adalah posisi 1, dan roda adalah posisi terbesar.

  • Tinggi sandaran adalah posisi kursi minus satu, mengimbangi 'O' di atas.
  • Ukuran tempat duduk adalah panjang tali ke posisi minus satu, mengkompensasi sandaran.
  • Ketinggian sandaran tangan adalah posisi dudukan minus posisi sandaran tangan.
  • Tinggi kaki adalah ketinggian kursi ( #c) minus posisi kursi minus 2, untuk mengimbangi roda dan kursi.
  • Hitungan roda adalah panjang dari string terakhir.
Cyv
sumber
3

Groovy, 161 byte !!!

Yay !! Bukan yang terakhir !!

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

Tidak Disatukan:

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

Tes program tanpa kulit:

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

Pyth, 57 54 53 50 byte

Mungkin bisa bermain golf lebih lanjut. -3 byte terima kasih kepada issacg untuk trik string karakter tunggal.

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

Penjelasan:

=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
Elemen118
sumber
1
Untuk membuat string satu karakter, gunakan \. Jadi "_"=\_
isaacg
Aduh, tidak mungkin aku bisa mengalahkan ini;)
J Atkin
2

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

Rupanya output tidak perlu memisahkan koma

Invoke with perl -n chair.pl chairInput(penalti 1B untuk bendera).

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

Tidak Disatukan:

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 sebelumnya:

Ajak dengan 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

Penjelasan:

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

Python 3, 160 158 byte

Kode ini berfungsi tetapi hanya pada kondisi berikut: 1) armrest height > 0jika tidak ada _penghitungan istirahat dan 2) seat width > 1jika tidak, sandaran tangan akan menghalangi lebar-satu kursi dan _penghitungan rusak.

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
sumber