PPCG Senior Streich


19

Wir werden bald zu einer vollständigen Site wechseln und es bleibt nur noch eine Sache vor dem Abschluss zu tun: einen älteren Streich spielen! Ich denke, wir sollten eine Variation des klassischen Gags "Fülle einen Flur mit Tassen Wasser" machen.

Herausforderung

Ihr Programm liest den Text ein und gibt ihn in umgedrehten Tassen Wasser aus. Eine umgedrehte Tasse mit Wasser sieht folgendermaßen aus: /~\
Diese Tassen können nur in Leerzeichen in der Eingabe platziert werden und dürfen nur so platziert werden, dass sich alle drei Zeichen der Tasse direkt über einem Nicht-Leerzeichen befinden (andernfalls würde das Wasser verschütten) aus!). Tassen können nicht auf andere Tassen gestapelt werden. Tassen müssen in jede verfügbare Öffnung gestellt werden, und es wird angenommen, dass jeder Eingang von einem unendlichen Leerzeichenfeld umgeben ist.

Sie können davon ausgehen, dass die Eingabe in ein Rechteck mit Leerzeichen aufgefüllt ist.

Wir müssen den Streich schnell und unbemerkt durchziehen, damit die wenigsten Bytes in jeder Sprache gewinnen.

Testfälle

Eingang:

     ____________________________________________
    /   ___    /   ___    /   ______/   ________/
   /   /__/   /   /__/   /   /     /   /_______
  /   _______/   _______/   /     /   //__    /
 /   /      /   /      /   /_____/   /___/   /
/___/      /___/      /_________/___________/

Ausgabe:

     /~\/~\/~\/~\/~\/~\/~\/~\/~\/~\/~\/~\/~\/~\
     ____________________________________________
    /   ___    /   ___    /   ______/   ________/
   /   /__//~\/   /__//~\/   /     /   /_______
  /   _______/   _______/   //~\  /   //__    /
 //~\/      //~\/      //~\/_____//~\/___//~\/
/___/      /___/      /_________/___________/

Eingang:

 L
LOL  ROFL:ROFL:LOL:ROFL:ROFL
 L\\        ____I____
    ========    |  |[\
            \___O==___)
            ___I_I__/

Ausgabe:

 L   /~\/~\/~\/~\/~\/~\/~\
LOL  ROFL:ROFL:LOL:ROFL:ROFL
 L\\/~\/~\  ____I____
    ========/~\ |  |[\
            \___O==___)
            ___I_I__/

1
Dies könnte die Zeit sein, einige dieser 2D-Pattern-Matching-Sprachen
wiederzubeleben

Antworten:


10

Retina , 41 Bytes

Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.

(?<=(.)*)(?=.*¶(?>(?<-1>.)*)\S{3})   
/~\

Beachten Sie, dass die erste Zeile drei nachgestellte Leerzeichen enthält.

Erfordert, dass die Eingabe in ein Rechteck aufgefüllt wird.

Probieren Sie es online!

Erläuterung

Dies ist ein ziemlich normaler vertikaler Abgleich:

(?<=(.)*)

Dies zählt die Zeichen, die der Übereinstimmung vorangehen, indem so viele Zeichen in einer Gruppe erfasst werden 1.

(?=.*¶(?>(?<-1>.)*)\S{3})

Dadurch wird überprüft, ob in der nächsten Zeile an derselben Position drei Zeichen ohne Leerzeichen vorhanden sind. Dies geschieht, indem aus der Gruppe herausgesprungen wird, 1bis sie leer ist, (?<-1>.)*und das Zurückverfolgen mit der Atomgruppe verhindert wird (?>...).

Schließlich passen wir die tatsächlichen Räume an. Diese werden einfach durch die Literalzeichenfolge ersetzt /~\. Zweckmäßigerweise werden Übereinstimmungen von links nach rechts gefunden und können sich nicht überlappen.


3

JavaScript (ES6), 163 Byte

a=>(z=a.split`
`,z.unshift(z[0].replace(/./g,' ')),z).map((b,i)=>b.replace(/   /g, (c,j)=>(!z[i+1]||!z[i+1][j+2]||/ /.test(z[i+1].slice(j,j+3))?c:'/~\\'))).join`
`

Schnell zusammen gehackte Lösung, kann auf jeden Fall heruntergolfen werden. Fügt eine leere Zeile darüber hinzu, findet dreifache Leerzeichen und ersetzt sie durch eine Tasse, wenn die nächste Zeile keine Leerzeichen enthält. Legt die zulässige Annahme fest, dass die Eingabe rechteckig ist. Alle Rückstände in der Eingabe müssen maskiert werden (wie bei JS zu erwarten).


Ich denke das liefert die falsche Ausgabe für a test.
Neil

1

JavaScript (ES6), 109 Byte

s=>s.replace(/.*\n/,m=>(t=m).replace(/./g,' ')+m).replace(eval(`/   (?=[^]{${t.length-3}}[^ ]{3})/g`),"/~\\")

Nimmt an, dass die erste Zeile nicht nur eine rechteckige Eingabe erfordert, sondern auch mit einer neuen Zeile endet, selbst wenn es sich um die einzige Eingabezeile handelt. Verwendet einen dynamisch generierten Lookahead, um sicherzustellen, dass drei Leerzeichen "über" drei Nicht-Leerzeichen gefunden werden, um nicht durch Löcher verwirrt zu werden.

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.