Палаючі клавіатури дверної ручки!


21

Ну, виходить, дверну ручку по імені користувача на GitHub, Reddit і інші сайти KeyboardFire . Це дає мені уявлення ...

Завдання

Ви працюєте в KeyboardFire Inc., компанії, яка виробляє спеціальні клавіатури. І, маючи на увазі, "спеціально", я маю на увазі те, що кожного разу, коли ви натискаєте клавішу, щось у вашому будинку загоряється! З новою серії KeyboardFire Doorknob об'єктами, що запалюються, є дверні ручки.

Однак , через дурні урядові постанови, ваші користувачі повинні знати, які дверні ручки у їхньому будинку загоряться.

Розглянемо це мистецтво ASCII частини клавіатури QWERTY:

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

(Значення |"представляють межі між ключами."

Ми можемо трактувати цей точний малюнок ASCII як "графік" сортів, де кожен символ у діапазоні [a-z0-9] має х (горизонтальний) та у (вертикальний) індекс, де (0,0)є 1. Наприклад, лист dмає координати (2,6)(труби та пробіли включаються до розрахунку координат).

Тепер давайте подумаємо про будинок кожного користувача. Кожен будинок може бути намальований видом зверху вниз як мистецтво ASCII розміром 20x4 (у цьому світі, де законно продавати руйнівні клавіатури, кожен будинок має однаковий розмір). Ми можемо використовувати Dпозначення позицій кожної дверної ручки в будинку. Ось приклад:

D         D  D     D
    D               

              D  D  

Ми назвемо це «будинковою картою». (Так, це багато дверних ручок!)

Натискання будь-якої клавіші запалить найближчу дверну ручку. Наприклад, якщо взяти попередні координати листа d, найближча дверна ручка (на відстані Манхеттена) знаходиться за координатами (1,4). Це дверна ручка, яка запалиться, коли грамота dпотрапила. Якби ми позначили полум’яну дверну ручку цифрою F, результат був би:

D         D  D     D
    F               

              D  D  

Технічні характеристики

Ваша програма займе два входи:

  • Рядок, що відповідає шаблону [a-z0-9]+.
  • Карта будинку. Це може бути рядок, список рядків або щось еквівалентне.

Вам потрібно пройти кожну букву рядка і запалити відповідну дверну ручку (змінити її літеру на an F). Якщо найближча дверна ручка вже загорілася, залиште її як є. Якщо є більше однієї дверної ручки, яку можна було б запалити за допомогою цього методу, ви можете запалити ту, яку бажаєте.

Після того, як цілий рядок буде оброблений таким чином, потрібно надрукувати отриману карту будинку.

Код-гольф, тому виграє найкоротша програма. Стандартні лазівки заборонені, як зазвичай.

Приклад

Рядок:

helloworld123

Карта будинку:

D    D       D     D
    D

              D  D  

Можливі результати:

F    F       F     D
    F

              D  F

Або:

F    D       F     D
    F

              D  F

Або:

F    F       D     D
    F

              F  F

Або:

F    D       D     D
    F

              F  F

EDIT: Ага ... чи є причина, що я маю одну відповідь, навіть із щедротою +50? Якщо ви вважаєте, що вказівки є складними / розпливчастими, я буду радий, якщо ви опублікували в коментарях чи щось таке ... або я роблю щось не так ...

EDIT 2: Баунті закінчується за день! Опублікуйте щось інше! Будь ласка! БУДЬ ЛАСКА !!!! :(


1
Є кілька речей, які мене бентежать: 1) Чому dкоординати (2, 6), а не (2, 2)? 2) Чому в прикладі є стільки можливих відповідей? 3) Коли ви пояснюєте, як загоряться речі у вогні, чому ви взагалі говорите d? Чому б просто не сказати, що натискання aзапалить будинок у вогні? Це теж dробиться?
Квеклеф

@Quelklef Це трохи краще? Дякуємо за відгук!
kirbyfan64sos

Якщо "h" закінчується рівно між двома ручками, а "h" викликається двічі, чи повинні обидві дверні ручки підпалити? чи програма може обрати ту саму ручку?
Грант Девіс

@GrantDavis Програма може обрати ту саму дверну ручку.
kirbyfan64sos

Відповіді:


3

JavaScript (ES6), 204 байти

(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``

Добре, я відповім на це. ;)

Пояснення

(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

Тест

<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
Нарешті я отримав ще одну відповідь !!! : D
kirbyfan64sos

12

Рубін, 229 байт

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

Не дуже добре, але мені просто довелося отримати першу відповідь.

Трохи невольф / коментований варіант:

#!/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']]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.