Tastiere Doorknob fiammeggianti!


21

Bene, il nome utente di Doorknob su GitHub, Reddit e altri siti è KeyboardFire . Questo mi dà un'idea...

L'obiettivo

Lavori presso KeyboardFire Inc., un'azienda che produce tastiere speciali. E, per "speciale", intendo che, ogni volta che premi un tasto, qualcosa nella tua casa si accende! Con la nuova serie KeyboardFire Doorknob, gli oggetti che si illuminano sul fuoco sono maniglie delle porte.

Tuttavia , a causa delle stupide normative governative, i tuoi utenti devono sapere quali pomelli della porta di casa illumineranno il fuoco.

Considera questa arte ASCII di una porzione di una tastiera 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

(I |rappresentano i confini tra i tasti.)

Possiamo considerare questo esatto disegno ASCII come un "grafico" di sorta, in cui ogni carattere nell'intervallo [a-z0-9] ha un indice x (orizzontale) e y (verticale), dove si (0,0)trova 1. Ad esempio, la lettera dha le coordinate (2,6)(i tubi e gli spazi sono inclusi nel calcolo delle coordinate).

Ora pensiamo alla casa di ogni utente. Ogni casa può essere disegnata dall'alto in basso come un'arte ASCII 20x4 (in questo mondo in cui è legale vendere tastiere distruttive, ogni casa ha le stesse dimensioni). Possiamo usare D's per contrassegnare le posizioni di ogni maniglia della porta della casa. Ecco un esempio:

D         D  D     D
    D               

              D  D  

La chiameremo "mappa della casa". (Sì, sono un sacco di maniglie delle porte!)

Premendo un tasto qualsiasi si accenderà la maniglia della porta più vicina. Ad esempio, se prendiamo le coordinate precedenti della lettera d, la maniglia della porta più vicina (per distanza di Manhattan) è alle coordinate (1,4). Questa è la maniglia della porta che si accenderà quando la lettera dviene colpita. Se dovessimo contrassegnare la maniglia della porta fiammeggiante con un F, il risultato sarebbe:

D         D  D     D
    F               

              D  D  

Le specifiche

Il tuo programma avrà due input:

  • Una stringa che corrisponde al modello [a-z0-9]+.
  • Una mappa di casa. Può essere una stringa, un elenco di stringhe o qualcosa di equivalente.

Devi passare attraverso ogni lettera della stringa e accendere la rispettiva maniglia della porta (cambia la sua lettera in una F). Se la maniglia della porta più vicina è già in fiamme, lasciala così com'è. Se è presente più di una maniglia che può essere accesa con questo metodo, puoi accendere quella che desideri.

Dopo che l'intera stringa è stata elaborata in questo modo, è necessario stampare la mappa della casa risultante.

Code-golf, vince il programma più breve. Scappatoie standard vietate come al solito.

Esempio

Corda:

helloworld123

Mappa della casa:

D    D       D     D
    D

              D  D  

Possibili risultati:

F    F       F     D
    F

              D  F

O:

F    D       F     D
    F

              D  F

O:

F    F       D     D
    F

              F  F

O:

F    D       D     D
    F

              F  F

EDIT: Uh ... c'è una ragione per cui ho una risposta, anche con una taglia +50? Se trovi le indicazioni complicate / vaghe, sarei felice se hai postato nei commenti o qualcosa del genere ... o sto facendo qualcosa di sbagliato ...

EDIT 2: Bounty scade tra meno di un giorno! Pubblica qualcos'altro! Per favore! PER FAVORE!!!! :(


1
Ci sono alcune cose che trovo confuse: 1) Perché is d's coords (2, 6) e not (2, 2)? 2) Perché l'esempio ha così tante risposte possibili? 3) Quando spieghi come le cose si accenderanno nel fuoco, perché stai addirittura parlando d? Perché non dire semplicemente che premendo aaccenderai una casa in fiamme? Lo dfa anche lui?
Quelklef,

@Quelklef È un po 'meglio? Grazie per il feedback!
kirbyfan64sos,

Se 'h' finisce esattamente tra due pomelli della porta e 'h' viene chiamato due volte, entrambi i pomelli dovrebbero essere in fiamme? o il programma può scegliere di sparare la stessa maniglia?
Grant Davis,

@GrantDavis Il programma può scegliere di sparare la stessa maniglia.
kirbyfan64sos,

Risposte:


3

JavaScript (ES6), 204 byte

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

Bene, ti risponderò. ;)

Spiegazione

(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

Test

<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
Finalmente ho avuto un'altra risposta !!! : D
kirbyfan64sos,

12

Rubino, 229 byte

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

Non molto buona, ma ho appena avuto per ottenere la prima risposta a.

Versione leggermente non golfata / commentata:

#!/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']]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.