Mô phỏng trọng lực


33

Tuyên bố

Bạn được cung cấp một loạt các quả bóng rơi trong lưới 2D. Lưới này được bao quanh bởi các bức tường bất biến và không thể phá vỡ, vì vậy tất cả các hành động được chứa trong chúng. Nhiệm vụ của bạn là xác định trạng thái của kịch bản sẽ như thế nào sau khi trọng lực thực hiện tất cả.

Các yếu tố bên trong lưới

  • - Sàn, không thay đổi hướng của quả bóng rơi.
  • \ Trượt phải, thay đổi đường đi của vị trí bóng một (1) bên phải.
  • / Trượt trái, thay đổi đường đi của vị trí bóng một (1) trái.
  • o Một quả bóng.

Quy tắc

  • Bóng rơi.
  • Sàn nhà và cầu trượt không rơi .
  • Nếu quả bóng chạm vào một slide sẽ khiến nó đi qua một bức tường ( \#hoặc #/), hoặc xuyên qua một tầng, slide sẽ hoạt động như một sàn.
  • Khi một quả bóng chạm một quả bóng khác, nó sẽ trở thành một quả bóng, nhưng tăng sức mạnh của chúng lên tổng của cả hai quả bóng.
  • Những quả bóng mới (đã tham gia) sẽ tiếp tục hoạt động như bình thường.
  • Khi một quả bóng không thể di chuyển được nữa, nó sẽ được thay thế bằng sức mạnh của nó.
  • Sức mạnh của một quả bóng sẽ luôn luôn nhiều nhất là 9.

Đầu vào

Lưới sẽ được cung cấp trong một biến chuỗi với bất kỳ tên nào ngắn nhất trong ngôn ngữ bạn chọn. Theo mặc định, chúng tôi sẽ sử dụng alàm đầu vào. Một mẫu của một đầu vào, chính xác như đã nhận:

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

Đối với lưới ngẫu nhiên được tạo, sử dụng https://repl.it/B1j3/2 . Thay vào đó, hãy sử dụng trang được tạo của tôi (không quảng cáo, không tào lao, chỉ đầu vào và đầu ra)

Lưu ý ngắt dòng là \n. In đầu vào ra màn hình (không bắt buộc cho thử thách) sẽ hiển thị những thứ như thế này. Mặc dù tôi đã đặt bốn câu đố bên cạnh không gian an toàn.

##########  ##########  ##########  ##########
# \      #  # 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 /#
##########  ##########  ##########  ##########

Đầu ra

Cùng một lưới, được in ra màn hình với kết quả cuối cùng của sức mạnh bóng. Một câu trả lời hợp lệ sẽ là một (1) câu đố sau, mỗi câu đố tương ứng với đầu vào ở cùng một vị trí, tất nhiên nếu đầu vào khác nhau, bạn nên điều chỉnh đầu ra. Không giới hạn nó trong bốn!

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

Ghi bàn

Ngôn ngữ sẽ cạnh tranh với chính họ vì vậy hãy thoải mái sử dụng ngôn ngữ nongolf. Để xác thực một giải pháp tôi phải có khả năng kiểm tra nó ở đâu đó để thấy nó hoạt động!.

Điểm là số byte. Trong trường hợp hòa, câu trả lời đầu tiên để đạt được số điểm bị ràng buộc sẽ thắng.

Cảnh báo

  • Nếu không chắc chắn về cách một quả bóng sẽ phản ứng, hãy hỏi tôi và tôi sẽ làm rõ, tôi đã rõ ràng hết mức có thể nhưng tôi chắc chắn có những trường hợp khó hiểu.
  • Các slide chỉ được cưỡi nếu bạn có thể thoát chúng , hãy nghĩ về nó giống như một slide thực sự. Có một anh chàng ở phía trên không cho phép bạn vượt qua bóng trừ khi nó sẽ thoát qua phía bên kia.

Làm rõ các ví dụ về chuyển động bóng

######                       ######
#-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/\ #
######                       ######

CẬP NHẬT

Làm thế nào tôi có thể kiểm tra nếu câu trả lời của tôi là hợp lệ?

Tôi đã thiết lập một trang đơn giản trong một trong những trang web của mình sẽ cung cấp cho bạn một câu đố ngẫu nhiên và câu trả lời của nó. Lấy đầu vào và kiểm tra nó so với đầu ra. Giải pháp của tôi, mà không phải lo lắng quá nhiều về việc chơi golf là trong python (máy phát điện, và trang cũng là python)389b 355b

Bảng xếp hạng


1
Tôi nhớ về Marbelous .
Arcturus

10
Điểm thưởng nếu có ai trả lời trong Marbelous.
Mego


Nghe có vẻ như là một trò chơi pinball nghệ thuật ascii
Khaled.K

@ JuanCortés tại sao bạn không sử dụng mã ban lãnh đạo ưa thích để bạn không phải tự cập nhật bảng xếp hạng?

Câu trả lời:


6

JavaScript (ES6), 157 196

Chỉnh sửa char theo char thay vì theo từng hàng, kết quả tốt hơn nhiều

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

Lưu ý: không xử lý giá trị bóng> 9. Nhưng nó có thể, với chi phí 18 byte. Xem mã cơ bản dưới đây.

Đoạn kiểm tra (trang đầy đủ tốt hơn)

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>


Tốt đẹp! Tôi có rất nhiều điều để học theo cách chơi gôn
tôi vào

Bạn có nên ánh xạ các giá trị> 9 với v>9?9:v?
Tít

@Titus Tôi có thể, nhưng thực tế tôi có thể làm bất cứ điều gì tôi muốn, vì giá trị> 9 không được mong đợi, hãy xem nhận xét bằng cách OP trả lời câu hỏi của tôi.
edc65

5

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

Giải pháp đầu tiên và rõ ràng nhất xuất hiện trong đầu tôi là một giải pháp nhìn xung quanh các slide và sau đó hợp nhất hoặc thay thế.

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

Ung dung:

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

Kiểm tra như:

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

Cảm ơn: @ edc65


Tôi sẽ đăng con trăn của mình khi tôi chắc chắn mình không thể đánh gôn được nữa, nhưng cho đến nay, đó là mã trăn tạo ra câu trả lời. Bất cứ cách nào tôi có thể kiểm tra mã golf của bạn ở đâu đó để tôi có thể đưa bạn lên bảng xếp hạng? (jsfiddle, jsbin, ideone, bất cứ điều gì)
Juan Cortés

hạ nó xuống 355, di chuyển của bạn!
Juan Cortés

@ JuanCortés Xong!
tôi vào

b.replace(/o/g,'1').split`` có thể rút ngắn xuống[...b.replace(/o/g,1)]
edc65

@ edc65 Tôi nghĩ tôi đã sửa nó. Về cơ bản, nó luôn giữ sức mạnh dưới 10 bằng cách sửa đổi 10.
tôi vào

4

Java, quá nhiều 1102 987 byte

Bởi vì, Java.

\ o / Dưới 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());}}

Một mục tiêu bên đã có khả năng in mỗi lần lặp của hội đồng quản trị: chỉ cần loại bỏ các trung ;trongwhile(g.i()) ; System.out.print(g.s()); (Mặc dù điều này không vô hiệu hóa in cuối cùng trong đó có các 0-> chuyển đổi điện). Thật không may, trong phiên bản này, trọng lực hoạt động một cách kỳ lạ. Mỗi đường chuyền tôi lấy quả bóng không bị kẹt đầu tiên và di chuyển nó. Đoản mạch iterate()có ít byte hơn so với việc đi qua toàn bộ bảng sau đó quay trở lại nếu có gì thay đổi.

Đây là một lớp chính hoàn chỉnh, biên dịch và chạy trên dòng lệnh với đối số:

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

Phiên bản "có thể đọc":

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());
    }
}

Java dài dòng như vậy. +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))

Kiểm tra tại đây


0

PHP, 228 204 197 194 byte

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;

mang lại các cảnh báo trong PHP 7.1. Chèn (int)trước $a[$t]+$cđể sửa.

Chạy với php -nr '$a="<string>";<code>'hoặc thử trực tuyến .

phá vỡ

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.