Schwerkraftsimulator


33

Aussage

Sie erhalten ein Standbild einer Reihe von Kugeln, die in ein 2D-Raster fallen. Dieses Gitter ist von unveränderlichen und unzerbrechlichen Wänden umgeben, sodass die gesamte Aktion in ihnen enthalten ist. Ihre Aufgabe ist es, den Zustand des Szenarios zu bestimmen, nachdem die Schwerkraft alles getan hat, was sie bewirkt.

Elemente innerhalb des Rasters

  • - Boden, ändert nicht die Richtung der fallenden Bälle.
  • \ Rechter Schieber, ändert den Weg der Kugel um eine (1) Position nach rechts.
  • / Linker Schieber, ändert den Weg des Balls um eine (1) Position nach links.
  • o Ein Ball.

Regeln

  • Kugeln fallen.
  • Fußböden und Rutschen fallen nicht .
  • Wenn der Ball auf eine Rutsche trifft, die ihn durch eine Wand ( \#oder #/) oder durch einen Boden führen würde, fungiert die Rutsche als Boden.
  • Wenn ein Ball einen anderen Ball trifft, wird der zu einem Ball, aber seine Kraft erhöht sich auf die Summe beider Bälle.
  • Neue Bälle (verbunden) verhalten sich weiterhin wie gewohnt.
  • Wenn sich ein Ball nicht mehr bewegen kann, wird er durch seine Kraft ersetzt.
  • Die Kraft eines Balls wird immer höchstens 9 betragen.

Eingang

Das Raster wird in einer Zeichenfolgenvariablen mit dem Namen angegeben, der in der Sprache Ihrer Wahl am kürzesten ist. Standardmäßig werden wir aals Eingabe verwenden. Ein Beispiel einer Eingabe, genau wie erhalten:

##########\n# \      #\n#o       #\n#  - -\o #\n#/-    \ #\n#  \oo-/\#\n#-/ \   /#\n#   \ \  #\n#       /#\n##########

Für zufällige Gitter verwenden Sie https://repl.it/B1j3/2 . Verwende stattdessen meine generierte Seite (keine Werbung, kein Mist, nur die Eingabe und die Ausgabe)

Hinweis Zeilenumbrüche sind \n. Das Drucken der Eingabe auf dem Bildschirm (für die Abfrage nicht erforderlich) würde Folgendes anzeigen. Obwohl ich vier Rätsel nebeneinander gestellt habe, um Platz zu sparen.

##########  ##########  ##########  ##########
# \      #  # o    -/#  #       o#  #-o /    #
#o       #  #    \   #  # o     -#  #-- \ /\ #
#  - -\o #  #-  \    #  #    - \o#  # - -- o-#
#/-    \ #  #        #  #o /\    #  #/ \     #
#  \oo-/\#  #o  -o-  #  # /    -o#  #/ /o oo/#
#-/ \   /#  #   -/-  #  # -  o  -#  #o/      #
#   \ \  #  #    \\  #  #   \o  /#  #o-o    o#
#       /#  # \o\  /\#  #     \o #  # -\o o /#
##########  ##########  ##########  ##########

Ausgabe

Das gleiche Raster, gedruckt auf dem Bildschirm mit dem Endergebnis der Ballkraft. Eine gültige Antwort wäre eines (1) der folgenden Rätsel. Jedes entspricht der Eingabe an derselben Position. Wenn die Eingabe unterschiedlich ist, sollten Sie die Ausgabe anpassen. Beschränken Sie sich nicht auf diese vier!

##########  ##########  ##########  ##########
# \      #  #      -/#  #       1#  #-1 /    #
#        #  #    \   #  #       -#  #-- \ /\ #
#1 - -\  #  #-  \    #  #    - \ #  # - --  -#
#/-    \1#  #        #  #  /\    #  #/ \     #
#  \  -/\#  #   -1-  #  # /    -2#  #/ /    /#
#-/ \   /#  #   -/-  #  # -     -#  # /      #
#   \ \  #  #    \\  #  #   \   /#  # -      #
#    2  /#  #1\2\  /\#  #2   2\1 #  #2-\3 23/#
##########  ##########  ##########  ##########

Ergebnis

Sprachen treten gegen sich selbst an, also zögern Sie nicht, Nongolf-Sprachen zu verwenden. Um eine Lösung zu validieren, muss ich sie irgendwo testen können, um zu sehen, ob sie funktioniert!

Score ist die Anzahl der Bytes. Im Falle eines Unentschieden gewinnt die erste Antwort, die die Punktzahl erreicht.

Warnungen

  • Wenn Sie sich nicht sicher sind, wie ein Ball reagieren soll, fragen Sie mich und ich werde klarstellen, dass ich so klar wie möglich war, aber ich bin mir sicher, dass es Fälle gibt, die verwirrend sind.
  • Folien werden nur dann geritten, wenn Sie sie verlassen können . Stellen Sie sich das wie eine echte Folie vor. Es gibt einen Mann an der Spitze, der Sie nicht durch den Ball lässt, es sei denn, er tritt durch die andere Seite aus.

Beispiele für Ballbewegungen erläutern

######                       ######
#-o- #    BALL WOULD GO RD   #- - #
# \  #                       # \o #
######                       ######

######                       ######
#-o- #     BALL WOULD STAY   #-o- #
# \\ #                       # \\ #
######                       ######

######                       ######
#  -o#     BALL WOULD STAY   #  -o#
#   \#                       #   \#
######                       ######

######                       ######
#  o #     BALL WOULD STAY   #  o #
#  \/#                       #  \/#
######                       ######

######                       ######
#-o- #    BALL WOULD GO LD   #- - #
# /\ #                       #o/\ #
######                       ######

AKTUALISIERUNG

Wie kann ich testen, ob meine Antwort gültig ist?

Ich habe auf einer meiner Websites eine einfache Seite eingerichtet, auf der Sie ein zufälliges Rätsel und die Antwort finden. Nehmen Sie die Eingabe und vergleichen Sie sie mit der Ausgabe. Meine Lösung, ohne sich zu sehr um das Golfen zu kümmern, ist Python (Generator und Seite auch Python).389b 355b

Bestenliste


1
Ich werde an Marbelous erinnert .
Arcturus

10
Bonuspunkte, wenn jemand auf Marbelous antwortet.
Mego


klingt wie ein ascii-art - Flipper - Spiel möglicherweise
Khaled.K

@ JuanCortés, warum benutzt du nicht den ausgefallenen Bestenlisten-Code, damit du die Rangliste nicht selbst aktualisieren musst?
Usandfriends

Antworten:


6

JavaScript (ES6), 157 196

Bearbeite Zeichen für Zeichen anstatt Zeile für Zeile, viel besseres Ergebnis

g=>(s=~g.search`
`,g=[...g]).map((c,i)=>c<' '?0:g[[0,1,-1].map(d=>!d|'\\ /'[d+1]==g[d+=i]&&+g[d+=s]?g[v+=+g[d],d+v-v]=' ':0,v=c>'a'?1:+c),i]=v?v:c)&&g.join``

Hinweis: Behandelt keine Ballwerte> 9. Aber es könnte mit 18 Bytes kosten. Siehe folgenden Basiscode.

TEST-Snippet (besser ganze Seite)

F=g=>(s=~g.search`
`,g=[...g]).map((c,i)=>c<' '?0:g[[0,1,-1].map(d=>!d|'\\ /'[d+1]==g[d+=i]&&+g[d+=s]?g[v+=+g[d],d+v-v]=' ':0,v=c=='o'?1:+c),i]=v?v:c)&&g.join``

// Basic code, starting point before golfing
B=g=>{
  s = ~g.search('\n');
  (g=[...g]).map((c,i)=>{
    v = c == 'o' ? 1 : +c
    if (c>=' ' // skip newlines
        && !isNaN(v)) // digit or space
    {
      if (w=+g[i+s]) v += w, g[i+s]=' '
      if (g[i-1]=='\\' && (w=+g[i+s-1])) v += w, g[i+s-1]=' '
      if (g[i+1]=='/' && (w=+g[i+s+1])) v += w, g[i+s+1]=' '
      if (v) g[i] = v
    }
  })      
  // return g.join``
  // To handle values > 9 ...
  return g.map(v=>+v?v%10:v).join``
}  

function test() {
  O.textContent = F(I.value)
}

test()
textarea,pre { width: 15em; height: 15em; display: block; margin: 0; }
iframe { height: 25em; width: 15em}
td { vertical-align: top }
<table>
  <tr>
    <th>Test cases</th>
    <th>Input</th>
    <td></td>
    <th>Output</th>
  </tr><tr>
    <td>
    Copy/paste test cases from here <br>(courtesy of OP)
    <button onclick="T.src='http://bohem.io/wadus/index.php'">reload</button><br>
    <iframe id=T src="http://bohem.io/wadus/index.php"></iframe>
    </td>
    <td><textarea id=I>##########
#  o  o o#
# o\o o  #
#oo o/   #
#       o#
#     /o #
#\o   o  #
# o /-   #
#   o  - #
##########</textarea></td>
    <td><button onclick='test()'>Test</button></td>
    <td><pre id=O></pre></td>
  </tr>
</table>


Nett! Ich habe viel zu lernen in
Sachen

solltest du nicht werte> 9 mit abbilden v>9?9:v?
Titus

@Titus Ich könnte, aber tatsächlich könnte ich tun, was ich will, da ein Wert> 9 nicht erwartet wird, siehe den Kommentar von OP, der meine Frage beantwortet.
edc65

5

Javascript (ES6), 453 426 409 306 290 286 Bytes

Die erste und naheliegendste Lösung, die mir in den Sinn kam, ist eine, die sich um die Folien kümmert und diese dann zusammenführt oder ersetzt.

a=>{a=a.split`
`.map(b=>[...b.replace(/o/g,'1')]);for(r=1;r<a.length-1;r++){d=a[r];for(c=1;c<d.length-1;c++){e=a[r+1];f=e[c]=='\\'?c+1:e[c]=='/'?c-1:!isNaN(+e[c])?c:null;(''+d[c]).match(/[0-9]/g)&&f!=null&&!isNaN(+e[f])?(e[f]=+e[f]+ +d[c],d[c]=' '):0}}return a.map(b=>b.join``).join`
`}

Ungolfed:

func = state => {
    state = state.split `
`.map(line => [...line.replace(/o/g, '1')]);

    for (r = 1; r < state.length - 1; r++) {
        thisState = state[r];
        for (c = 1; c < thisState.length - 1; c++) {
            nextState = state[r + 1];
            nc = nextState[c] == '\\' ? c + 1 : nextState[c] == '/' ? c - 1 : !isNaN(+nextState[c]) ? c : null;

            ('' + thisState[c]).match(/[0-9]/g) && nc != null && !isNaN(+nextState[nc]) ? (
                nextState[nc] = +nextState[nc] + +thisState[c],
                thisState[c] = ' '
            ) : 0;
        }
    }

    return state.map(line => line.join ``).join `
`;
}

Testen Sie wie:

func(`##########
# -- o - #
# \\\\\\ -  #
#-       #
# o  o   #
#o \\\\ /-\\#
#      \\ #
#/-  //  #
#   /- o #
##########`)

Vielen Dank an: @ edc65


Ich werde meine Python veröffentlichen, wenn ich sicher bin, dass ich nicht mehr Golf spielen kann, aber bisher ist es der Python-Code, der die Antwort generiert. Wie kann ich irgendwo Ihren Golfcode testen, um Sie auf der Bestenliste zu platzieren? (Jsfiddle, Jsbin, Ideone, was auch immer)
Juan Cortés

Sie haben es auf 355 geschafft, Ihr Umzug!
Juan Cortés

@ JuanCortés Fertig!
Usandfriends

b.replace(/o/g,'1').split`` kann um [...b.replace(/o/g,1)]
edc65

@ edc65 Ich glaube, ich habe es behoben. Grundsätzlich wird die Leistung durch Modifizieren von 10 immer unter 10 gehalten.
usandfriends

4

Java, zu viele 1102 987 Bytes

Weil Java.

\ o / Es ist unter 1000!

class G{class T{char s;int p=0;T(char c){s=c;}}T A=new T(' ');T[][]o;boolean i(){for(int i=1;i<o.length;i++)for(int j=1;j<o[i].length;j++)if(o[i][j].p>0){if(m(i,j,i+1,j)||o[i+1][j].s=='/'&&m(i,j,i+1,j-1)||o[i+1][j].s=='\\'&&m(i,j,i+1,j+1))return 1>0;int w=o[i][j].p;o[i][j]=new T(Integer.toString(w).charAt(0)){{p=w;}};}return 1<0;}boolean m(int a,int b,int c,int d){if(o[c][d]==A||o[c][d].p>0){o[a][b].p+=o[c][d].p;o[c][d]=o[a][b];o[a][b]=A;return 1>0;}return 1<0;}String s(){String s="";for(T[]r:o){for(T t:r)s+=t.s;s+="\n";}return s;}void f(String s){String[]r=s.split("\\\\n");o=new T[r.length][r[0].length()];for(int i=0;i<o.length;i++)for(int j=0;j<o[i].length;j++)switch(r[i].charAt(j)){case'-':o[i][j]=new T('-');break;case'\\':o[i][j]=new T('\\');break;case'/':o[i][j]=new T('/');break;case'o':o[i][j]=new T('o'){{p=1;}};break;case'#':o[i][j]=new T('#');break;default:o[i][j]=A;}}public static void main(String[]a){G g=new G();g.f(a[0]);while(g.i());System.out.println(g.s());}}

Eine Seite Ziel war in der Lage , jede Iteration des Brettes zu drucken: nur in der Mitte entfernen ;in while(g.i()) ; System.out.print(g.s());(Obwohl diese deaktivieren funktioniert den letzten Druck , die die 0-> Leistungsumwandlung hat). Leider funktioniert in dieser Version die Schwerkraft seltsam. Bei jedem Durchgang nehme ich den ersten nicht festsitzenden Ball und bewege ihn. Kurzschluss iterate()gibt es weniger Bytes als über die gesamte Platine und dann zurück, wenn sich etwas geändert hat.

Dies ist eine vollständige Hauptklasse, die kompiliert und in der Befehlszeile mit folgendem Argument ausgeführt wird:

java -jar G.jar "##########\n# o-/    #\n#-  / -/ #\n# oo   o #\n# /   \o #\n# o   o \#\n#    o   #\n#   -\o  #\n#\  \\ o/#\n##########"

"Lesbare" Version:

class GravitySimulator {
    class Token {
        char symbol;
        int power = 0;

        Token(char c) {
            symbol = c;
        }
    }

    Token A = new Token(' ');

    Token[][] board;

    boolean iterate() {
        for (int i=1; i<board.length; i++)
            for (int j=1; j<board[i].length; j++) 
                if (board[i][j].power>0) {
                    if (move(i,j,i+1,j) || board[i+1][j].symbol=='/' && move(i,j,i+1,j-1) || board[i+1][j].symbol=='\\' && move(i,j,i+1,j+1)) return true;
                    int pow = board[i][j].power;
                    board[i][j] = new Token(Integer.toString(pow).charAt(0)){{power=pow;}};
                }
        return false;
    }

    boolean move(int x1, int y1, int x2, int y2) {
        if (board[x2][y2] == A || board[x2][y2].power>0) {
            board[x1][y1].power += board[x2][y2].power;
            board[x2][y2] = board[x1][y1];
            board[x1][y1] = A;
            return true;
        } return false;
    }

    String string() {
        String s = "";
        for (Token[] row : board) {
            for (Token token : row) s+=token.symbol;
            s+="\n";
        }
        return s;
    }

    void fromString(String s) {
        String[] rows = s.split("\\\\n");
        board = new Token[rows.length][rows[0].length()];
        for (int i=0; i<board.length; i++) 
            for (int j=0; j<board[i].length; j++) 
                switch(rows[i].charAt(j)) {
                    case '-': board[i][j]=new Token('-');break;
                    case '\\':board[i][j]=new Token('\\');break;
                    case '/': board[i][j]=new Token('/');break;
                    case 'o': board[i][j]=new Token('o'){{power=1;}};break;
                    case '#': board[i][j]=new Token('#');break;
                    default:  board[i][j]=A;
                }
    }

    public static void main(String[] args) {
        GravitySimulator g = new GravitySimulator();
        g.fromString(args[0]);
        while(g.iterate());
        System.out.println(g.string());
    }
}

Solcher Java viel wortreich. +1
Rohan Jhunjhunwala

1

Python3, 355b

g=g.replace("o","1").split("\n")
r=1
while r:
 r=0
 for y in range(len(g)):
  for x in range(len(g[y])):
   if g[y][x].isdigit():
    h=g[y+1]
    m={"/":-1,"\\":1}
    j=x+m[h[x]]if h[x]in m else x
    if("0"+h[j].strip()).isdigit():
     r=1
     g[y+1]=h[:j]+str(int(g[y][x])+int("0"+h[j]))+h[j+1:]
     g[y]=g[y][:x]+' '+g[y][x+1:]
print("\n".join(g))

Hier testen


0

PHP, 228 204 197 194 Bytes

for($a=strtr($a,o,1);$c=$a[$i];$i++)$c>0&&(($d=$a[$t=$i+strpos($a,"
")+1])>" "?$d!="/"?$d!="\\"?$d>0:$a[++$t]<"!"||$a[$t]>0:$a[--$t]<"!"||$a[$t]>0:1)&&$a[$t]=min($a[$t]+$c,9).!$a[$i]=" ";echo$a;

liefert Warnungen in PHP 7.1. Legen Sie (int)vor $a[$t]+$czu beheben.

Laufen Sie mit php -nr '$a="<string>";<code>'oder versuchen Sie es online .

Nervenzusammenbruch

for($a=strtr($a,o,1);   # replace "o" with "1"
    $c=$a[$i];$i++)     # loop through string
    $c>0                    # if character is numeric
    &&(($d=$a[                  # and ...
        $t=$i+                  # 3: target position = current position + 1 line
            strpos($a,"\n")+1   # 2: width = (0-indexed) position of first newline +1
    ])>" "                  # if target char is not space
        ?$d!="/"                # and not left slide
        ?$d!="\\"               # and not right slide
        ?$d>0                   # but numeric: go
        :$a[++$t]<"!"||$a[$t]>0     # right slide: if target+1 is space or ball, then go
        :$a[--$t]<"!"||$a[$t]>0     # left slide: if target-1 is space or ball, then go
    :1                              # space: go
    )&&                     # if go:
        $a[$t]=min($a[$t]+$c,9) # move ball/merge balls
        .!$a[$i]=" "            # clear source position
    ;
echo$a;                 # print string
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.