Flaming Doorknob Keyboards!


21

Wie sich herausstellt, ist der Benutzername von Doorknob auf GitHub, Reddit und anderen Websites KeyboardFire . Das gibt mir eine Idee ...

Die Aufgabe

Sie arbeiten bei KeyboardFire Inc., einem Unternehmen, das Spezialtastaturen herstellt. Und mit "speziell" meine ich, dass jedes Mal, wenn Sie eine Taste drücken, etwas in Ihrem Haus in Flammen steht! Bei der neuen KeyboardFire Doorknob-Serie sind die Objekte, die in Flammen stehen, Türklinken.

Aufgrund dummer staatlicher Vorschriften müssen Ihre Benutzer jedoch wissen, welche Türklinken in ihrem Haus brennen.

Betrachten Sie diese ASCII-Grafik eines Teils einer QWERTZ-Tastatur:

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

(Die |'s stellen die Grenzen zwischen den Schlüsseln dar.)

Wir können diese genaue ASCII Zeichnung als „Grafik“ , der Art zu behandeln, wobei jedes Zeichen in dem Bereich [a-z0-9] ein x hat (horizontal) und y (vertikal) Index, wobei (0,0)ist 1. Zum Beispiel hat der Buchstabe ddie Koordinaten (2,6)(Rohre und Zwischenräume werden in die Koordinatenberechnung einbezogen).

Lassen Sie uns nun über das Haus eines jeden Benutzers nachdenken. Jedes Haus kann als 20x4 ASCII-Grafik von oben nach unten gezeichnet werden (in dieser Welt, in der es legal ist, zerstörerische Tastaturen zu verkaufen, hat jedes Haus die gleiche Größe). Mit D's können wir die Positionen der einzelnen Türklinken im Haus markieren. Hier ist ein Beispiel:

D         D  D     D
    D               

              D  D  

Wir nennen dies die "Hauskarte". (Ja, das sind viele Türklinken!)

Durch Drücken einer beliebigen Taste wird der nächste Türknauf in Brand gesetzt. Nehmen wir zum Beispiel die vorherigen Koordinaten des Buchstabens d, befindet sich der nächste Türknauf (in Manhattan-Entfernung) an den Koordinaten(1,4) . Dies ist die Türklinke, die in Flammen aufleuchtet, wenn der Buchstabe dgetroffen wird. Wenn wir den brennenden Türknauf mit einem markieren Fwürden, wäre das Ergebnis:

D         D  D     D
    F               

              D  D  

Die Spezifikationen

Ihr Programm nimmt zwei Eingaben entgegen:

  • Eine Zeichenfolge, die dem Muster entspricht [a-z0-9]+ .
  • Eine Hauskarte. Dies kann eine Zeichenfolge, eine Liste von Zeichenfolgen oder etwas Äquivalentes sein.

Sie müssen jeden Buchstaben der Schnur durchgehen und den entsprechenden Türknauf in Brand setzen (ändern Sie den Buchstaben in einen F ). Wenn der nächste Türknauf bereits in Brand ist, lassen Sie ihn unverändert. Wenn mit dieser Methode mehr als eine Türklinke in Brand gesetzt werden kann, können Sie jede beliebige Türklinke anzünden.

Nachdem die gesamte Zeichenfolge auf diese Weise verarbeitet wurde, müssen Sie die resultierende Hauskarte drucken.

Code-Golf, so gewinnt das kürzeste Programm. Standard-Schlupflöcher wie gewohnt verboten.

Beispiel

Zeichenfolge:

helloworld123

Hauskarte:

D    D       D     D
    D

              D  D  

Mögliche Ergebnisse:

F    F       F     D
    F

              D  F

Oder:

F    D       F     D
    F

              D  F

Oder:

F    F       D     D
    F

              F  F

Oder:

F    D       D     D
    F

              F  F

EDIT: Äh ... gibt es einen Grund, warum ich eine Antwort habe, auch mit einer Prämie von +50? Wenn Sie die Anweisungen kompliziert / vage finden, wäre ich froh, wenn Sie in den Kommentaren oder etwas gepostet ... oder ich mache etwas falsch ...

EDIT 2: Bounty läuft in weniger als einem Tag ab! Posten Sie etwas anderes! Bitte! BITTE!!!! :(


1
Ich finde einige Dinge verwirrend: 1) Warum sind ddie Koordinaten (2, 6) und nicht (2, 2)? 2) Warum hat das Beispiel so viele mögliche Antworten? 3) Wenn du erklärst, wie die Dinge in Flammen aufgehen, warum redest du überhaupt d? Warum nicht direkt sagen, dass durch Drücken von aein Haus in Brand gerät? Tut des auch?
Quelklef,

@Quelklef Ist das ein bisschen besser? Danke für die Rückmeldung!
kirbyfan64sos

Wenn 'h' genau zwischen zwei Türklinken endet und 'h' zweimal aufgerufen wird, sollten beide Türklinken brennen? Oder kann das Programm den gleichen Türknauf abfeuern?
Grant Davis

@GrantDavis Das Programm kann denselben Türknauf abfeuern.
kirbyfan64sos

Antworten:


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

Gut, ich werde es beantworten. ;)

Erläuterung

(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

Prüfung

<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
Ich habe endlich eine andere Antwort bekommen !!! : D
kirbyfan64sos

12

Ruby, 229 Bytes

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

Nicht sehr gut, aber ich gerade hatte in die erste Antwort zu bekommen.

Leicht ungolfed / kommentierte Version:

#!/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']]
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.