Flaming Kapı Tokmağı Klavye!


21

Eh, Doorknob'un GitHub, Reddit ve diğer sitelerdeki kullanıcı adının KeyboardFire olduğu ortaya çıktı . Bu bana bir fikir verir ...

Görev

Özel klavyeler üreten bir şirket olan KeyboardFire Inc. Ve "özel" derken, bir tuşa her basışınızda evinizdeki bir şeyin yandığı anlamına gelir! Yeni KeyboardFire Doorknob serisi ile, ateşe giren nesneler kapı kollarıdır.

Bununla birlikte , aptal hükümet düzenlemeleri nedeniyle, kullanıcılarınızın evlerinde hangi kapı kollarının ateş yakacağını bilmeleri gerekir.

Bu ASCII QWERTY klavyenin bir kısmının resmini düşünün:

1|2|3|4|5|6|7|8|9|0
 q|w|e|r|t|y|u|i|o|p
  a|s|d|f|g|h|j|k|l
   z|x|c|v|b|n|m

( |Anahtarlar arasındaki sınırları temsil eder.)

Bu aralık, her karakter bir tür "grafiği", tam olarak bu ASCII çizim tedavi edebilir [a-z0-9] bir x (yatay) ve y (dik) indeksine sahiptir, burada (0,0)ise 1. Örneğin, harf dkoordinatlara sahiptir (2,6)(borular ve boşluklar koordinat hesaplamasına dahil edilir).

Şimdi her kullanıcının evini düşünelim. Her ev 20x4 ASCII sanatı olarak yukarıdan aşağıya doğru çekilebilir (bu dünyada yıkıcı klavyeler satmanın yasal olduğu yerlerde, her ev aynı boyuttadır). DHer kapı kolunun evdeki pozisyonlarını işaretlemek için 'ler' i kullanabiliriz . İşte bir örnek:

D         D  D     D
    D               

              D  D  

Buna "ev haritası" diyeceğiz. (Evet, çok fazla kapı kolu var!)

Herhangi bir tuşa basmak, en yakın kapı düğmesini yakacak. Örneğin, mektubun önceki koordinatlarını alırsak d, en yakın kapı tokmağı (Manhattan mesafesine göre) koordinatlardadır (1,4). Bu, mektuba disabet ettiğinde yanacak olan kapı kolu . Yanan kapı kolunu bir ile işaretlemek Fisteseydik sonuç şöyle olurdu:

D         D  D     D
    F               

              D  D  

Özellikleri

Programınız iki girdi alacaktır:

  • Desene uyan bir dize [a-z0-9]+.
  • Bir ev haritası. Bu bir dize, bir dize listesi veya eşdeğeri olabilir.

İpin her harfinden geçip ilgili kapı kolunu yakmanız gerekir (mektubunu an olarak değiştirin F). En yakın kapı tokmağı zaten yanıyorsa, olduğu gibi bırakın. Bu yöntemle yanabilecek 1'den fazla kapı kolu varsa, hangisini isterseniz yakabilirsiniz.

Tüm dizge bu şekilde işlendikten sonra, sonuçtaki ev haritasını yazdırmanız gerekir.

Code-golf, yani en kısa program kazanır. Standart boşluklar her zamanki gibi yasaklandı.

Örnek

Dize:

helloworld123

Ev haritası:

D    D       D     D
    D

              D  D  

Olası sonuçlar:

F    F       F     D
    F

              D  F

Veya:

F    D       F     D
    F

              D  F

Veya:

F    F       D     D
    F

              F  F

Veya:

F    D       D     D
    F

              F  F

EDIT: Uh ... bir +50 lütufta olsa bile bir cevabım var mı? Yönergeleri karmaşık / belirsiz bulursanız, yorumlarınızı veya herhangi bir şeyi gönderirseniz sevinirim ... veya yanlış bir şey yapıyorum ...

2 EDIT: Ödül bir gün içinde sona eriyor! Başka bir şey gönder! Lütfen! LÜTFEN!!!! :(


1
dAkıl karıştırıcı bulduğum birkaç şey var: 1) Neden kodları (2, 6) değil (2, 2)? 2) Örnek neden bu kadar çok olası cevaba sahip? 3) Ateşin nasıl yanacağını açıkladığınızda neden konuşuyorsunuz d? Neden sadece düpedüz, basmanın abir evi ateşe vereceğini söylemiyorsunuz ? dBunu da mı yapıyor?
Quelklef

