Beri aku potong rambut!

18

Ini kepalaku:

\         /-- -|
 /   -\  |  |  |
\      \ \  \  |
 --\    | \  | |
    / |--| / / |
 /|-  //--| /  |
| |  ||   //\  |
| \  /|  //  \ |

Ini terdiri dari delapan rambut. Rambutku terlalu panjang. Harap potong setiap untai individu hingga panjang yang saya tentukan.

Memasukkan

Daya tarik utama di bagian ini adalah kepala rambut yang sebenarnya. Berikut adalah representasi grafis, kode warna, bersama dengan animasi , untuk yang malas:

kode warna thingy animasi thingy

Dan di sini adalah spesifikasi lengkap untuk apa set rambut:

  • Rambut individu, yang akan kita sebut helai , akan terbuat dari /, \, |, dan -karakter ASCII, selanjutnya dikenal sebagai atom .
  • Seluruh kepala pendengaran (semua helai digabungkan) akan menjadi ckolom dengan rbaris, di mana c≥ 1 dan r≥ 2.
  • Setiap helai akan ...
    • mulai dari baris terakhir dari kepala (baris r- 1).
    • memiliki panjang di lmana l≥ 2.
  • Helai dapat diuraikan dengan metode berikut:
    1. Mulai dari bagian bawah untaian. Ini akan menjadi /, |atau \atom, yang akan kita sebut akar . (Helai diurai dari kiri ke kanan, dipesan oleh root.)
    2. Temukan atom yang mengarah ke akar.
      • Sebuah |atom menunjuk ke atas dan ke bawah. Sebuah -atom menunjuk ke kiri dan ke kanan (tetapi tidak pernah bisa menunjuk ke akar karena hanya akar yang bisa berada di baris paling bawah). Sebuah /atom menunjuk ke kiri dan ke kanan, dan sebuah \atom melakukan yang sebaliknya.
      • Akan selalu ada tepat satu atom yang mengarah ke atom akar.
    3. Temukan atom yang tidak digunakan (yang belum menjadi bagian dari untaian) yang mengarah ke atom ini dan juga tidak di bawah atom ini (rambut tidak bisa tumbuh ke bawah, tetapi ke samping tidak apa-apa).
      • Jika ada nol, Anda telah mencapai ujung untaian!
      • Jika ada, ini adalah atom untai berikutnya. Ulangi langkah 3 dengan atom ini. (Atom ini sekarang ditandai sebagai "digunakan" untuk keperluan langkah 3, karena merupakan bagian dari untaian.)
      • Tidak akan pernah ada banyak atom yang tidak digunakan di sini pada titik mana pun di kepala.

The format masukan akan menjadi:

  • Kepala rambut. Dapat berupa input apa adanya (input multiline dengan baris baru literal), atau dengan pembatas pilihan Anda menggantikan baris baru. Perhatikan bahwa kepala akan selalu berbentuk persegi panjang; yaitu trailing whitespace akan ditambahkan seperlunya (rambut garis lurus yang aneh di sebelah kanan hanya untuk menghilangkan whitespace trailing tambahan untuk menghindari kebingungan).
  • Angka ≥ 1 menentukan berapa banyak rambut untuk dipotong. Ini akan dijelaskan secara rinci di bagian selanjutnya.

Anda dapat menerima input ke suatu fungsi, menggunakan STDIN / STDOUT, dll. (Apa pun yang masuk akal ).

Keluaran

Output Anda akan menjadi kepala rambut dengan potongan rambut diterapkan. Untuk memberikan potongan rambut, cukup kurangi panjang setiap helai rambut dengan jumlah yang ditentukan (yang akan selalu 1 atau lebih besar), mulai dari titik akhir rambut bergerak ke arah akar. Namun, selalu biarkan root tetap utuh!

Ini contoh sederhana. Katakan input untuk kepala adalah

\ 
 /
| 
| 

Dengan input kedua 2, Anda akan memotong dua atom dari untai dan mendapatkan hasil

|
|

Dan dengan input 42, output hanya akan menjadi

|

