Claviers Flaming Doorknob!


21

Eh bien, il s'avère que le nom d' utilisateur de Doorknob sur GitHub, Reddit et d'autres sites est KeyboardFire . Ça me donne une idée...

La tâche

Vous travaillez chez KeyboardFire Inc., une entreprise qui fabrique des claviers spéciaux. Et, par "spécial", je veux dire que chaque fois que vous appuyez sur une touche, quelque chose dans votre maison s'allume! Avec la nouvelle série de poignées de clavier KeyboardFire, les objets qui s'allument sont des poignées de porte.

Cependant , en raison des réglementations gouvernementales stupides, vos utilisateurs doivent savoir quelles poignées de porte de leur maison s'allument.

Considérez cet art ASCII d'une partie d'un clavier 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

(Les |symboles représentent les limites entre les clés.)

Nous pouvons traiter ce dessin ASCII exact comme un "graphique" de toutes sortes, où chaque caractère de la plage [a-z0-9] a un index x (horizontal) et y (vertical), où (0,0)est 1. Par exemple, la lettre da les coordonnées (2,6)(les tuyaux et les espaces sont inclus dans le calcul des coordonnées).

Pensons maintenant à la maison de chaque utilisateur. Chaque maison peut être dessinée de haut en bas comme un art ASCII 20x4 (dans ce monde où il est légal de vendre des claviers destructeurs, chaque maison est de la même taille). Nous pouvons utiliser D's pour marquer la position de chaque poignée de porte dans la maison. Voici un exemple:

D         D  D     D
    D               

              D  D  

Nous appellerons cela la "carte de la maison". (Oui, c'est beaucoup de poignées de porte!)

Appuyez sur n'importe quelle touche pour allumer la poignée de porte la plus proche. Par exemple, si nous prenons les coordonnées précédentes de la lettre d, la poignée de porte la plus proche (par la distance de Manhattan) est aux coordonnées (1,4). C'est la poignée de porte qui s'allume en feu lorsque la lettre dest frappée. Si nous marquions la poignée de porte flamboyante avec un F, le résultat serait:

D         D  D     D
    F               

              D  D  

Les spécifications

Votre programme prendra deux entrées:

  • Une chaîne qui correspond au modèle [a-z0-9]+.
  • Une carte de la maison. Cela peut être une chaîne, une liste de chaînes ou quelque chose d'équivalent.

Vous devez parcourir chaque lettre de la chaîne et allumer la poignée de porte respective en feu (changer sa lettre en an F). Si la poignée de porte la plus proche est déjà en feu, laissez-la telle quelle. S'il y a plus d'une poignée de porte qui pourrait être allumée en feu en utilisant cette méthode, vous pouvez allumer celle que vous voulez.

Une fois la chaîne entière traitée de cette manière, vous devez imprimer la carte de maison résultante.

Code-golf, donc le programme le plus court gagne. Les failles standard interdites comme d'habitude.

Exemple

Chaîne:

helloworld123

Plan de la maison:

D    D       D     D
    D

              D  D  

Résultats possibles:

F    F       F     D
    F

              D  F

Ou:

F    D       F     D
    F

              D  F

Ou:

F    F       D     D
    F

              F  F

Ou:

F    D       D     D
    F

              F  F

EDIT: Euh ... y a-t-il une raison pour laquelle j'ai une réponse, même avec une prime de +50? Si vous trouvez les instructions compliquées / vagues, je serais heureux si vous avez posté dans les commentaires ou quelque chose ... ou si je fais quelque chose de mal ...

EDIT 2: Bounty expire dans moins d'un jour! Postez autre chose! S'il vous plaît! S'IL VOUS PLAÎT!!!! :(


1
Il y a quelques choses que je trouve déroutantes: 1) Pourquoi dles coordonnées de (2, 6) et non (2, 2)? 2) Pourquoi l'exemple a-t-il autant de réponses possibles? 3) Quand vous expliquez comment les choses vont s'allumer, pourquoi parlez-vous même d? Pourquoi ne pas dire tout de suite que le fait d'appuyer aallumera une maison en feu? Le dfait-il aussi?
Quelklef

@Quelklef Est-ce un peu mieux? Merci pour les commentaires!
kirbyfan64sos

Si «h» se retrouve exactement entre deux poignées de porte et que «h» est appelé deux fois, les deux poignées de porte devraient-elles être en feu? ou le programme peut-il choisir de déclencher la même poignée de porte?
Grant Davis

@GrantDavis Le programme peut choisir de déclencher la même poignée de porte.
kirbyfan64sos

Réponses:


3

JavaScript (ES6), 204 octets

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

Très bien, je vais y répondre. ;)

Explication

(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

Tester

<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
J'ai finalement eu une autre réponse !!! : D
kirbyfan64sos

12

Rubis, 229 octets

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

Pas très bien, mais je devais d'obtenir la première réponse.

Version légèrement non golfée / commentée:

#!/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']]
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.