Bana bir saç kesimi ver!


18

Bu benim kafam:

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

Tam olarak sekiz kıldan oluşur. Saçım çok uzun. Lütfen her bir ipliği belirttiğim bir uzunlukta kesin.

Giriş

Bu bölümdeki ana cazibe saçın gerçek başıdır. İşte tembel için bir animasyonla birlikte grafik, renk kodlu bir gösterim :

renk kodlu şey animasyonlu şey

Ve işte bir kıl kümesinin ne olduğu için tam bir özellik :

  • Biz arayacak saçların, iplikçikleri , üzerinden yapılacaktır /, \, |ve -bundan sonra bilinen, ASCII karakter atomu .
  • Tüm duyma kafası (birleşik tüm teller) ccolumns 1 ve ≥ 2 olan rsatırlar halinde sütunlar olacaktır .cr
  • Her iplikçik ...
    • başın son satırından başlayın (satır r- 1).
    • uzunluğu lwhere l2 olduğunda.
  • Tellerin aşağıdaki yöntemle ayrıştırılması mümkündür:
    1. Tellerin altından başlayın. Bu , kök olarak adlandıracağımız bir /, |veya \atom olacaktır . (Tellerin soldan sağa ayrıştırılması, kök tarafından sıralanması.)
    2. Kökü gösteren atomu bulun.
      • Bir |atom yukarı ve aşağı işaret eder. Bir -atom sola ve sağa işaret eder (ancak alt kökte sadece kökler olabileceğinden asla kökü gösteremez). Bir /atom sola ve sağa işaret eder ve bir \atom tersini yapar.
      • Her zaman kök atomu işaret eden tam olarak bir atom olacaktır.
    3. Kullanılmayanları bulunBu atomu işaret eden ve ayrıca bu atomun altında olmayan (saçlar aşağı doğru büyüyemez, ancak yanlar iyidir) atom (henüz herhangi bir ipliğin parçası olmayan bir atom) .
      • Sıfır varsa, ipin sonuna ulaştınız!
      • Bir tane varsa, bu ipliğin bir sonraki atomudur. Bu atom ile 3. adımı tekrarlayın. (Bu atom artık bir ipin parçası olduğu için 3. adımın amaçları için "kullanılmış" olarak işaretlenmiştir.)
      • Kafanın herhangi bir noktasında burada asla birden fazla kullanılmamış atom olmayacak .

Giriş biçimi olacaktır:

  • Bir saç başı. Olduğu gibi girilebilir (değişmez satırsonu içeren çok satırlı giriş) veya satırsonu yerine seçtiğiniz bir sınırlayıcı ile girilebilir. Kafanın her zaman bir dikdörtgen olacağını unutmayın; yani sondaki boşluk gerektiği şekilde eklenecektir (sağdaki tuhaf düz çizgi saçları sadece karışıklığı önlemek için ekstra sondaki boşlukları ortadan kaldırmaktır).
  • Ne kadar saç kesileceğini belirten ≥ 1 sayısı. Bu, bir sonraki bölümde ayrıntılı olarak açıklanacaktır.

Bir işleve girişi kabul edebilir, STDIN / STDOUT vb. Kullanabilirsiniz ( makul herhangi bir şey) ).

Çıktı

Çıktınız uygulanan saç kesimi ile saçınızın başı olacaktır. Bir saç kesimi vermek için, saçın köküne doğru hareket eden saçın uç noktasından başlayarak, her saç teli uzunluğunu belirtilen miktar kadar azaltın (her zaman 1 veya daha büyük olacaktır). Ancak, her zaman kök bozulmamış bırakın!

İşte basit bir örnek. Kafa için girdinin

\ 
 /
| 
| 

İkinci bir girişle 2, iplikten iki atom kesip bir sonucu elde edersiniz.

|
|

Ve bir girişi ile 42, çıktı sadece

|

Baştan önce ve sonra boşlukların tamamen alakasız olduğunu unutmayın; fazladan satırları kesebilir veya daha fazla dolgu ekleyebilirsiniz. Kafa sağlam kaldığı sürece önemli değil. (Sondaki boşlukla da istediğinizi yapabilirsiniz.)

Test Durumları

Tüm test durumları için, bu yazının en başında sunulan örnek kullanılacaktır.

Saç kesimi uzunluğu = 1:

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

3 uzunluğu:

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

7 uzunluğu:

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

1337 uzunluğu:

| \  /|  //  \ |

puanlama

Bu , bu yüzden bayt içindeki en kısa kod kazanacak!


Alt satırda '-' atomları var mı? 2. nokta evet diyor, 1. nokta hayır diyor.
edc65

@ edc65 Hayır, yok. (
Açıklığa

Test durumunda bir hata olduğunu düşünüyorum. Alttan dördüncü sırada -, soldan üçüncü iplikçi soldan |dördüncü iplikçikte
feersum

@feersum Doğru. Yol ile belirlenir ne noktaları- değil, neyi o işaret . Örneğin, |işaret etmez /ilk iplikçik, ancak tarafından işaret /. (Evet, kafa karıştırıcı olduğunu biliyorum; GIF'i birkaç kez tekrarlamak zorunda kaldım çünkü kendimi bile karıştırdım!) Bunu anlamanın daha kolay bir yolu sadece ikinci ipin tepesine bakmak olabilir.
Kapı tokmağı

Biliyorum, daha sonraki parçalara işaret eden daha sonraki parçalar tarafından belirlendi. Benim iddiam, dördüncüye değil dördüncü- diziye birleştirilmesi gerektiğidir .
feersum

Yanıtlar:


12

JavaScript (E6) 19521222232

Her bir ipin yolunu bulmak için özyinelemeli bir işlev R kullanarak ve kökten en uzak olan için 1'den başlayan konumları işaretleyin. Daha sonra, ikinci geçişte, alt işaretli konumu boşluklarla değiştirmek kolaydır.

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 konsolunda test

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

Çıktı

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

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


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






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








| \  /|  //  \ |    
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.