মাধ্যাকর্ষণ সিমুলেটর


33

বিবৃতি

আপনাকে 2 ডি গ্রিডে পড়ার একটি সিরিজের বলের স্টিল দেওয়া হচ্ছে। এই গ্রিডটি চারপাশে অপরিবর্তনীয় এবং অবিচ্ছিন্ন দেয়াল দ্বারা বেষ্টিত রয়েছে যাতে সমস্ত ক্রিয়া তাদের মধ্যে অন্তর্ভুক্ত থাকে। আপনার কাজটি নির্ধারণ করা মহাকর্ষের পরে কাজটি করার পরে দৃশ্যের অবস্থা কী হবে।

গ্রিডের ভিতরে উপাদানগুলি

  • - মেঝে, পড়ন্ত বলগুলির দিক পরিবর্তন করে না।
  • \ ডান স্লাইড, বলের এক (1) পজিশনের ডানদিকে পরিবর্তন করে।
  • / বাম স্লাইড, বলের এক (1) অবস্থানের পথ পরিবর্তন করে।
  • o একটি বল.

বিধি

  • বল পড়ে।
  • মেঝে এবং স্লাইডগুলি পড়ে না
  • যদি বলটি এমন কোনও স্লাইডকে আঘাত করে যা এটি দেয়াল ( \#বা #/) দিয়ে যেতে পারে বা একটি তল পেরিয়ে যায় তবে স্লাইডটি মেঝে হিসাবে কাজ করবে।
  • যখন একটি বল অন্য বলটিকে আঘাত করে তখন একটি বল হয়ে যাবে, তবে তাদের শক্তি দুটি বলের যোগফলকে বাড়িয়ে দেবে।
  • নতুন বল (যোগদান করেছেন) যথারীতি আচরণ করতে থাকবে।
  • যখন কোনও বল আর চলাচল করতে পারে না, তখন এটি তার শক্তি দ্বারা প্রতিস্থাপিত হয়।
  • একটি বলের শক্তি সর্বদা সর্বনিম্ন 9 এ থাকবে।

ইনপুট

গ্রিডটি আপনার পছন্দমতো ভাষাতে সংক্ষিপ্ততম যে কোনও নামের সাথে একটি স্ট্রিং ভেরিয়েবল দেওয়া হবে। ডিফল্টরূপে আমরা aইনপুট হিসাবে ব্যবহার করব । প্রাপ্ত হিসাবে একটি ইনপুট একটি নমুনা:

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

উত্পাদিত এলোমেলো গ্রিডগুলির জন্য https://repl.it/B1j3/2 ব্যবহার করুন । ব্যবহার করুন আমার উত্পন্ন পৃষ্ঠা পরিবর্তে (কোন বিজ্ঞাপন, কোন বিষ্ঠা, শুধু ইনপুট এবং আউটপুট)

নোট লাইন বিরতি হয় \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 /#
##########  ##########  ##########  ##########

আউটপুট

একই শক্তি, বল শক্তির চূড়ান্ত ফলাফলের সাথে স্ক্রিনে মুদ্রিত। একটি বৈধ উত্তর নিম্নলিখিত ধাঁধাগুলির একটি (1) হবে, প্রতিটি প্রত্যেকে একই অবস্থানের সাথে ইনপুটটির সাথে মিল রাখে, অবশ্যই যদি ইনপুটটি আলাদা হয় তবে আপনার আউটপুট সামঞ্জস্য করা উচিত। এই চারটি সীমাবদ্ধ না!

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

স্কোর

ভাষাগুলি তাদের বিরুদ্ধে প্রতিদ্বন্দ্বিতা করবে তাই ননগল্ফ ভাষা ব্যবহার করতে নির্দ্বিধায়। কোনও সমাধান যাচাই করার জন্য অবশ্যই এটির কাজ হয় তা দেখতে আমি এটি অন্য কোথাও পরীক্ষা করতে সক্ষম হব!

স্কোর হল বাইট সংখ্যা। টাই হওয়ার ক্ষেত্রে প্রথম উত্তরটি টাই স্কোরের কাছে পৌঁছায়।

সতর্কবাণী

  • কোনও বল কীভাবে প্রতিক্রিয়া দেখাবে সে সম্পর্কে যদি অনিশ্চিত থাকে তবে আমাকে জিজ্ঞাসা করুন এবং আমি স্পষ্ট করে বলব, আমি যতটা পরিষ্কার করতে পেরেছি ঠিক ততটাই পরিষ্কার হয়েছি তবে আমি নিশ্চিত যে এরকম কিছু বিভ্রান্তিকর ক্ষেত্রে রয়েছে।
  • স্লাইডগুলি কেবল তখনই চালিত হয় যদি আপনি সেগুলি থেকে বেরিয়ে আসতে পারেন , বাস্তব স্লাইডের মতো এটি সম্পর্কে ভাবেন। শীর্ষে একটি লোক আছে যেটি অন্য দিক দিয়ে প্রস্থান না করা পর্যন্ত আপনাকে বল দিয়ে দেয় না।

বল চলাচলের উদাহরণ স্পষ্ট করে

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

আপডেট

আমার উত্তরটি বৈধ হলে আমি কীভাবে পরীক্ষা করতে পারি?

আমি আমার সাইটগুলির একটিতে একটি সাধারণ পৃষ্ঠা সেট আপ করেছি যা আপনাকে একটি এলোমেলো ধাঁধা এবং এর উত্তর দেবে। ইনপুট নিন এবং আউটপুট বিরুদ্ধে এটি পরীক্ষা করুন। গল্ফিং সম্পর্কে খুব বেশি চিন্তা না করেই আমার সমাধানটি পাইথনে রয়েছে (জেনারেটর এবং পৃষ্ঠাটিও অজগর)389b 355b

লিডারবোর্ড


1
আমি মার্বেলাসের কথা মনে করিয়ে দিচ্ছি
আর্কটরাস

10
মার্বেলাসে যদি কেউ উত্তর দেয় তবে বোনাস পয়েন্ট দেয়।
মেগো


সম্ভাব্য
অ্যাসিআই

@ জুয়ানকোর্টস কেন আপনি অভিনব লিডার বোর্ড কোড ব্যবহার করেন না যাতে আপনাকে নিজেরাই র‌্যাঙ্কিং আপডেট করতে হবে না?
usandfriends

উত্তর:


6

জাভাস্ক্রিপ্ট (ES6), 157 196

সারি সারি পরিবর্তে চর দ্বারা সম্পাদনা করুন , আরও ভাল ফলাফল

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

দ্রষ্টব্য: বল মানগুলি> 9 পরিচালনা করে না তবে এটি 18 বাইটের দাম সহ হতে পারে could নীচে বেসিক কোড দেখুন।

পরীক্ষার স্নিপেট (আরও ভাল পূর্ণ পৃষ্ঠা)

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>


নিস! গল্ফের উপায়গুলি সম্পর্কে আমার অনেক কিছু শিখতে হবে
বন্ধুরা

আপনার মানগুলি> 9 দিয়ে মানচিত্র করা উচিত নয় v>9?9:v?
তিতাস

টিটাস আমি পারলাম, তবে বাস্তবে আমি যা চাই তা করতে পেরেছি, মান হিসাবে 9 হিসাবে প্রত্যাশিত নয়, আমার প্রশ্নের উত্তর দিয়ে ওপি মন্তব্যটি দেখুন।
edc65

5

জাভাস্ক্রিপ্ট (ES6), 453 426 409 306 290 286 বাইট

আমার মনে প্রথম এবং সর্বাধিক সুস্পষ্ট সমাধানটি হ'ল এটি স্লাইডগুলির চারপাশে দেখে এবং তারপরে মার্জ বা প্রতিস্থাপন করে।

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

পরীক্ষা যেমন:

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

ধন্যবাদ: @ edc65


আমি আমার অজগরটি পোস্ট করব যখন আমি নিশ্চিত যে আমি এটি আর গল্ফ করতে পারি না, তবে এখনও পর্যন্ত উত্তরটি উত্পন্নকারী অজগর কোডটি। যেভাবেই আমি কোথাও আপনার গল্ফ কোডটি পরীক্ষা করতে পারি যাতে আমি আপনাকে লিডারবোর্ডে পপ করতে পারি? (jsfiddle, jsbin, আদর্শ, যাই হোক না কেন)
হুয়ান কর্টেস

আপনার পদক্ষেপে এটি 355 এ নেমেছে!
জুয়ান কর্টস

@ জুয়ানকোর্টসের কাজ!
usandfriends

b.replace(/o/g,'1').split`` সংক্ষিপ্ত হতে পারে[...b.replace(/o/g,1)]
edc65

@ edc65 আমার মনে হয় আমি এটি ঠিক করেছি। মূলত এটি সর্বদা 10'M'ding করে 10 এর নীচে শক্তি রাখে
usand বান্ধবীরা

4

জাভা, খুব বেশি 1102 987 বাইট

কারণ, জাভা

\ o / এটি 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());}}