Perhatikan bahwa spasi putih sebelum dan sesudah kepala sama sekali tidak relevan; Anda dapat memotong baris baru atau Anda dapat menambahkan lebih banyak lapisan. Tidak masalah, asalkan kepalanya tetap utuh. (Anda dapat melakukan apa pun yang Anda inginkan dengan mengikuti spasi juga.)

Uji Kasus

Untuk semua kasus uji, contoh yang disajikan pada awal posting ini akan digunakan.

Panjang potong rambut = 1:

          /-   |
 /    \  |     |
\      \ \  \  |
 --\    | \  | |
    / |--  / / |
  |-  //--| /  |
| |  ||   //   |
| \  /|  //  \ |

Panjang 3:

         |      
         \     |
 --\    | \    |
    / |--  / / |
  |-  //  | /  |
  |  ||   //   |
| \  /|  //  \ |

Panjang 7:

  |-  /   |     
  |  |    /    |
| \  /|  //  \ |

Panjang 1337:

| \  /|  //  \ |

Mencetak gol

Ini adalah , jadi kode terpendek dalam byte akan menang!

Gagang pintu
sumber
Apakah ada atom '-' di baris paling bawah? Poin 2 sepertinya mengatakan ya, poin 1 sepertinya mengatakan tidak.
edc65
@ edc65 Tidak, tidak ada. (Diedit untuk memperjelas)
Gagang Pintu
Saya pikir ada kesalahan dalam test case. Di baris keempat dari bawah, -untai ketiga dari kiri di titik |keempat dari kiri
feersum
@feersum Benar. Jalur ditentukan oleh apa poin yang -, tidak apa itu menunjuk ke . Misalnya, |tidak menunjuk ke /dalam untai pertama, tetapi menunjuk ke oleh /. (Ya, saya tahu ini membingungkan; saya harus mengulang GIF beberapa kali karena saya bingung sendiri!) Cara yang lebih mudah untuk memahami ini mungkin hanya dengan melihat bagian atas untaian kedua.
Gagang Pintu
Saya tahu itu ditentukan oleh bagian selanjutnya yang menunjuk ke yang sebelumnya. Argumen saya adalah bahwa -harus bergabung ke untai keempat , bukan yang ketiga.
feersum

Jawaban:

12

JavaScript (E6) 195 212 222 232

Menggunakan fungsi rekursif R untuk menemukan jalur setiap untai dan menandai posisi mulai dari 1 untuk yang paling jauh dari root. Maka mudah, dalam pass kedua, untuk mengganti posisi yang ditandai lebih rendah dengan kosong.

F=(h,t,
   n=[...h],c=h.search('\n'),
   R=p=>[1,-1,c+2,c+1,c].some((d,i)=>n[p-d]=='--\\|/'[i]?n[p-=d]=1:0)&&R(p)+(R[p]=l++)
  )=>
  n.map((v,p)=>R[p]<t?' ':h[p],n.map((a,p)=>!h[p+c]&a>' '&&R(p,l=0))).join('')

Tes di konsol FireFox / FireBug

head = "\\         /-- -|\n /   -\\  |  |  |\n\\      \\ \\  \\  |\n --\\    | \\  | |\n    / |--| / / |\n /|-  //--| /  |\n| |  ||   //\\  |\n| \\  /|  //  \\ |";
console.log(F(head,0))
console.log(F(head,1))
console.log(F(head,3))
console.log(F(head,7))
console.log(F(head, 1337))

Keluaran

\         /-- -|
 /   -\  |  |  |
\      \ \  \  |
 --\    | \  | |
    / |--| / / |
 /|-  //--| /  |
| |  ||   //\  |
| \  /|  //  \ |

          /-   |
 /    \  |     |
\      \ \  \  |
 --\    | \  | |
    / |--  / / |
  |-  //--| /  |
| |  ||   //   |
| \  /|  //  \ |


         |      
         \     |
 --\    | \    |
    / |--  / / |
  |-  //  | /  |
  |  ||   //   |
| \  /|  //  \ |






  |-  /   |     
  |  |    /    |
| \  /|  //  \ |








| \  /|  //  \ |    
edc65
sumber