ন্যূনতম নেটহ্যাক


64

নেট হ্যাক একটি রগুইলাইক গেম যেখানে কোনও খেলোয়াড়কে অবশ্যই অন্ধকারের নিম্নতম স্তর থেকে ইয়েন্ডারের তাবিজটি পুনরুদ্ধার করতে হবে। সাধারণত টেলনেটের মাধ্যমে খেললে পুরো খেলাটি ASCII গ্রাফিক্সের সাথে উপস্থাপিত হয়। গেমটি অত্যন্ত চ্যালেঞ্জিং এবং সাফল্যের জন্য অনেক গেম মেকানিক্সের জ্ঞান প্রয়োজন।

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

চ্যালেঞ্জ প্রয়োজনীয়তা

  • একটি 5 × 16 অন্ধকূপ (একক স্তর) থাকবে।
  • খেলোয়াড়কে অন্ধকারের অভ্যন্তরে স্কয়ার শুরু করে একটি শুরুর অবস্থান (allyচ্ছিকভাবে এলোমেলো) এবং তাবিজকে একটি পৃথক এলোমেলো (প্রতিটি বার প্রোগ্রাম চালানোর সময় পৃথক করে) দিন। অর্থাৎ, তাবিলেট খেলোয়াড়ের মতো একই স্কোয়ারে শুরু করতে দেওয়া হয় না।
  • চারটি ইনপুট কী গ্রহণ করুন যা প্লেয়ারকে একবারে এক স্কোয়ারে নিয়ে যায় (চারটি মূল দিক)। অন্যান্য ইনপুটটি পড়ার / প্রক্রিয়াকরণের অনুমতি দেওয়া হয় (একটি পঠন () ফাংশন যার জন্য 'প্রবেশ' ইত্যাদি চাপতে হবে)।
  • অন্ধকারের গণ্ডির বাইরে ভ্রমণ করার অনুমতি নেই। উদাহরণস্বরূপ, যদি খেলোয়াড় ডানদিকে ডানদিকে ডান প্রান্তে থাকে তবে কিছুই করা উচিত নয়।
  • প্রাথমিক প্রজন্মের পরে এবং প্রতিটি আন্দোলনের পরে, গেমের অবস্থা মুদ্রণ করুন। যেহেতু এটি কোড গল্ফ এবং মুদ্রণ বরং উদ্বেগজনক, মুদ্রণ ফাংশন এবং ফাংশন কলের জন্য অক্ষর গণনা উপেক্ষা করে কোনও রাজ্য পরিবর্তন না ধরে । খালি কোষ সময়ের (যেমন প্রদর্শন করা উচিত .), মাদুলি ডাবল উদ্ধৃতি হিসাবে ( ") এবং চরিত্র প্রতীক হিসাবে ( @)।
  • খেলোয়াড় যখন তাবিজটি "আবিষ্কার" করে (একই স্কোয়ারে উপস্থিত হয়) খেলা শেষ হয়ে যায়

জয়লাভ

এটি একটি কোড গল্ফ চ্যালেঞ্জ, আজ থেকে এক সপ্তাহের মধ্যে প্রয়োজনীয়তাগুলি পূরণ করার সবচেয়ে সংক্ষিপ্ত কোডটি বিজয়ী হিসাবে ঘোষণা করা হবে।

উদাহরণ

মৌলিক প্রয়োজনীয়তা এবং নমুনা আউটপুট দেখানোর জন্য এখানে সি # (অগল্ফড) এর একটি উদাহরণ সমাধান রয়েছে।

using System;

namespace nh
{
    class Program
    {
        static Random random = new Random();

        // player x/y, amulet x/y
        static int px, py, ax, ay;

        static void Main(string[] args)
        {
            px = random.Next(0, 16);
            py = random.Next(0, 5);

            // amulet starts on a position different from the player
            do { ax = random.Next(0, 16); } while (px == ax);
            do { ay = random.Next(0, 5); } while (py == ay); 

            print();

            do
            {
                // reads a single keypress (no need to press enter)
                // result is cast to int to compare with character literals
                var m = (int)Console.ReadKey(true).Key;

                // Move the player. Here standard WASD keys are used.
                // Boundary checks for edge of dungeon as well.
                if (m == 'W')
                    py = (py > 0) ? py - 1 : py;
                if (m == 'S')
                    py = (py < 5) ? py + 1 : py;
                if (m == 'A')
                    px = (px > 0) ? px - 1 : px;
                if (m == 'D')
                    px = (px < 16) ? px + 1 : px;

                // print state after each keypress. If the player doesn't
                // move this is redundant but oh well.
                print();

            // game ends when player is on same square as amulet
            } while (px != ax || py != ay);
        }

        static void print()
        {
            Console.Write('\n');
            for (int y=0; y<5; y++)
            {
                for (int x = 0; x < 16; x++)
                {
                    if (x == px && y == py)
                        Console.Write('@');
                    else if (x == ax && y == ay)
                        Console.Write('"');
                    else
                        Console.Write('.');
                }
                Console.Write('\n');
            }
        }
    }
}

মোট চরিত্রের গণনা 1474, তবে মুদ্রণ ফাংশনটিতে কলগুলি উপেক্ষা করে এবং এর সংজ্ঞাটি চূড়ান্ত অক্ষর গণনা 896

প্রোগ্রামটি চালিত হলে আউটপুট:

................
...."...........
..........@.....
................
................

'এ' কী দু'বার টিপানোর পরে আউটপুট (উপরে সহ):

................
...."...........
..........@.....
................
................

................
...."...........
.........@......
................
................

................
...."...........
........@.......
................
................

10
আমার অনুভূতি আছে যে এটি ডুরকনবকে আগ্রহী করবে।
অ্যালেক্স এ।

10
রোগ হ'ল আসল রগুয়ালাইক গেম যেখানে কোনও খেলোয়াড়কে অবশ্যই অন্ধকারের নিম্নতম স্তর থেকে ইয়েেন্ডারের তাবিজ পুনরুদ্ধার করতে হবে। কেন এটিকে ন্যূনতম রোগ বলা হয় না?
গিলস 19

5
@ গিলস কেন এটিকে ন্যূনতম সাপ বলছেন না?
কেসী কুবাল

26
Psshh, কোন তির্যক আন্দোলন? কোন yubnhjkl? এমনকি তাবিজ পাওয়ার পরে উপরে উঠার সিঁড়িও নেই? : পি ( উন্মত্তবৎ যাহাই হউক না কেন upvotes )
Doorknob

2
@ টলোস: আমি এখানে এখনও এলোমেলো হিসাবে গণ্য এখনও অস্পষ্ট । প্রোগ্রামটি চালানোর সময় প্রতিটি সময় প্রোগ্রামটি চালানোর প্রয়োজনীয়তার জন্য এটি পূরণ করা সত্যিই সম্ভব নয় ... বিশেষত, এই উত্তরে , তাবিউলটি সমস্ত সম্ভাব্য 79 টির মধ্যে 9 টি স্থান দখল করতে পারে। সেটা কি হিসাবের মধ্যে আসে?
ডেনিস

উত্তর:


37

টিআই-বেসিক, 42 41 38 36 35 বাইট

আপনার টিআই -83 বা 84+ সিরিজের গ্রাফিং ক্যালকুলেটরের জন্য।

int(5irand→A                          //Randomize amulet position
6log(ie^(6→C                          //15.635 + 4.093i
Repeat Ans=A                          //Ans holds the player pos. (starts bottom right)
iPart(C-iPart(C-Ans-e^(igetKey-i      //Boundary check, after adjusting player position
prgmDISPLAY
End

----------
PROGRAM:DISPLAY
For(X,0,15
For(Y,0,4
Output(Y+1,X+1,".
If A=X+Yi
Output(Y+1,X+1,"¨
If Ans=X+Yi
Output(Y+1,X+1,"@
End
End

কোনটি দিক খেলোয়াড় যাব একটি ফাংশন কি কোড চাপা কী, কিন্তু চার কি যে স্পষ্টভাবে কাজ শীর্ষ সারিতে এই হল:

Key        [Y=]  [WINDOW]  [ZOOM]  [TRACE]  [GRAPH]
           -------------------------------------------
Key code    11      12       13               15
Direction  Left     Up     Right             Down

তাবিজ প্রথম স্তম্ভের পাঁচটি স্কোয়ারের একটিতে শুরু হয় এবং প্লেয়ারটি নীচে ডান স্কোয়ার থেকে শুরু হয়। উদাহরণস্বরূপ, একটি সম্ভাব্য বিন্যাসটি হ'ল:

................
¨...............
................
................
...............@

ব্যাখ্যা

প্লেয়ারের অবস্থানটি একটি জটিল সংখ্যা থেকে শুরু 0+0iকরে সংরক্ষণ করা হয় 15+4i, যেখানে আসল অংশটি ডানদিকে যায় এবং কাল্পনিক অংশটি নীচে যায়। এটি উপরের এবং বামে সহজ সীমানা যাচাইয়ের সুবিধার্থে: আমরা কেবল সংখ্যাটি সামান্য এবং শূন্যের দিকে গোল করি। উদাহরণস্বরূপ, যদি অফসেট হয় 0.5এবং আমাদের অবস্থানটি -1+3i(স্ক্রিনটি বাম দিকে) থাকে তবে অবস্থানটি সংশোধন করা হবে iPart(-0.5+3.5i)=0+3i, এটি কোথায় হওয়া উচিত। নীচে এবং ডান সীমানার জন্য অনুসন্ধান করা কিছুটা জটিল; আমাদের একটি ধ্রুবক থেকে সংখ্যাটি বিয়োগ করতে হবে C, যা প্রায় 15.635 + 4.093i(এটি সবচেয়ে সংক্ষিপ্ততম আমি 15+4iএবং এর মধ্যে খুঁজে পেলাম 16+5i), গোল, Cআবার নম্বরটি ফ্লিপ করতে আবার বিয়োগ করে আবার গোল করতে পারি।

একটি কী টিপে গেলে, অযত্নে প্লেয়ারের অবস্থানটি 1 একক দ্বারা কিছু দিকের দিকে চলে যাবে, তবে নির্দিষ্ট কীগুলি চাপলে কেবল পূর্ণসংখ্যার অংশটি পরিবর্তন হয়। ভাগ্যক্রমে, কীগুলি যে কাজ করে তা সবগুলি শীর্ষ সারিতে থাকে। নীচে অফসেটগুলির একটি গ্রাফ দেওয়া আছে যেখানে 11, 12, 13, এবং 15 কীগুলি টিপানো হয় এবং যখন কোনও কী চাপানো হয় না (কোনও চাপ কেন্দ্রের বর্গাকার অভ্যন্তরের বিন্দু নয়, যার ফলে পূর্ণসংখ্যার অংশগুলি অপরিবর্তিত হয়; চারটি কী টিপুন 'অফসেটগুলির পৃথক পৃথক অংশ থাকে)। Cবৃত্তের কেন্দ্রে লাল ক্রস।

এখানে চিত্র বর্ণনা লিখুন

পুরানো কোড (42 বাইট):

int(9irand→A                     // 0≤rand≤1, so int(9irand) = i*x where 0≤x≤8
1                                //set "Ans"wer variable to 1+0i
Repeat Ans=A                     
Ans-iPart(i^int(48ln(getKey-1    //add -i,-1,i,1 for WASD respectively (see rev. history)
Ans-int(Ans/16+real(Ans/7        //ensure player is inside dungeon
prgmDISPLAY                      //display on top 5 rows of the homescreen   
                                 //(for this version switch X+Yi with Y=Xi in prgmDISPLAY)
End

সীমাবদ্ধতা

"চরিত্র থেকে বাঁচার কোনও উপায় নেই , সুতরাং "একটি প্রোগ্রামের মধ্যে স্ট্রিংগুলি তৈরি করা যায় না cannot অতএব, এটি ¨কোটের পরিবর্তে উমলাউট চিহ্ন ব্যবহার করে (যদি একটি উদ্ধৃতি চিহ্নের সাথে ইতিমধ্যে বিদ্যমান স্ট্রিং থাকে তবে আমি তা প্রদর্শন করতে পারি)। একটি প্রোগ্রাম পেতে ¨এবং পেতে @, একটি বাইরের সরঞ্জাম প্রয়োজন; তবে এটি বৈধ টিআই-বেসিক।


2
কেবল মজাদার জন্য, আমি এই স্নিপেট তৈরি করেছি যা স্ট্রাই 1 এ ডায়ারেসিস এবং @ প্রতীক রাখে ('বাইরের সরঞ্জামের বিপরীতে')। আপনার ক্যালকুলেটরটির সাথে মিলে যায় এমন শীর্ষে লাইনটি চয়ন করুন, এটিকে একটি নতুন প্রোগ্রামে প্রবেশ করুন, এবং এসএম (
এমআই রাইট

ওহ, আমি ক্যালকুলেটরে মেশিন কোডে কোডিংয়ের কথা ভুলে গিয়েছিলাম। 'একটি ভুল টাইপ দিয়ে আমার ক্র্যাশ করতে চাই না, তবে আমি বিশ্বাস করি এটি কার্যকর হয়েছে।
lirtosiast

44

চিপ -8 , 48 বাইট

এটি আইনী হিসাবে বিবেচিত নাও হতে পারে তবে কেন এই নরক নয়। আমি ভার্চুয়াল গেম কনসোলের বাইকোড-ভিত্তিক প্রোগ্রামিং ভাষা CHIP-8 এ আমার প্রোগ্রামটি লিখেছিলাম। আপনি অ্যাক্টো নামক একটি এমুলেটর / ডিবাগার লিখে আপনার ব্রাউজারে সম্পূর্ণ প্রোগ্রাম (99 বাইট) চেষ্টা করতে পারেন:

স্ক্রিনশট

http://johnearnest.github.io/Octo/index.html?gist=1318903acdc1dd266469

সেই সম্পূর্ণ প্রোগ্রামের একটি হেক্স্স ডাম্প নিম্নরূপ:

0x60 0x14 0x61 0x04 0xC4 0x3C 0xC5 0x08
0x22 0x36 0xF6 0x0A 0x22 0x52 0x40 0x00
0x12 0x16 0x46 0x07 0x70 0xFC 0x40 0x3C
0x12 0x1E 0x46 0x09 0x70 0x04 0x41 0x00
0x12 0x26 0x46 0x05 0x71 0xFC 0x41 0x10
0x12 0x2E 0x46 0x08 0x71 0x04 0x22 0x52
0x3F 0x01 0x12 0x0A 0x00 0xFD 0xA2 0x58
0xD4 0x54 0x22 0x52 0x62 0xFF 0xA2 0x5B
0xD2 0x34 0x72 0x04 0x32 0x3F 0x12 0x40
0x62 0xFF 0x73 0x04 0x33 0x14 0x12 0x40
0x00 0xEE 0xA2 0x5F 0xD0 0x14 0x00 0xEE
0xA0 0xA0 0x40 0x00 0x00 0x20 0x00 0xF0
0x90 0x90 0xD0

আপনি আসল CHIP-8 কীপ্যাডে ASWD কী বা 7589 কী সহ খেলোয়াড়কে সরিয়ে নিতে পারেন। আমি যদি পটভূমি এবং প্লেয়ারটি আঁকার জন্য সমস্ত কোড এবং ডেটা সরিয়ে ফেলি তবে আমি পরিবর্তে এই 48 বাইট ডাম্প পেয়ে যাব:

0x60 0x14 0x61 0x04 0xC4 0x3C 0xC5 0x08
0xF6 0x0A 0x40 0x00 0x12 0x12 0x46 0x07
0x70 0xFC 0x40 0x3C 0x12 0x1A 0x46 0x09
0x70 0x04 0x41 0x00 0x12 0x22 0x46 0x05
0x71 0xFC 0x41 0x10 0x12 0x2A 0x46 0x08
0x71 0x04 0x3F 0x01 0x12 0x08 0x00 0xFD

প্রোগ্রামটির নিরঙ্কুশ, সম্পূর্ণ ফর্মটি উচ্চ স্তরের সমাবেশ ভাষায় নিম্নরূপ রচিত হয়েছিল:

:alias px v0
:alias py v1
:alias tx v2
:alias ty v3
:alias ax v4
:alias ay v5
:alias in v6

: main
    px := 20
    py := 4
    ax := random 0b111100
    ay := random 0b001000
    draw-board
    loop
        in := key
        draw-player
        if px != 0 begin
            if in == 7 then px += -4
        end
        if px != 0x3C begin
            if in == 9 then px +=  4
        end
        if py != 0 begin
            if in == 5 then py += -4
        end
        if py != 16 begin
            if in == 8 then py +=  4
        end
        draw-player
        if vf != 1 then
    again
    exit

: draw-board
    i := amulet
    sprite ax ay 4
    draw-player
    tx := -1
    i := ground
    : draw
    loop
        sprite tx ty 4
        tx += 4
        if tx != 63 then jump draw
        tx := -1
        ty += 4
        if ty != 20 then
    again
;

: draw-player
    i := player
    sprite px py 4  
;

: amulet  0xA0 0xA0 0x40
: ground  0x00 0x00 0x20 0x00
: player  0xF0 0x90 0x90 0xD0

নোট করুন যে সংকলিত বাইটগুলি সেগুলি চিপ -8 প্রোগ্রামিং ভাষা; এসেমব্লার হ'ল এই জাতীয় প্রোগ্রামগুলি রচনার আরও সুবিধাজনক উপায়।


19
কাজের জন্য সঠিক সরঞ্জাম।
ডেনিস

6
আপনার গেমটি বার বার খেলতে আমাকে অপচয় করার জন্য +1।
অ্যালেক্স এ।

4
@AlexA। আপনি যদি আরও বেশি সময় নষ্ট করতে চান তবে আপনার কেভ এক্সপ্লোরার চেষ্টা করা উচিত । ওভারওয়ার্ল্ড এবং কিউইতে এএসডাব্লুডি মুভ প্ল্যাটফর্মার স্তরগুলিতে ব্লকগুলি পুনরায় সেট / সরানোর জন্য ব্যবহৃত হয়।
জন

4
দুর্দান্ত, আমার উইকএন্ডে ভাল আছে।
অ্যালেক্স এ।

1
আমি প্রথমে সন্দেহবাদী ছিলাম, তবে কেভ এক্সপ্লোরারটি মজাদার ছিল এবং CHIP-8 আমার অনুমানের চেয়ে অনেক বেশি দীর্ঘ ছিল। সুতরাং আমি অনুমান করি আমাকে এটি শিখতে হবে।

10

পাইথন 3, 86 বাইট

def d():
    import sys
    for y in range(5):
        line = []
        for x in range(16):
            line.append('@' if y*16+x == p else \
                        '"' if y*16+x == a else \
                        '.')
        print(''.join(line))
    print()
    sys.stdout.flush()

p=79;a=id(9)%p
while p-a:d();p+=[p%16<15,16*(p<64),-(p%16>0),-16*(p>15)][ord(input())%7%5]

কেবল নীচের দুটি লাইন গণনা করা এবং ছাড়ছে d();


নীচে-ডান কোণায় ("শেষ" স্কোয়ার) প্লেয়ারটি শুরু করে আমি অন্য একটি বাইট সংরক্ষণ করেছি, তারপর প্রথম rand৯ স্কোয়ার থেকে এলোমেলোভাবে নমুনা নিলাম।
লিন

উফ, দুঃখিত, স্থির! আমি অনুমান করি যে আমি ম্যানুয়ালি বাইট গণনা করে আশ্চর্য নই। : <
লিন

1
আমার মনে হয় আপনি প্রতিস্থাপন দ্বারা অন্য চরিত্র সংরক্ষণ করতে পারবেন a=id(9)%79সঙ্গে a=id(9)%p
kirbyfan64sos

@ kirbyfan64sos উজ্জ্বল! ধন্যবাদ।
লিন

1
এছাড়াও, আপনি যদি পাইথন 3 এর জন্য এটি করেন, আপনি raw_inputকলটি ঠিক পরিবর্তন করতে পারেন input
kirbyfan64sos

10

সি, 122 121 115 104 102 101 বাইট

#define o ({for(int t=0;t<80;++t)t%16||putchar(10),putchar(t^p?t^a?46:34:64);})
p;main(a){for(a=1+time(0)%79;p^a;o,p+=(int[]){-16*(p>15),16*(p<64),-!!(p%16),p%16<15}[3&getchar()/2]);}

এখানে প্রথম পোস্ট! আশা করি তুমি পছন্দ করেছ :)

oমুদ্রণ, এরম, ফাংশন। আমাদের সাহসী নায়ককে 2, 4, 6 এবং 8 দিয়ে স্থানান্তরিত করা যেতে পারে, তবে অন্য কোনও ইনপুট না পাঠিয়ে সাবধান থাকুন (কোনও নতুন লাইনে!)।

আপডেট 1: আনা aএবং iমধ্যে mainএর প্যারামিটার।

আপডেট 2: ওপি নিশ্চিত করেছে যে ইনপুটগুলির একটি একক স্ট্রিং ঠিক আছে, আমি মুক্তি পেয়েছি scanf(যা আমি নিউলাইনটি এড়িয়ে যাতাম)।

আপডেট 3: একটি যৌগিক অ্যারে আক্ষরিক ব্যবহৃত হয়েছে এবং ইনপুট বিন্যাসটি সংশোধিত করেছে। আপনি যদি কোনও অবৈধ দিক প্রবেশ করেন তবে প্রোগ্রামটি এখন হাইওয়াইরে যায়;)

আপডেট 4: লক্ষ্য করা যায় যে মুদ্রণ ফাংশনে কল গণনা করে না। আরও যত্ন সহকারে নিয়মগুলি পড়তে নোটটি নিল।

আপডেট 5: একটি বাইট সংরক্ষিত, মিক্কেল অ্যালান স্টোককবিয়ে ক্রিস্টিয়াকে ধন্যবাদ।


হতে !!(p%16)পারে p%16>0? আমার ক্রিয়াকলাপটি আমি মনে করি না।
lirtosiast

@ থমাসকওয়া এটি তবে এটি অ্যানারি -সাহায্য করতে পারে না তবে লেগে থাকতে পারে, সুতরাং যেভাবেই প্রথম pবন্ধনী প্রয়োজন। ডাবল ব্যাংটি কেবল উদাসীনতা :)
কোয়ান্টিন

@ কুইন্টিন 3 এবং গেটচর () / 2 <getchar () / 2-25
মিক্কেল অ্যালান স্টোককবিয়ে ক্রিস্টিয়া

@ মিক্কেলআলানস্টোক্কেবিয়া ক্রিশ্চিয়া আপনাকে ধন্যবাদ :)
কোয়ান্টিন

9

সিজেম, 46 45 44 40 39 37 বাইট

{'.80*W$Gb'"t1$Gb'@tG/W%N*oNo}:P;
5,G,m*:Dmr~{P_l~4b2fm.+_aD&!$_W$=!}gP];

প্রথম লাইন (একটি ফাংশন সংজ্ঞায়িত করে যা বর্তমান গেমের অবস্থাটি মুদ্রণ করে) এবং দ্বিতীয় লাইনে পি'র (সেই ফাংশনটিকে কল করুন) বাইট গণনায় অবদান রাখে না।

প্রারম্ভিক অবস্থান এবং তাবিজের অবস্থান উভয়ই ছদ্ম-এলোমেলোভাবে নির্বাচিত হয়। বিতরণ হিসাবে সমান এবং অন্তর্নিহিত PRNG অনুমতি দেয়।

ইনপুট হয় E, 6, 9এবং Bজন্য আপ , ডাউন , বাম এবং ডান , সঙ্গে Caps Lockসক্রিয় দ্বারা অনুসরণ Enter

বিকল্প সংস্করণ

{'.80*W$Gb'"t1$Gb'@tG/W%N*oNo}:P;
5,G,m*:Dmr~{P_ZYm*l~(=:(.+_aD&!$_W$=!}gP];

আরও চারটি বাইট ব্যয়ে, ইনপুট ফর্ম্যাটটি উল্লেখযোগ্যভাবে উন্নত হয়েছে:

  • এই সংস্করণ গ্রহণ করে 8, 2, 4এবং 6জন্য আপ , ডাউন , বাম এবং ডান , যা নামপ্যাড উপর সংশ্লিষ্ট নির্দেশক তীরচিহ্নগুলি সাথে মেলে।
  • এছাড়া গ্রহণ 7, 9, 1এবং 3সংশ্লিষ্ট তির্যক প্যাচসমূহ জন্য।

পরীক্ষামূলক

যেহেতু আই / ও ইন্টারেক্টিভ, আপনার জাভা দোভাষী দ্বারা এই কোডটি চেষ্টা করা উচিত ।

সর্বশেষতম সংস্করণটি ডাউনলোড করুন এবং প্রোগ্রামটি এভাবে চালিত করুন:

java -jar cjam-0.6.5.jar nethack.cjam

Enterপ্রতিটি কী-এর পরে চাপ দেওয়া এড়াতে এবং আউটপুটটির অভ্যন্তরীণ আপডেটের জন্য, আপনি এই মোড়কটি ব্যবহার করতে পারেন:

#!/bin/bash

lines=5
wait=0.05

coproc "$@"
pid=$!

head -$lines <&${COPROC[0]}

while true; do
    kill -0 $pid 2>&- || break
    read -n 1 -s
    echo $REPLY >&${COPROC[1]}
    printf "\e[${lines}A"
    head -$lines <&${COPROC[0]}
    sleep $wait
done

printf "\e[${lines}B"

এই মত আহ্বান:

./wrapper java -jar cjam-0.6.5.jar nethack.cjam

প্রধান সংস্করণ

5,G,   e# Push [0 1 2 3 4] and [0 ... 15].
m*:D   e# Take the Cartesian product and save in D.
mr~    e# Shuffle and dump the array on the stack.
       e# This pushes 80 elements. We'll consider the bottommost the amulet's
       e# position and the topmost the player's.
{      e# Do:
  P    e#   Call P.
  _    e#   Copy the player's position.
  l~   e#   Read and evaluate one line of input.
       e#      "6" -> 6, "9" -> 9, "B" -> 11, "E" -> 14 
  4b   e#   Convert to base 4.
       e#     6 -> [1 2], 9 -> [2 1], 11 -> [2 3], 14 -> [3 2]
  2f-  e#   Subtract 2 from each coordinate.
       e#     [1 2] -> [-1 0], [2 1] -> [0 -1], [2 3] -> [0 1], [3 2] -> [1 0]
  .+   e#   Add the result to the copy of player's position.
  _aD& e#   Push a copy, wrap it in an array and intersect with D.
  !    e#   Logical NOT. This pushes 1 iff the intersection was empty.
  $    e#   Copy the corresponding item from the stack.
       e#     If the intersection was empty, the new position is invalid
       e#     and 1$ copies the old position.
       e#     If the intersection was non-empty, the new position is valid
       e#     and 0$ copies the new position.
  _W$  e#   Push copies of the new position and the amulet's position.
  =!   e#   Push 1 iff the positions are different.
}g     e# While =! pushes 1.
P      e# Call P.
];     e# Clear the stack.

বিকল্প সংস্করণ

ZYm*   e# Push the Cartesian product of 3 and 2, i.e.,
       e#   [[0 0] [0 1] [0 2] [1 0] [1 1] [1 2] [2 0] [2 1] [2 2]].
l~     e#   Read and evaluate one line of input.
(=     e# Subtract 1 and fetch the corresponding element of the array.
:(     e# Subtract 1 from each coordinate.

কার্য পি

'.80*  e# Push a string of 80 dots.
W$Gb   e# Copy the amulet's position and convert from base 16 to integer.
'"t    e# Set the corresponding character of the string to '"'.
1$Gb   e# Copy the player's position and convert from base 16 to integer.
'@t    e# Set the corresponding character of the string to '@'.
G/     e# Split into chunks of length 16.
W%     e# Reverse the chunks (only needed for the alternate program).
N*     e# Join the chunks, separating by linefeeds.
oNo    e# Print the resulting string and an additional linefeed.

2
আমি টিআই বেসিকের সাথে আপনার লেজের উপর ঠিক আছি! আমি আমার সমাধান যাচাই করার পরে পোস্ট করব।
21

8

জাভা, 231 বাইট (ফাংশন যদি 196)

342 এ এখানে পুরো প্রোগ্রামের কোডটি রয়েছে:

class H{public static void main(String[]a){int p=0,y=79,c;y*=Math.random();y++;p(p,y);do p((p=(c=new java.util.Scanner(System.in).next().charAt(0))<66&p%16>0?p-1:c==68&p%16<15?p+1:c>86&p>15?p-16:c==83&p<64?p+16:p),y);while(p!=y);}static void p(int p,int y){for(int i=0;i<80;i++){System.out.print((i==p?'@':i==y?'"':'.')+(i%16>14?"\n":""));}}}

মুদ্রণ ফাংশন ছাড়াই, 231:

class H{public static void main(String[]a){int p=0,y=79,c;y*=Math.random();y++;p(p,y);do p((p=(c=new java.util.Scanner(System.in).next().charAt(0))<66&p%16>0?p-1:c==68&p%16<15?p+1:c>86&p>15?p-16:c==83&p<64?p+16:p),y);while(p!=y);}}

যদি কেবল কোনও ফাংশন ঠিক থাকে (আমি অনুমান থেকে অস্পষ্ট), তবে আমি এটি আরও কিছুটা কেটে 196 এ করতে পারি:

void m(){int p=0,y=79,c;y*=Math.random();y++;p(p,y);do p((p=(c=new java.util.Scanner(System.in).next().charAt(0))<66&p%16>0?p-1:c==68&p%16<15?p+1:c>86&p>15?p-16:c==83&p<64?p+16:p),y);while(p!=y);}

এবং কিছুটা স্পষ্টতার জন্য কিছু লাইন ব্রেক সহ ...

class H{
    public static void main(String[]a){
        int p=0,y=79,c;
        y*=Math.random();
        y++;p(p,y);
        do 
            p(
                (p=(c=new java.util.Scanner(System.in).next().charAt(0))<66&p%16>0?
                    p-1:
                    c==68&p%16<15?
                        p+1:
                        c>86&p>15?
                            p-16:
                            c==83&p<64?
                                p+16:
                                p)
                ,y);
        while(p!=y);
    }

    static void p(int p,int y){
        for(int i=0;i<80;i++){
            System.out.print((i==p?'@':i==y?'"':'.')+(i%16>14?"\n":""));
        }
    }
}

নোট করুন যে আমি p(p,y)নিজেই মুদ্রণ ফাংশনটি গণনা করছি না , তবে কল স্টেটমেন্টের ভিতরে আমার স্টাফগুলি পরিবর্তিত হওয়ায় আমি এটিতে কলটি গণনা করছি

এটি মূলধনী অক্ষরের সাথে কাজ করে ASDW। এটিগুলির জন্য এটি যেভাবে পরীক্ষা করে, তার ফলে কিছু অন্যান্য চিঠিও কাজ করতে পারে তবে আমি বিভিন্ন কী টিপলে কী ঘটতে হবে সে সম্পর্কে স্পেকটি আসলেই কিছু বলেনি।


আমি নেস্টেড টার্নারি অপারেটরগুলিকে ইন্ডেন্টেশনের একই স্তরে ফর্ম্যাট করতে পছন্দ করি, কারণ আপনি যদি / অন্যথায় যদি একটি শৃঙ্খলা হন। এটি আরও পঠনযোগ্য।
লিটারোসিয়াসট

@ থমাসকওয়া হ্যাঁ, আমি এটি উভয় উপায়েই করেছি। শৃঙ্খলাবদ্ধ না হয়ে বিবৃতি যদি বাসা বাঁধার মতো হয়। এটি আমার কাছে আরও ভাল লাগছে কারণ প্রতিটি ত্রৈমাসীর উভয় অংশই একই স্তরে, তবে অন্যদের থেকে পৃথক।
জিওবিটস

যদি কোনও বেনামি ফাংশন গ্রহণযোগ্য হয় তবে আপনি নিজের উত্তরটি 192 বাইটে ছাঁটাই করতে পারেন: void m()হয়ে যায়()->
ankh-morpork

@ দোহাকাতার Y হ্যাঁ, তবে আমি কোড গল্ফের জন্য জাভার আনন ফাংশন ব্যবহার করি না। এটি নীতিগতভাবে আমার কাছে ছায়াময় বোধ করে, অন্যেরাও সে রকম বোধ করে না।
জিওবিটস

আপনি কি করতে পারেন p+=?
lirtosiast

5

জাভা, 574 বাইট

import java.util.*;public class N{static Random r=new Random();static int v,b,n,m;public static void main(String[] a){v=r.nextInt(16);b=r.nextInt(5);n=r.nextInt(16);m=r.nextInt(5);p();do{Scanner e=new Scanner(System.in);char m=e.next().charAt(0);if(m=='w')b=b>0?b-1:b;if(m=='s')b=b<5?b+1:b;if(m=='a')v=v>0?v-1:v;if(m=='d')v=v<16?v+1:v;p();}while(v!=n || b!=m);}static void p(){System.out.println();for(int y=0;y<5;y++){for(int x=0;x<16;x++){if(x==z && y==x)System.out.print('@');else if(x==n && y==m)System.out.print('"');else System.out.print('.');}System.out.println();}}}

মূলত সি # সংস্করণ হিসাবে একই, অপ্রচলিত ও ছোট করা বাদে।


তাই অনেক অপ্রয়োজনীয় স্পেস ...;)
উইল

@ আমি কেবল এটি ঠিক করছিলাম: পি
পর্ব

1
এছাড়াও, এক-বর্ণের নাম এবং তিনটি অঞ্চল ব্যবহার করুন।
lirtosiast

@ থমাসকওয়া স্থির হয়েছে: ডি
ফেজ

6
এখনও হয় অপ্রয়োজনীয় স্পেস এবং ternaries অভাব প্রচুর;)
উইল

5

জুলিয়া, 161 বাইট

ব্যবহার w, a, s, এবং dআপ যথাক্রমে সরাতে, বাম নিচে, এবং ডান।

মুদ্রণ সহ পুরো কোড (330 বাইট):

B=fill('.',5,16)
a=[rand(1:5),rand(1:16)]
B[a[1],a[2]]='"'
c=[1,a==[1,1]?2:1]
B[c[1],c[2]]='@'
for i=1:5 println(join(B[i,:]))end
while c!=a
B[c[1],c[2]]='.'
m=readline()[1]
c[2]+=m=='a'&&c[2]>1?-1:m=='d'&&c[2]<16?1:0
c[1]+=m=='w'&&c[1]>1?-1:m=='s'&&c[1]<5?1:0
m∈"wasd"&&(B[c[1],c[2]]='@')
for i=1:5 println(join(B[i,:]))end
end

স্কোরড কোড, মুদ্রণ ব্যতীত (161 বাইট):

a=[rand(1:5),rand(1:16)]
c=[1,a==[1,1]?2:1]
while c!=a
m=readline()[1]
c[2]+=m=='a'&&c[2]>1?-1:m=='d'&&c[2]<16?1:0
c[1]+=m=='w'&&c[1]>1?-1:m=='s'&&c[1]<5?1:0
end

এখানে পার্থক্য হ'ল আমরা গেমের অবস্থা ম্যাট্রিক্স হিসাবে সংরক্ষণ করি না; সমস্ত প্রাসঙ্গিক তথ্য অ্যারে থাকে cএবং a। এবং, অবশ্যই, কিছুই মুদ্রিত হয়। খেলোয়াড়ের তাবিলে পৌঁছে গেলে ব্যবহারকারীকে আর ইনপুট দেওয়ার জন্য অনুরোধ করা হবে না।


অবহেলিত + ব্যাখ্যা (সম্পূর্ণ কোড):

# Initialize a 5x16 matrix of dots
B = fill('.', 5, 16)

# Get a random location for the amulet
a = [rand(1:5), rand(1:16)]

# Put the amulet in B
B[a[1], a[2]] = '"'

# Start the player in the upper left unless the amulet is there
c = [1, a == [1,1] ? 2 : 1]

# Put the player in B
B[c[1], c[2]] = '@'

# Print the initial game state
for i = 1:5 println(join(B[i,:])) end

# Loop until the player gets the amulet
while c != a

    # Put a dot in the player's previous location
    B[c[1], c[2]] = '.'

    # Read a line from STDIN, take the first character
    m = readline()[1]

    # Move the player horizontally within the bounds
    if m == 'a' && c[2] > 1
        c[2] -= 1
    elseif m == 'd' && c[2] < 16
        c[2] += 1
    end

    # Move the player vertically within the bounds
    if m == 'w' && c[1] > 1
        c[1] -= 1
    elseif m == 's' && c[1] < 5
        c[1] += 1
    end

    # Set the player's new location in B
    if m ∈ "wasd"
        B[c[1], c[2]] = '@'
    end

    # Print the game state
    for i = 1:5 println(join(B[i,:])) end

end

আমি মনে করি এটি ঠিক আছে

3
সংক্ষিপ্ত / অপ্রচলিত সংস্করণটির জন্য +1 আমি প্রকৃত নেটহ্যাক উত্স কোডটির সাথে যা মনে করি তার সাথে খুব মিল দেখাচ্ছে।
বেন জ্যাকসন

আপনি আরও খারাপ র্যান্ডমাইজেশন ব্যবহার করে কয়েকটি বাইট সংরক্ষণ করতে পারেন:a=[rand(1:5),1] c=a+1
জুলিট

@ থমাসকওয়া: মজাটি কী তা যদি সর্বদা প্রথম লাইনে থাকে? :)
অ্যালেক্স এ 0

3

ব্যাচ, 329 বাইট

@echo off
set e=goto e
set f= set/a
%f%a=0
%f%b=0
%f%c=%random%*3/32768+1
%f%d=%random%*16/32768+1
:et
call:p %a% %b% %c% %d%
if %a%%b% EQU %c%%d% exit/b
choice/C "wasd"
goto %errorlevel%
:1
%f%a-=1
%e%
:2
%f%b-=1
%e%
:3
%f%a+=1
%e%
:4
%f%b+=1
:e
if %a% GTR 4%f%a=4
if %a% LSS 0%f%a=0
if %b% GTR 15%f%b=15
if %b% LSS 0%f%b=0
%e%t

:p
setlocal enabledelayedexpansion
::creating a new line variable for multi line strings
set NL=^


:: Two empty lines are required here
cls
set "display="
for /l %%r in (0,1,4) do (
    set "line="
    for /l %%c in (0,1,15) do (
        set "char=."
        if %3 EQU %%r (
            if %4 EQU %%c (
                set char="
            )
        )
        if %1 EQU %%r (
            if %2 EQU %%c (
                set "char=@"
            )
        )
        set "line=!line!!char!"
    )
    set "display=!display!!line!!NL!"
)
echo !display!
exit /b

এটি অত্যন্ত চিত্তাকর্ষক। আমি অবাক হয়েছি এটি করা সম্ভব।
eis

এটি আমার জন্য অন্ধকূপটি প্রদর্শন করে না, কেবল [ডাব্লু, এ, এস, ডি]? এটি "কাজ" হিসাবে প্রদর্শিত হচ্ছে - অবিসংবাদিত অন্ধকূপটি হাঁটা অবশেষে প্রস্থান করে। win7 cmd.exe
ড্যান

এটি আমার জন্য উইন 7 সেমিডি.এক্সই জন্য কাজ করে - যখন আমি ভেরি টাইপ করিMicrosoft Windows [Version 6.1.7601]
জেরি যেরেমিয়া

পছন্দ করুন এটি উইন্ডোজ 8 ( Microsoft Windows [Version 6.2.9200])
ankh-morpork

দোহ, আমি পুরো জিনিসটি অনুলিপি এবং আটকানো হয়নি, আমি উইন্ডোতে স্ক্রোল করে নি। সাবাশ.
ড্যান প্রীটস

3

পার্ল, ২২৮ ২২২ টি অক্ষর (কোডটি তৈরির সাথে অবিচ্ছেদ্য নয় এমন নিউলাইনগুলি গণনা করছে না) - 207 যদি মুদ্রণের জন্য ব্যবহৃত হয় printএবং print ifবিবৃতি অংশগুলি গণনা না করে তবে গেম যুক্তিতে যুক্ত করবেন না; 144 যদি মুদ্রণের অংশ হিসাবে ক্ষেত্রের প্রতিনিধিত্বমূলক প্রজন্মের কোড বিবেচনা করে থাকে, মন্তব্যগুলিতে ইয়াকের পরামর্শ অনুসারে)

এই কোডটি নিয়ন্ত্রণের জন্য লোয়ারকেস ওয়েড ব্যবহার করে; এন্টার দিয়ে অবশ্যই ইনপুট নিশ্চিত করতে হবে। পার্ল 5.14.2 সঙ্গে পরীক্ষিত।

($a=$==rand(79))+=($a>=($==rand(80)));
print $_=("."x80)=~s/(.{$=})./\1@/r=~s/(.{$a})./\1"/r=~s/(.{16})/\1\n/gr;
%r=qw(w s/.(.{16})@/@\1./s a s/.@/@./ s s/@(.{16})./.\1@/s d s/@./.@/);
while(/"/){print if eval $r{getc STDIN}}

নোট করুন যে এই কোডটির জন্য, গণনা এবং মুদ্রণ পৃথক করা অসম্ভব, যেহেতু ক্রিয়াকলাপগুলি নিয়মিত অভিব্যক্তি ব্যবহার করে সরাসরি মুদ্রিত উপস্থাপনায় করা হয়।

ব্যাখ্যা:

($a=$==rand(79))+=($a>=($==rand(80)));

এই লাইনটি খেলোয়াড়ের অবস্থান এবং তাবিজ নির্ধারণ করে। প্লেয়ারের অবস্থানটি নির্ধারিত হয় $==rand(80)এবং এটি বুঝতে সহজভাবে: একটি 5 5 16 বোর্ডে, সেখানে 80 টি পৃথক অবস্থান রয়েছে যেখানে প্লেয়ার হতে পারে। অবস্থানটি ভেরিয়েলেলে সংরক্ষণ করা হয় $=যা সঞ্চিত মানকে পূর্ণসংখ্যায় জোর করে; এটি সুস্পষ্টভাবে পূর্ণসংখ্যায় ফলাফলটি কাস্ট করার প্রয়োজন না হওয়ার জন্য কয়েকটি বাইট সংরক্ষণ randকরে ( একটি ভাসমান পয়েন্টের মান সরবরাহ করে)।

যেহেতু পজিশনের একটি ইতিমধ্যে প্লেয়ারের দখলে, তাবিলেটের জন্য কেবল 79৯ টি অবস্থান রয়েছে, সুতরাং তাবিজের অবস্থানের $a=$==rand(79)জন্য ব্যবহৃত হয় is আবার, অ্যাসাইনমেন্টটি $=পূর্ণসংখ্যায় রূপান্তর করার জন্য বাধ্য করে, তবে আমি প্লেয়ারের অবস্থানের জন্য $aপুনরায় $=ব্যবহার করার জন্য এটি আরও নির্ধারিত করি ।

খেলোয়াড়ের মতো একই অবস্থান দখল করার তাবিজ এড়াতে এখন যদি এটির অবস্থানটি প্লেয়ারের দখলে নেই এমন জায়গাগুলিতে অভিন্ন বিতরণ করে তবে এটির অবস্থান কমপক্ষে প্লেয়ারের মতো বড় হলে এটি এক অবস্থান দ্বারা উন্নত। এই করে এটা করা যায় $a = ($a >= $=)যেখানে $=এখানে খেলোয়াড় অবস্থান ঝুলিতে। $a$ and the onlyএই এক্সপ্রেশনটিতে প্রথম $ = `এর পরিবর্তে দুটি প্রাথমিক অ্যাসাইনমেন্ট সন্নিবেশ করে এখন প্রথম লাইনটি তৈরি করা হয়েছে ।

print $_=("."x80)=~s/(.{$=})./\1@/r=~s/(.{$a})./\1"/r=~s/(.{16})/\1\n/gr;

এটি প্রাথমিক ক্ষেত্র তৈরি করে এবং তারপরে প্রিন্টগুলি হয়। ("."x80)মাত্র 80 টি বিন্দুর একটি স্ট্রিং উত্পন্ন করে। =~s/(.{$=})./\1@/rতারপর প্রতিস্থাপন $=সঙ্গে তম অক্ষর @, এবং সঙ্গে তম অক্ষর । সংশোধকটির কারণে তারা জায়গায় পরিবর্তন করার চেষ্টা করে না, পরিবর্তিত স্ট্রিংটি ফিরিয়ে দেয়, এজন্যই তারা পূর্বের এক্সপ্রেশনগুলিতে প্রয়োগ করা যেতে পারে। অবশেষে, প্রতি 16 টি অক্ষর একটি নতুন লাইন সন্নিবেশ করান। নোট করুন যে ক্ষেত্রটি বিশেষ ভেরিয়েবলে সঞ্চিত রয়েছে যা পরবর্তী বিবৃতিগুলিতে স্পষ্টভাবে ব্যবহার করা যেতে পারে।=~s/(.{$=})./\1@/r$a"r=~s/(.{16})/\1\n/gr$_

%r=qw(w s/.(.{16})@/@\1./s a s/.@/@./ s s/@(.{16})./.\1@/s d s/@./.@/);

এটি বিভিন্ন পদক্ষেপের প্রতিস্থাপনের নিয়মযুক্ত একটি হ্যাশ তৈরি করে। এর আরও পাঠযোগ্য সংস্করণ হ'ল

%r = ( 'w' => 's/.(.{16})@/@\1./s',
       'a' => 's/.@/@./',
       's' => 's/@(.{16})./.\1@/s',
       'd' => 's/@./.@/' );

কীগুলি মুভগুলির অক্ষর এবং মানগুলি সংশ্লিষ্ট প্রতিস্থাপনের নিয়মযুক্ত স্ট্রিংগুলি হয়।

while(/"/){print if eval"\$_=~$r{getc STDIN}"}

এটি প্রধান লুপ। (যদি ক্ষেত্রের) তে while(/"/)কোনও "চরিত্র এখনও আছে কিনা তা পরীক্ষা করে $_। যদি আমরা তাবিলে চলে যাই তবে এর চরিত্রটি প্লেয়ারের চরিত্রের সাথে প্রতিস্থাপিত হয় তাই এটি মাঠ থেকে অদৃশ্য হয়ে যায়।

eval $r{getc STDIN}স্ট্যান্ডার্ড ইনপুট থেকে একটি অক্ষর পড়ে, হ্যাজ থেকে সম্পর্কিত প্রতিস্থাপনের নিয়মটি সন্ধান করে এবং এটি %rক্ষেত্রের ক্ষেত্রে প্রয়োগ করে $_। এই সত্য মূল্যায়ণ যদি একটি প্রতিস্থাপন আসলে তৈরি করা হয়েছিল (যেমন, কী হ্যাশ পাওয়া যায় এবং পদক্ষেপ সম্ভব ছিল; একটি অসম্ভব পদক্ষেপ প্রতিস্থাপন নিয়মে মেলে না হবে)। যে ক্ষেত্রে printমৃত্যুদন্ড কার্যকর করা হয়। যেহেতু এটি যুক্তি ছাড়াই ডাকা হয়, এটি মুদ্রিত $_হয়, যা পরিবর্তিত ক্ষেত্র।


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

@ ডেনিস: মুদ্রণের অংশের জন্য, আমি এখন যে ব্যাখ্যাটি যুক্ত করেছি তা দেখুন: আপনি আমার কোডটিতে অর্থবহুলভাবে মুদ্রণ ও মূল্যায়ন আলাদা করতে পারবেন না। আপনার পরামর্শ অনুসারে আমি এখন গণনা পরিবর্তন করেছি।
celtschk

আপনার মুদ্রণ কোডে কোনও রাজ্যের পরিবর্তন আছে? কোন? ভাল, আমার মতে, আপনার যুক্তির জন্য আপনার প্রিন্টিং কোডের আউটপুট পুনরায় ব্যবহার করা আপনাকে দন্ডিত করা উচিত নয়। মুভমেন্ট কোড (যা স্বতন্ত্র!) গণনা করা উচিত, তবে "ডিসপ্লে স্ট্রিং" উত্পন্ন কোডটি গণনা করা উচিত নয়।
ইয়াক্ক

@ ইয়াক্ক: আপনি আমার কোডের কোন অংশটি মুদ্রণ কোড বিবেচনা করেন? (আসলে আমার মতে প্রিন্টিং
কোডকে

@ এসএলটস্ক্ক ("."x80)=~s/(.{$=})./\1@/r=~s/(.{$a})./\1"/r=~s/(.{16})/\1\n/grপ্রথম নজরে বেশ কাছাকাছি, তবে আমার পার্ল-ফু কয়েক বছরের মরিচা। আমি সেখানে একটি রাষ্ট্রীয় পরিবর্তন মিস করতে পারে।
ইয়াক্ক

2

সি #, 256 248 234 227 226 225 বাইট

নুমলক দিয়ে নুমপ্যাড তীরগুলি সরানোতে চালিত করে।

স্বচ্ছতার জন্য অভিযুক্ত এবং মন্তব্য করা হয়েছে:

using System;
class P{
    static void Main(){
        int a=0,b=0,c,d,e;
        var r=new Random();
        while(0<((c=r.Next(16))&(d=r.Next(5))));
        Draw(a,b,c,d); // Excluded from the score.
        while(a!=c|b!=d){
            e=Console.ReadKey().KeyChar-48;
            a+=e==4&a>0?-1:e==6&a<15?1:0;
            b+=e==8&b>0?-1:e==2&b<4?1:0;
            Draw(a,b,c,d); // Excluded from the score.
        }
    }
    // The following method is excluded from the score.
    static void Draw(int a, int b, int c, int d){
        Console.Clear();
        for (int y = 0; y < 5; y++)
        {
            for (int x = 0; x < 16; x++)
            {
                Console.Write(
                    x == a && y == b ? '@' :
                    x == c && y == d ? '"' :
                                       '.'
                );
            }
            Console.WriteLine();
        }
    }
}

1
আমি মনে করি সি # ইনটস স্পষ্টতই শূন্যের সূচনা করে। এছাড়াও (এই মুহুর্তে পরীক্ষা করতে পারবেন না) যদি কাস্টিং কোনও সমস্যা না হয় তবে আপনি অক্ষরের অক্ষরগুলিকে ইনটগুলিতে রূপান্তর করতে পারেন, বা কমপক্ষে 'এ' তে 97 (আমার মনে হয়) অন্য তিনটি সংখ্যা হলেও।

কেবল শ্রেণিকক্ষগুলি ডিফল্টরূপে সূচনা করা হয় এবং এ ক্ষেত্রে এগুলি স্থিতিশীল হিসাবে ঘোষণা করা দরকার। প্রথম ব্যবহারের আগে পদ্ধতি ভেরিয়েবলগুলি অবশ্যই আরম্ভ করা উচিত। এতে কম অক্ষর লাগে: 4 বনাম 7.
হ্যান্ড-ই-ফুড

অন্তর্নিহিতভাবে চর কাস্টিংয়ের টিপসটির জন্য @ টলোসকে ধন্যবাদ! আরও ভাল, যদি আমি কনসোলকি এনাম কাস্টটি ইনট হিসাবে ব্যবহার করি তবে আমি ২-সংখ্যার মান ব্যবহার করতে পারি।
হ্যান্ড-ই-ফুড

প্রযুক্তিগতভাবে, Mainপদ্ধতিটি কল করতে হবে না Main, যাতে আপনি আরও তিনটি অক্ষর শেভ করতে পারেন।
লুয়ান

@ লুয়ান, আমি মনে করি আপনি ভুল হয়ে গেছেন। সি # ডকুমেন্টেশন: এমএসডিএন.মাইক্রোসফটকম /en-us/library/acy3edy3.aspx
হ্যান্ড-ই-ফুড

2

এইচটিএমএল + জাভাস্ক্রিপ্ট (ES6), স্কোর সম্ভবত 217

খুব নীচু, তবে নীচের স্নিপকেটে অনলাইনে প্লেযোগ্য।

লাইন ((টি। মূল্য ...) আউটপুট জন্য এবং গণনা করা হয় না (তবে সরলতার জন্য আমি টেক্সারিটি খোলা এবং বন্ধ ট্যাগগুলি গণনা করি, এমনকি যদি এটি আউটপুটও হয় তবে)

এলোমেলোভাবে হিসাবে: তাবিজ সর্বদা গ্রিডের ডান অর্ধে থাকে এবং প্লেয়ারটি সর্বদা বাম অর্ধে শুরু হয়।

গেমটি শুরু এবং পুনরায় চালু করতে পাঠ্যআরিয়াতে (এটি প্রসারিত করার পরে) ক্লিক করুন।

<textarea id=T onclick='s()' onkeyup='m(event.keyCode)'></textarea>
<script>
R=n=>Math.random()*n|0,
s=e=>m(y=R(5),x=R(8),a=R(5)*17+R(8)+8),
m=k=>(x+=(x<15&k==39)-(x>0&k==37),y+=(y<4&k==40)-(y>0&k==38),p=y*17+x,
T.value=p-a?(t=[...('.'.repeat(16)+'\n').repeat(5)],t[a]='X',t[p]='@',t.join('')):t='Well done!'
)
</script>

ইকামাস্ক্রিপ্ট 6 স্নিপেট (কেবলমাত্র ফায়ারফক্স)

R=n=>Math.random()*n|0
s=e=>m(y=R(5),x=R(8),a=R(5)*17+R(8)+8)
m=k=>(
  x+=(x<15&k==39)-(x>0&k==37),
  y+=(y<4&k==40)-(y>0&k==38),
  p=y*17+x,
  T.value=p-a?(t=[...('.'.repeat(16)+'\n').repeat(5)],t[a]='"',t[p]='@',t.join('')):t='Well done!'
)
<textarea id=T onclick='s()' onkeyup='m(event.keyCode)'></textarea>

ইকামাস্ক্রিপ্ট 5 স্নিপেট (ক্রোমে পরীক্ষিত)

function R(n) { return Math.random()*n|0 }

function s() { m(y=R(5),x=R(8),a=R(5)*17+R(8)+8) }

function m(k) {
  x+=(x<15&k==39)-(x>0&k==37)
  y+=(y<4&k==40)-(y>0&k==38)
  p=y*17+x
  T.value=p-a?(t=('.'.repeat(16)+'\n').repeat(5).split(''),t[a]='"',t[p]='@',t.join('')):t='Well done!'
}
<textarea id=T onclick='s()' onkeyup='m(event.keyCode)'></textarea>


2

অ্যাকশন স্ক্রিপ্ট 3: 267 বাইট

একটি কাজের উদাহরণ অনলাইন

var a:int,p:int,t;function g(){var r=Math.random;while(p==a){a=r()*80;p=r()*80}addEventListener("keyDown",function(e){if(a==p)return;if(e.keyCode==87&&p>15)p-=16if(e.keyCode==83&&p<64)p+=16if(e.keyCode==65&&p%16>0)p--if(e.keyCode==68&&(p+1)%16>0)p++print()});print()}

গেম ফাংশনটি ব্যবহার করে এখানে একটি সম্পূর্ণ (পঠনযোগ্যতার জন্য শ্বেতস্থান) প্রোগ্রাম রয়েছে:

package
{
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.text.TextFormat;

    public class MiniRogue extends Sprite
    {
        var a:int, p:int, t;

        public function MiniRogue()
        {
            g();
        }

        function g(){
            var r=Math.random;
            while(p==a){
                a=r()*80;
                p=r()*80
            }
            addEventListener("keyDown",function(e){
                if(a==p)
                    return;
                if(e.keyCode==87&&p>15)
                    p-=16
                if(e.keyCode==83&&p<64)
                    p+=16
                if(e.keyCode==65&&p%16>0)
                    p--
                if(e.keyCode==68&&(p+1)%16>0)
                p++
                print()
            });
            print()
        }

        var old:int = -1;
        private function print():void {
            if (!t) {
                t = new TextField()
                t.defaultTextFormat = new TextFormat("_typewriter", 8)
                t.width=500;
                t.height=375;
                addChild(t)
            }
            var board:String = "";
            for (var i:int=0; i<80;i++) {
                if (i == p) {
                    board += "@";
                } else if (i == a) {
                    board += '"';
                } else {
                    board += ".";
                }
                if ((i + 1) % 16 == 0) {
                    board += "\n";
                }
            }
            if (a==p) {
                board += "Win!";
            }
            if (p == old) {
                board += "Bump!";
            }
            old = p;
            t.text = board;
        }
    }
}

2

জাভাস্ক্রিপ্ট: 307 216

আপনি নীচে স্নিপেটে খেলতে পারেন! বাম দিকে সংখ্যাগুলি ঠিক তাই কনসোল (কমপক্ষে এক ক্রোম) সারিগুলিকে একীভূত করে না।

কোড চালাতে:

  1. "রান কোড স্নিপেট" চাপুন
  2. কনসোলটি খুলতে ctrl-shift-j চাপুন
  3. ফলাফল বিভাগে ক্লিক করুন
  4. তীর কী এবং খেলুন

var x=y=2,m=Math,b=m.floor(m.random()*5),a=14,i,j,t,c=console,onload=d;function d(){c.clear();for(i=0;i<5;i++){t=i;for(j=0;j<16;j++){t+=(i==y&&j==x)?"@":(i==b&&j==a)?'"':".";if(a==x&&b==y)t=":)";}c.log(t);}}onkeydown=function(){switch(window.event.keyCode){case 37:if(x>0)x--;break;case 38:if(y>0)y--;break;case 39:if(x<15)x++;break;case 40:if(y<4)y++;break;}d();};

আন golfed:

var px=py=2,m=Math,ay=m.floor(m.random()*5),ax=14,i,j,t,c=console,onload=draw;
function draw() {
  c.clear();
  for(i=0;i<5;i++) {
    t=i;
    for(j=0;j<16;j++) {
      t+=(i==py&&j==px)?"@":
         (i==ay&&j==ax)?'"':".";
      if(ax==px&&ay==py)t=":)";
    }
    c.log(t);
  }
}
onkeydown=function() {
  switch (window.event.keyCode) {
    case 37:
      if(px>0)px--;
      break;
    case 38:
      if(py>0)py--;
      break;
    case 39:
      if(px<15)px++;
      break;
    case 40:
      if(py<4)py++;
      break;
  }
  draw();
};

সম্পাদনা 1: নিয়মগুলি আরও সাবধানতার সাথে পড়ুন এবং সেই অনুযায়ী আমার কোডটি পুনরায় লিখুন

  • তাবিজ y মান এখন এলোমেলো করে দেওয়া হয়েছে
  • প্লেয়ার আর ঘর থেকে বাঁচতে পারবেন না
  • আমি আর আঁকার ক্রিয়াতে অক্ষরগুলি গণনা করি না বা এটিতে কল করি

1

স্পেসবিএএস - 428 402 (মুদ্রণ ব্যতীত, 466 425 গণনা করা হলে)

যথাক্রমে উপরে / নিচে / বাম / ডান দিকে সরে যেতে Q / A / O / P ব্যবহার করে।

লাইন 1 এ অন্ধকূপটি মুদ্রণের জন্য লাইনটি একমাত্র লাইন যা উপেক্ষা করা যেতে পারে, তবে এটি কিছুটা নীচেও গল্ফ করেছে।

1 PRINT ("."*16+#13)*5
2 LET px=8: LET py=3
3 LET ax=INT(RND*16): LET ay=INT(RND*5): IF ax=px AND ay=py THEN GO TO 3
4 PRINT AT ay,ax;#34;AT py,px;"@": LET ox=px: LET oy=py: PAUSE 0: LET k$=INKEY$
5 LET px=px+(k$="p")-(k$="o")
6 IF px<0 THEN LET px=0
7 IF px>15 THEN LET px=15
8 LET py=py+(k$="a")-(k$="q")
9 IF py<0 THEN LET py=0
10 IF py>4 THEN LET py=4
11 PRINT AT oy,ox;"."
12 IF SCREEN$(px,py)<>#34 THEN GO TO 4

# 34 এর রেফারেন্সটি কোডে CHR $ (34) লাগানোর একটি স্বল্প হাতের উপায়।

ধন্যবাদ @ থমাস কোয়া, আমি খেয়াল করিনি খেলোয়াড় শুরুর অবস্থানটি এলোমেলোভাবে হওয়া .চ্ছিক। কয়েকটি অক্ষর শেভ করতে পৃথক পৃথক আইএফ স্টেটমেন্টও ব্যবহার করেছেন।


আপনি কম ভাল এলোমেলো করে কিছু অক্ষর সংরক্ষণ করতে সক্ষম হতে পারে: 2 LET px=1: LET py=1: LET ax=2: LET ay=INT(RND*5)এবং এছাড়াও ব্যবহার করে IF instead of ELSE IF
lirtosiast

1

অন্য সি #, 221 171 170

উভয় অবস্থান এলোমেলোভাবে এখানে সি # তে অন্য একটি উপায়। এই অংশটি হ্যান্ড-ই-ফুডের সমাধানের চেয়ে 7 বাইট দীর্ঘ হলেও এটি দেখাতে চেয়েছিল।
তিনি কনসোল ব্যবহার করার সাথে সাথে হ্যান্ড-ই-ফুডের উত্তর অবশ্যই ছোট হবে।
কনসোলের পড়ুন.আর পড়ুন, প্রয়োজনীয় এন্টার টিপলে ক্ষেত্রটি আরও 2 বার মুদ্রিত হবে।
তবে আমি মনে করি না যে কেবল (বাস্তব) ইনপুট প্রিন্ট করার প্রয়োজন আছে।

হ্যান্ড-ই-ফুডস সমাধান হিসাবে 8426 দ্বারা নেভিগেশন করা হয়েছে।

using System;
class P
{
static void Main()
{
Func<int> n=new Random().Next;
int x=n()%16,y=n()%5,a=n()%16,b,m;
while(y==(b=n()%5));

while(x!=a|y!=b)
{
Printer.Print(a, b, x, y);  // Excluded from the score.
m=Console.Read()-48;
y+=m==8&y>0?-1:m==2&y<4?1:0;
x+=m==4&x>0?-1:m==6&x<15?1:0;
}
}
}


সম্পাদনা: (নতুন সমাধান যুক্ত হয়েছে এবং প্রিন্টারক্লাসটি প্রান্তে সরানো হয়েছে) সম্পাদনা 2
: (একটি 14 কে 15 এ পরিবর্তন করে বাইটটি ডান-নীচে শুরু করে সংরক্ষণ করেছে)

মৌরিসের কৌশলটি মানিয়ে নেওয়া এটি সি # তে 171 বাইটে গলে যাওয়া সম্ভব is (অবশ্যই এখন উভয় অবস্থান এলোমেলো):

using System;
class P
{
static void Main()
{
int p=79,a=new Random().Next()%p,m;
while(p!=a){
Printer.Print(p,a);  // Excluded from the score.
m=Console.Read()-48;
p+=m==4&p/5>0?-5:m==6&p/5<15?5:m==8&p%5>0?-1:m==2&p%5<4?1:0;
}
}
}

প্রিন্টার ক্লাস প্রায় একই, মুদ্রণের মাত্র একটি নতুন ওভারলোড ...

class Printer
{
    public static void Print(int ax, int ay, int px, int py)
    {
        Console.Write('\n');
        for (int y = 0; y < 5; y++)
        {
            for (int x = 0; x < 16; x++)
            {
                if (x == px && y == py)
                    Console.Write('@');
                else if (x == ax && y == ay)
                    Console.Write('"');
                else
                    Console.Write('.');
            }
            Console.Write('\n');
        }
    }

    public static void Print(int p, int a)
    {
        Print(p/5,p%5,a/5,a%5);
    }
}

1

রুবি, 185

এখানেও একটি রুবির উদাহরণ।
আমি রুবির কাছে খুব নতুন, সম্ভবত কেউ আরও ভালভাবে কীভাবে করতে হয় তা জানেন :)

প্রোগ্রামটি অন্যথায় ক্রাশ হওয়ার পরে আমি লাইনফিডগুলি 1 হিসাবে গণনা করেছি ...

নেভিগেশন 8462 দ্বারা সম্পন্ন হয় You এন্টার সহ আপনাকে প্রতিবার ইনপুট প্রেরণ করতে হবে।

def display(ax,ay,px,py)
    puts
    for y in 0..4
        for x in 0..15
            if (x == px && y == py)
                print "@"
            elsif (x == ax && y == ay)
                print '"'
            else
                print '.'
            end
        end
        puts
    end
end


x=y=0
a=Random.rand(16) while y==(b=Random.rand(5))
while x!=a or y!=b
display(a,b,x,y)  # Excluded from the score.
m=gets.chomp.to_i
y-=m==8?1:0 if y>0
y+=m==2?1:0 if y<4
x-=m==4?1:0 if x>0
x+=m==6?1:0 if x<15
end

0

কিউব্যাসিক, 103 বাইট

চ্যালেঞ্জের নিয়ম অনুসারে, Showসাবপ্রগ্রামটি বাইট-কাউন্টে অন্তর্ভুক্ত নয় , বা কলটিও নেই Show p, q, a, b(নিম্নলিখিত নিউলাইন সহ)।

b=1+TIMER MOD 9
1Show p, q, a, b
INPUT m
p=p-(m=2)*(p>0)+(m=4)*(p<4)
q=q-(m=1)*(q>0)+(m=3)*(q<15)
IF(p<>a)+(q<>b)GOTO 1


SUB Show (playerRow, playerCol, amuletRow, amuletCol)
CLS
FOR row = 0 TO 4
  FOR col = 0 TO 15
    IF row = playerRow AND col = playerCol THEN
      PRINT "@";
    ELSEIF row = amuletRow AND col = amuletCol THEN
      PRINT CHR$(34);    ' Double quote mark
    ELSE
      PRINT ".";
    END IF
  NEXT
  PRINT
NEXT
END SUB

সরানোর জন্য, একটি নম্বর ইনপুট করুন এবং এন্টার টিপুন: 1বাম 2দিকে যেতে, উপরে 3যেতে, ডানদিকে যেতে এবং 4নীচে যেতে।

এই কোডটি গেমের শেষের দিকে আউটপুট দেয় না, যখন প্লেয়ার তাবিজটি খুঁজে পেয়ে যায়। এটি করার জন্য, বিবৃতিটির Show p, q, a, bপরে আরও একটি যুক্ত করুন IF

ব্যাখ্যা

যাক a, bমাদুলি স্থানাঙ্ক এবং প্রতিনিধিত্ব p, qপ্লেয়ারের স্থানাঙ্ক। প্লেয়ারটি (0, 0) থেকে শুরু হয় এবং তাবিজ সারি 0 থেকে শুরু হয়, বর্তমান সময়ের 1 এর অঙ্কের ভিত্তিতে 1 এবং 9 এর মধ্যে একটি কলাম সহ অন্তর্ভুক্ত।

বাকিটি শর্তসাপেক্ষে গণিতের একগুচ্ছ। গুরুত্বপূর্ণ বিষয়টি মনে রাখতে হবে যে কিউ বেসিকের শর্তাবলীর সত্য 0মিথ্যা, প্রত্যাবর্তনের জন্য return -1আসুন প্লেয়ার সারি আপডেট স্টেটমেন্টটি দেখুন:

p=p-(m=2)*(p>0)+(m=4)*(p<4)

যদি m=2, আমরা pযতক্ষণ পর্যন্ত 1 টি বিয়োগ করে উপরে উঠতে চাই p>0। একইভাবে, যদি m=4, আমরা pযতক্ষণ তত 1 যোগ করে নীচে নামতে চাই p<4। আমরা গুণমান দ্বারা পছন্দসই আচরণ পেতে পারি। উভয় কারণ যদি হয় তবে -1তাদের পণ্যটি হবে 1, যা আমরা বিয়োগ করতে বা যোগ করতে পারি p। যদি উভয় শর্তাধীন হয় 0তবে পণ্যটি 0কার্যকর হবে।

একইভাবে, খেলোয়াড় তাবিজ খুঁজে পেয়েছে কিনা তা নির্ধারণের শর্তটি:

IF(p<>a)+(q<>b)GOTO 1

শর্তগুলির মধ্যে যদি দুটিই সত্য হয় তবে তাদের যোগফলটি ননজারো (হয় -1বা হয় -2) হবে এবং এভাবে সত্য হবে এবং প্রোগ্রামটি প্রথম সারিতে ফিরে যাবে 1. একবার pসমান aএবং qসমান হয়ে গেলে bউভয় শর্ত থাকবে 0, সুতরাং তাদের যোগফল হবে 0এবং নিয়ন্ত্রণ প্রবাহ পৌঁছতে পারে প্রোগ্রাম শেষ।

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