একটি সাইড লক্ষ্য বোর্ড প্রতি পুনরাবৃত্তির প্রিন্ট করতে সক্ষম হচ্ছে ছিল: শুধু মধ্যম অপসারণ ;মধ্যে while(g.i()) ; System.out.print(g.s());(যদিও এই নিষ্ক্রিয় করে সর্বশেষ মুদ্রণ যা 0-> ক্ষমতা রূপান্তর আছে)। দুর্ভাগ্যক্রমে, এই সংস্করণে, মাধ্যাকর্ষণ অদ্ভুতভাবে কাজ করে। প্রতিটি পাস আমি প্রথম নন-স্টকড বল নিয়ে চলে যাই। শর্ট সার্কিটের iterate()পুরো বোর্ডের চেয়ে কম বাইট নেই তারপরে কিছু পরিবর্তন হলে ফিরে আসা।

এটি একটি সম্পূর্ণ প্রধান শ্রেণি, যুক্তি সহ কমান্ড লাইনে সংকলন এবং চালনা:

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

"পাঠযোগ্য" সংস্করণ:

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

এ জাতীয় জাভা অনেক ভার্বোস। +1
রোহান ঝুনঝুনওয়ালা


0

পিএইচপি, 228 204 197 194 বাইট

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;

পিএইচপি 7.1 এ সতর্কতা দেয়। ঠিক করার (int)আগে sert $a[$t]+$cোকান।

এটি দিয়ে চালান php -nr '$a="<string>";<code>'বা অনলাইনে চেষ্টা করুন

ভাঙ্গন

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.