ให้ฉันตัดผม!


18

นี่คือหัวของฉัน:

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

มันประกอบด้วยขนแปดเส้นอย่างแน่นอน ผมของฉันยาวเกินไป โปรดตัดความยาวแต่ละเส้นที่ฉันระบุ

อินพุต

แหล่งท่องเที่ยวหลักในส่วนนี้คือศีรษะของผมจริง นี่คือการแสดงกราฟิกสีตามรหัสพร้อมกับอนิเมชั่นสำหรับคนขี้เกียจ:

รหัสสี thingy มีชีวิตชีวา

และนี่เป็นข้อมูลจำเพาะเต็มรูปแบบสำหรับชุดของเส้นขน:

  • ขนของแต่ละบุคคลซึ่งเราจะเรียกเส้นจะถูกทำออกมาจาก/, \, |และ-อักขระ ASCII ที่รู้จักกันต่อจากนี้ไปเป็นอะตอม
  • ทั้งหัวของได้ยิน (ทุกเส้นรวม) จะเป็นcคอลัมน์โดยrแถวที่c≥ 1 และr≥ 2
  • แต่ละเส้นจะ ...
    • เริ่มที่แถวสุดท้ายของส่วนหัว (แถวr- 1)
    • มีความยาวlที่l≥ 2
  • อาจถูกแยกวิเคราะห์ด้วยวิธีการต่อไปนี้:
    1. เริ่มต้นที่ด้านล่างของสาระ นี่จะเป็น/, |หรือ\, ซึ่งเราจะเรียกรูต (มีการแยกวิเคราะห์เส้นจากซ้ายไปขวาจัดเรียงตามรูท)
    2. ค้นหาอะตอมที่ชี้ไปที่รูต
      • |อะตอมชี้ขึ้นและลง -จุดอะตอมซ้ายและขวา ( แต่ไม่สามารถชี้ไปที่รากตั้งแต่รากจะไม่สามารถอยู่ในแถวล่าง) /จุดอะตอมซ้ายขึ้นและลงขวาและ\อะตอมไม่ตรงข้าม
      • จะมีอะตอมหนึ่งตัวที่ชี้ไปยังอะตอมรูตเสมอ
    3. ค้นหาอะตอมที่ไม่ได้ใช้งาน (อันที่ยังไม่ได้เป็นส่วนหนึ่งของสาระการเรียนรู้) ที่ชี้ไปยังอะตอมนี้และไม่ต่ำกว่าอะตอมนี้ (ขนไม่สามารถงอกลงมาด้านล่างได้
      • หากมีศูนย์คุณถึงจุดสิ้นสุดของเส้น!
      • หากมีอย่างใดอย่างหนึ่งนี่คืออะตอมถัดไปของสาระ ทำซ้ำขั้นตอนที่ 3 ด้วยอะตอมนี้ (อะตอมนี้ถูกทำเครื่องหมายเป็น "ใช้แล้ว" เพื่อจุดประสงค์ของขั้นตอนที่ 3 เนื่องจากเป็นส่วนหนึ่งของกลุ่มสาระ)
      • จะไม่มีอะตอมที่ไม่ได้ใช้งานอยู่ที่นี่ทุกจุดในหัว

รูปแบบการป้อนข้อมูลจะเป็น:

  • หัวผม สามารถป้อนตามที่เป็น (อินพุตหลายบรรทัดด้วยการขึ้นบรรทัดใหม่ตามตัวอักษร) หรือด้วยตัวคั่นที่คุณเลือกแทนบรรทัดใหม่ โปรดทราบว่าหัวจะเป็นรูปสี่เหลี่ยมผืนผ้าเสมอ เช่นช่องว่างต่อท้ายจะถูกเพิ่มตามความจำเป็น (ผมเส้นตรงที่ด้านขวาเป็นเพียงการกำจัดช่องว่างต่อท้ายพิเศษเพื่อหลีกเลี่ยงความสับสน)
  • ตัวเลข≥ 1 ระบุจำนวนเส้นผมที่จะตัดผม จะอธิบายรายละเอียดในส่วนถัดไป

คุณอาจยอมรับอินพุตให้กับฟังก์ชั่นใช้ STDIN / STDOUT ฯลฯ (อะไรก็ได้ที่สมเหตุสมผล )

เอาท์พุต

เอาท์พุทของคุณจะเป็นหัวของผมด้วยการใช้ทรงผม ในการตัดผมให้ลดความยาวของเส้นผมแต่ละเส้นตามจำนวนที่ระบุ (ซึ่งจะเป็น 1 หรือมากกว่านั้น) โดยเริ่มจากจุดสิ้นสุดของเส้นผมที่เคลื่อนที่ไปยังราก แต่มักจะออกรากเหมือนเดิม!

นี่คือตัวอย่างง่ายๆ พูดอินพุตสำหรับหัวคือ

\ 
 /
| 
| 

ด้วยอินพุตที่สองของ2คุณจะตัดอะตอมสองอันจากเกลียวคลื่นและได้ผลลัพธ์

|
|

และด้วยอินพุตของ42เอาต์พุตก็จะเป็นเช่นนั้น

|

โปรดทราบว่าช่องว่างก่อนและหลังศีรษะไม่เกี่ยวข้องอย่างสมบูรณ์; คุณสามารถตัดบรรทัดใหม่พิเศษหรือเพิ่มช่องว่างภายในเพิ่มเติม มันไม่สำคัญตราบใดที่ศีรษะยังคงอยู่เหมือนเดิม (คุณอาจทำทุกอย่างที่คุณต้องการด้วยการเว้นวรรคตามด้วย)

กรณีทดสอบ

สำหรับกรณีทดสอบทั้งหมดจะมีการใช้ตัวอย่างที่แสดงในตอนต้นของโพสต์นี้

ความยาวตัดผม = 1:

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

ความยาว 3:

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

ความยาว 7:

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

ความยาว 1337:

| \  /|  //  \ |

เกณฑ์การให้คะแนน

นี่คือดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ!


มี '-' อะตอมในแถวล่างหรือไม่ จุดที่ 2 ดูเหมือนจะบอกว่าใช่จุดที่ 1 ดูเหมือนจะบอกว่าไม่
edc65

@ edc65 ไม่ไม่มี (แก้ไขเพื่อชี้แจง)
Doorknob

ฉันคิดว่ามีข้อผิดพลาดในกรณีทดสอบ ในแถวที่สี่จากด้านล่าง-ในเส้นที่สามจากจุดซ้ายที่|ในเส้นที่สี่จากทางซ้าย
feersum

@feersum ถูกต้อง เส้นทางที่ถูกกำหนดโดยสิ่งที่ชี้ไป-ไม่ใช่สิ่งที่จะชี้ไปที่ ยกตัวอย่างเช่น|ไม่ได้ชี้ไป/ในสาระแรก /แต่มันเป็นสิ่งที่ชี้ไปตาม (ใช่ฉันรู้ว่ามันสับสนฉันต้องทำซ้ำ GIF หลายครั้งเพราะฉันสับสนแม้กระทั่งตัวเอง!) วิธีที่ง่ายกว่าที่จะเข้าใจสิ่งนี้อาจเป็นเพียงการดูที่ด้านบนของสาระที่สอง
Doorknob

ฉันรู้ว่ามันถูกกำหนดโดยชิ้นส่วนภายหลังชี้ไปที่ชิ้นก่อนหน้า เหตุผลของฉันคือ-ควรจะเข้าร่วมกับสาระที่สี่ไม่ใช่ที่สาม
feersum

คำตอบ:


12

JavaScript (E6) 195 212 222 232

การใช้ฟังก์ชันเรียกซ้ำ R เพื่อค้นหาเส้นทางของแต่ละเส้นและทำเครื่องหมายตำแหน่งที่เริ่มต้นจาก 1 สำหรับส่วนที่ไกลที่สุดจากราก จากนั้นเป็นเรื่องง่ายในรอบที่สองเพื่อแทนที่ตำแหน่งที่ต่ำกว่าด้วยช่องว่าง

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.