散髪してください!


18

これは私の頭です:

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

正確に8本の毛で構成されています。髪が長すぎます。個々のストランドを指定した長さに切断してください。

入力

このセクションの主な魅力は、実際の髪の毛です。怠laな人のためのアニメーションとともにグラフィカルな色分けされた表現があります:

色分けされたもの アニメ化

そして、髪のセットが何であるかの完全な仕様は次のとおりです。

  • 私たちが呼ぶ、個々の毛、ストランドは、から作られる/\|、および-今後として知られ、ASCII文字原子
  • ヘッドの全体(結合されたすべてのストランド)はcrcごとの列になります(≥1およびr≥2)。
  • 各ストランドは...
    • ヘッドの最後の行(行r-1)から開始します。
    • 長さll≥2である。
  • ストランドは、次の方法で解析できます。
    1. ストランドの下部から始めます。これは次のようになります/|または\私たちが呼ぶ原子、根を。(ストランドは左から右に解析され、ルート順に並べられます。)
    2. ルートを指す原子を見つけます。
      • |上下原子ポイント。-原子ポイントは左右(だけ根が下の行にすることができるので、ルートを指すことはできません)。/原子ポイントはダウン左及びアップ右、及び\原子は、反対を行います。
      • ルートアトムを指すアトムは常に1つだけです。
    3. この原子の方を指し、この原子の下にもない未使用の原子(まだ鎖の一部ではない原子)を見つけます(髪は下向きに成長できませんが、横向きでも構いません)。
      • ゼロがある場合、ストランドの終わりに到達しています!
      • ある場合、これはストランドの次の原子です。このアトムで手順3を繰り返します。(この原子は、ストランドの一部であるため、ステップ3の目的で「使用済み」としてマークされます。)
      • 頭のどの点にも、複数の未使用の原子が存在することはありません。

入力フォーマットは、次のようになります。

  • 髪の毛。そのまま入力することも(リテラル改行を使用した複数行入力)、または改行の代わりに選択した区切り文字を使用することもできます。頭は常に長方形であることに注意してください。つまり、必要に応じて末尾の空白が追加されます(右側の奇妙な直線の髪は、混乱を避けるために余分な末尾の空白を削除するためのものです)。
  • カットする毛の量を指定する1以上の数。これについては、次のセクションで詳しく説明します。

関数への入力を受け入れたり、STDIN / STDOUTなどを使用したりすることができます(合理的なものなら何でも)。

出力

出力は、ヘアカットが適用された髪の毛になります。ヘアカットを行うには、指定された量(常に1以上)で、髪の各ストランドの長さを、髪の根元に向かって移動する端点から単純に短くします。ただし、ルートは常にそのままにしてください!

以下に簡単な例を示します。頭の入力は

\ 
 /
| 
| 

の2番目の入力では2、ストランドから2つの原子を切り取り、次の結果を取得します。

|
|

入力がの42場合、出力は次のようになります。

|

頭の前後の空白は完全に無関係であることに注意してください。余分な改行を削除するか、パディングを追加できます。頭が無傷である限り、それは問題ではありません。(末尾の空白を使って何でもできます。)

テストケース

すべてのテストケースについて、この投稿の冒頭に示した例を使用します。

ヘアカットの長さ= 1:

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

長さ3:

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

7の長さ:

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

1337の長さ:

| \  /|  //  \ |

得点

これはなので、バイト単位の最短コードが勝ちます!


一番下の行に原子「-」がありますか?ポイント2はイエス、ポイント1はノーと言っているようです。
edc65 14年

@ edc65いいえ、ありません。(明確にするために編集)
ドアノブ

テストケースに間違いがあると思います。下から4行目、上の-第三の鎖中で左の点から|、左から4番目の鎖中
feersum

@feersum正しい。パスは、によって決定されるとどのようなポイント-ではなく、何それは指します。たとえば|/は、最初のストランドのを指していませんが、によって指し示されてい/ます。(はい、わかりにくいです。自分自身でさえ混乱させたため、GIFを何度もやり直さなければなりませんでした!)これを理解する簡単な方法は、2番目のストランドの上部を見るだけかもしれません。
ドアノブ

私はそれが以前のものを指している後の部分によって決定されることを知っています。私の主張は、3番目ではなく4番目のストランドに-結合する必要があるということです。
feersum 14年

回答:


12

JavaScriptの(E6)195 212 222 232

再帰関数Rを使用して各ストランドのパスを見つけ、1から始まる位置をルートから最も遠い位置にマークします。その後、2番目のパスで、下のマークされた位置を空白で置き換えるのは簡単です。

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

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

出力

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

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


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






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








| \  /|  //  \ |    
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.