@Quelklef Bu biraz daha iyi mi? Geri dönüşünüz için teşekkür ederiz!
kirbyfan64sos

Eğer 'h' tam iki kapı kolu arasında bitiyorsa ve 'h' iki kez çağrılıyorsa, her iki kapı kolu da yanmalı mı? veya program aynı kapı tokmağını ateşlemeyi seçebilir mi?
Davis Davis

@GrantDavis Program aynı kapı tokmağını ateşlemeyi seçebilir.
kirbyfan64sos

Yanıtlar:


3

JavaScript (ES6), 204 bayt

(s,h)=>[...s].map(c=>(o="1234567890qwertyuiopasdfghjkl_zxcvbnm".search(c),y=o/10|0,x=o%10*2+y,n=a=Math.abs,h.map((k,i)=>k.match(/\s/)||(d=a(x-i%21)+a(y-i/21|0))>n||(n=d,p=i)),h[p]="F"),h=[...h])&&h.join``

Tamam, cevaplayacağım. ;)

açıklama

(s,h)=>
  [...s].map(c=>(                     // iterate through each character of the input

    // Get X and Y coordinates of the character input
    o="1234567890qwertyuiopasdfghjkl_zxcvbnm".search(c),
    y=o/10|0,
    x=o%10*2+y,

    // Find the nearest doorknob
    n=                                // n = Manhattan distance to nearest doorknob
      a=Math.abs,
    h.map((k,i)=>                     // iterate through each character of the house
      k.match(/\s/)||                 // do not check distance to whitespace characters
        (d=a(x-i%21)+a(y-i/21|0))>n|| // d = distance to the current doorknob
          (n=d,                       // set the nearest doorknob to this one
          p=i)                        // p = position of the doorknob
    ),
    h[p]="F"                          // update the doorknob to "F" in the house string
  ),h=[...h])&&h.join``               // return the house map as a string

Ölçek

<input type="text" id="input" value="helloworld123" /><br />
<textarea id="house" rows="4" cols="20">D    D       D     D
    D               
                    
              D  D  </textarea><br />
<button onclick='result.innerHTML=(

(s,h)=>[...s].map(c=>(o="1234567890qwertyuiopasdfghjkl_zxcvbnm".search(c),y=o/10|0,x=o%10*2+y,n=a=Math.abs,h.map((k,i)=>k.match(/\s/)||(d=a(x-i%21)+a(y-i/21|0))>n||(n=d,p=i)),h[p]="F"),h=[...h])&&h.join``

)(input.value,house.value)'>Go</button>
<pre id="result"></pre>


2
Sonunda başka bir cevap aldım !!! : D
kirbyfan64sos

12

Ruby, 229 bayt

->s,m{c=m.flat_map.with_index{|x,i|x.size.times.select{|j|x[j]==?D}.map{|y|[i,y]}}
s.chars{|h|x='1234567890qwertyuiop*asdfghjkl*zxcvbnm'.index h
x,y=(x%10)*2,x/10
a,b=c.min_by{|a,b|(y-a).abs+((y%2>0?x+1:x)-b).abs}
m[a][b]='F'}
m}

Çok iyi, ama sadece değil vardı ilk cevap almak için.

Biraz ungolfed / yorum versiyonu:

#!/usr/bin/ruby

f = -> s, m {
    # get knob coords
    c = m.flat_map.with_index {|x, i| x.size.times.select{|j| x[j] == ?D }.map{|y| [i, y] } }
    # for each char in the string
    s.chars {|h|
        # note the asterisks to correct for offsets
        x = '1234567890qwertyuiop*asdfghjkl*zxcvbnm'.index h
        # get un-"staggered" x and y coords
        x, y = (x % 10) * 2, x / 10
        # add one to x for every other row to fit keyboard
        x += 1 if y % 2 > 0
        # find closest knob by Manhattan distance
        a, b = c.min_by{|a, b| (y - a).abs + (x - b).abs }
        # LIGHT IT ON FIRE!
        m[a][b] = 'F'
    }
    # return new map
    m
}

puts f['helloworld123', ['D    D       D     D', '    D', '', '              D  D']]
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.