চ্যাম্পিয়ন হন


11

শিরাসমূহের কম্পন-কম্পন Tac-ল্যাটিন!

এটি একটি সত্য গল্প, সুতরাং নাম পরিবর্তন করা হয়েছে।

আমার ল্যাটিন শিক্ষক মিঃ ল্যাটিন তার নিজস্ব মালিকানা তৈরি করেছেন (কোনও রসিকতা নেই) টিক টাক টো ভেরিয়েন্ট। একে একে টিক-ট্যাক-ল্যাটিন বলি। গেমটি সহজ, এটি মূলত চার বাই চারটি গ্রিডে টিক টাক খেল played

আনুষ্ঠানিক বিধি ঘোষণা

একটি লাইন হয় একটি সারি, কলাম বা একটি তির্যক। 'এক্স' এবং 'ও' দুটি চিহ্ন রয়েছে, তবে একটি বা উভয়ই পৃথক চিহ্নের জন্য প্রতিস্থাপিত হতে পারে।
যখন আপনার কাছে তিনটি চিহ্ন এবং অন্য একটি চরিত্র থাকে তখন আপনি একটি পয়েন্ট অর্জন করেন।

এই ব্যবস্থা স্কোর:

--- হে
-O--
XXXO
XOOX

ও- এক্সএক্স
-  -
- এক্স -
--- 

এগুলি স্কোর করে না:

----
XXXX এর
----
উহ

----
XXX-
----
OOO-

যখনই একজন খেলোয়াড়ের আরও পয়েন্ট থাকে তখন গেমটি জয়ী হয়। বোর্ডটি পূর্ণ হলেই গেমটি ড্র।

চ্যালেঞ্জ

এই গেমটি সমাধান করুন। আপনার কাজটি হ'ল জয় বা টাইয়ের গ্যারান্টি দেওয়ার একটি উপায় সরবরাহ করা, যার মধ্যে সর্বোত্তম ফলাফল।

আপনার সমাধানটি প্রথম বা দ্বিতীয়টি শুরু করতে বেছে নিতে পারে (এবং তাই এটি প্রতীকটি চয়ন করতে পারে)। কোনও ইন্টারেক্টিভ গেমটি প্রয়োগ করা বাধ্যতামূলক নয় যেখানে ব্যবহারকারীর ইনপুটগুলি চলে এবং সেই সাথে সম্পর্কিত প্রদর্শন পরিবর্তন হয়। এটি কোনও ফাংশন বা প্রোগ্রামও হতে পারে যা গেম স্টেট হিসাবে ইনপুট নেয় এবং একটি নতুন বোর্ড বা তাদের পদক্ষেপের বর্ণনা আউটপুট দেয় । যে কোনও বিকল্পটি চলতে চলতে প্রায় দশ সেকেন্ডের মধ্যে চলতে হবে।


আপনার প্লেয়ারকে কোনও চলমান ক্রমের বিপরীতে খেললে অবশ্যই সেরা ফলাফল দেওয়া উচিত। এর অর্থ হ'ল আপনি ধরে নিতে পারেন যে ইনপুট অবস্থানটি এটি আপনার প্লেয়ারের সাথে খেলতে পারা যায়। দাখিলিগুলি অবশ্যই সংজ্ঞাবহ হতে হবে এবং প্রয়োজনীয়তার প্রমাণ সরবরাহ করার প্রয়োজন নেই, তবে তারা যদি ফাটল ধরে (মারধর করে) তবে আপনার জমাগুলি অবৈধ বলে বিবেচিত হবে (আপনি এটিকে ছেড়ে দিতে পারেন, তবে শিরোনামটিতে যোগ করুন)
এটি একটি তুচ্ছ-তাত্পর্যপূর্ণ কাজ, সুতরাং যে কোনও বৈধ জমাটি চিত্তাকর্ষক এবং এটি একটি গৃহীত টিকের জন্য উপযুক্ত তবে আমি কোড গল্ফকে প্রাথমিক বিজয়ী মানদণ্ডে পরিণত করব।

একজন বিজয়ী নির্বাচিত না হওয়া পর্যন্ত এই তালিকায় নামিয়ে বিজয়ীকে বেছে নেওয়া হয়।

  • সংক্ষিপ্ততর সমাধানযোগ্য প্রয়োগ যা সর্বদা জিতে যায়
  • স্বল্পতম বাস্তবায়ন

1
"প্রথমে খেলার মানের দিকে নজর দেওয়া হয়" আপনার কি মনে হয় না এটি সাবজেক্টিভ?
user48538

খেলতে ইন্টারফেস সরবরাহ করার কাজটি নিখুঁত খেলোয়াড় লেখার জন্য পেরিফেরিয়াল বলে মনে হয়। আমি কেবলমাত্র বর্তমান গেমের স্টেটটি ইনপুট হিসাবে পাস করার এবং কোডটিকে একটি বিজয়ী পদক্ষেপের আউটপুট দেওয়ার প্রয়োজন বলে মনে করতাম, এমনকি নিখুঁত খেলার অধীনে একটি মূল্যায়ন (জয়, ড্র, হারাতে)।
xnor

1
একটি অকার্যকর ব্রুট ফোর্স অনুসন্ধানের মাধ্যমে একটি সমাধান গোল্ফ করা যায়। কোড খুব ধীরে চললে আপনি কি ঠিক আছেন?
xnor

1
" আপনি যদি স্কোর করেন এবং প্রক্রিয়াটি আপনার প্রতিপক্ষের পক্ষে স্কোর না করেন তবে আপনি এই খেলাটি জিতেন " "এর অর্থ কি এই নয় যে আমি যখন কেবল কোনও টুকরো রাখি তখনই জিততে পারি, যখন আমার প্রতিপক্ষের হয় না? যদি কোনও পদক্ষেপ উভয় খেলোয়াড়ের জন্য জয়ের লাইন তৈরি করে: গেমটি আঁকানো বা চালানো হয় তবে কী হবে?
পিটার টেলর

1
@ রোহানঝুনঝুনওয়ালা আপনার খেলা গেমের অনুমতিপ্রাপ্ত ইনপুটটি স্পষ্ট করা উচিত, অন্যথায় এটি সম্ভব যে লোকেরা বর্তমানে অপরিবর্তিত ইনপুট ফর্ম্যাটের সুযোগ নিতে পারে এবং এমন ফর্ম্যাট বেছে নিতে পারে যা তাদের সমাধানকে অনেকটা সহায়তা করে।
ASCII- কেবল

উত্তর:


6

পার্ল, 147 বাইট (প্রতিযোগিতামূলক নয়, প্রতি চালের চেয়ে 10 সেকেন্ডের বেশি সময় নেয়)

জন্য +4 অন্তর্ভুক্ত -0p

প্রোগ্রামটি বাজায় X। এটি একটি নিখুঁত খেলা খেলবে।

এসটিডিনে বোর্ডটি ইনপুট করুন, যেমন:

tictaclatin.pl
-X-O
-X--
X-X-
O--O
^D

আউটপুটটি একই বোর্ডে Xপ্রতিস্থাপিত Oএবং তদ্বিপরীতগুলির সাথে একই হবে । খালি দাগগুলি এমন একটি সংখ্যার সাথে পূরণ করা হবে যাতে এক্সটি সেখানে খেললে 1ফলাফলটি বোঝায়, ফলাফলটি একটি জয়, 2একটি ড্র এবং 3হারাতে হবে। একটি সমাপ্ত খেলা কেবল উল্টো রঙের সাথে একই অবস্থানে ফিরে আসে।

এই উদাহরণে আউটপুট হবে:

1O1X
1O33
O3O3
X33X

সুতরাং পজিশনের একটি জয় Xযদি তিনি উপরের এবং বাম দিকে 3 স্পটে খেলেন। অন্য সমস্ত পদক্ষেপ হেরে যায়।

এই বিভ্রান্তিকর আউটপুটটি আসলে সুবিধাজনক যদি আপনি জানতে চান কীভাবে চলাফেরার পরে গেমটি অব্যাহত থাকে। যেহেতু কোন কর্মসূচি মানেই খেলে Xআপনি অদলবদল করতে হবে Xএবং Oএর জন্য প্যাচসমূহ দেখতে O। এখানে উদাহরণস্বরূপ এটি বেশ পরিষ্কার যে Xউপরের বামে খেলে জয়লাভ করে, তবে শীর্ষে Xতৃতীয় অবস্থানে খেললে কী হবে ? কেবলমাত্র আউটপুট অনুলিপি করুন, Oআপনি যে পদক্ষেপটি নির্বাচন করেছেন তার জায়গায় একটি জায়গা রেখে দিন এবং অন্য সমস্ত সংখ্যাগুলি -আবার প্রতিস্থাপন করুন , সুতরাং এখানে:

-OOX
-O--
O-O-
X--X

ফলাফল এতে:

3XXO
3X33
X3X3
O33O

স্পষ্টতই প্রতিটি পদক্ষেপ Oহারাতে হবে, তাই যদি তিনি উপরের বামে খেলেন তবে কীভাবে হারাবেন? আবার Oউপরের বামে রেখে এবং অঙ্কগুলি প্রতিস্থাপন করে এটি করুন -:

OXXO
-X--
X-X-
O--O

প্রদান:

XOOX
1O33
O3O3
X33X

সুতরাং এক্সের কাছে তার জয়ের একটাই উপায় রয়েছে:

XOOX
OO--
O-O-
X--X

দান

OXXO
XX33
X3X3
O33O

এর জন্য পরিস্থিতি Oহতাশ remains এখনই সহজে দেখা যায় যে প্রতিটি পদক্ষেপ Xতাত্ক্ষণিকভাবে জিততে দেয়। আসুন কমপক্ষে একটানা 3 টি এর জন্য যাওয়ার চেষ্টা করুন:

OXXO
XX--
X-X-
O-OO

প্রদান:

XOOX
OO13
O3O3
X3XX

Xএকমাত্র বিজয়ী পদক্ষেপ খেলে (লক্ষ্য করুন XXXOএটি তৃতীয় কলামটি জুড়ে তোলে :

XOOX
OOO-
O-O-
X-XX

এখানে আউটপুট হয়:

OXXO
XXX-
X-X-
O-OO

কারণ খেলাটি ইতিমধ্যে শেষ হয়ে গেছে। আপনি তৃতীয় কলামে জয় দেখতে পাবেন।

আসল প্রোগ্রাম tictaclatin.pl:

#!/usr/bin/perl -0p
y/XO/OX/,$@=-$@while$|-=/(@{[map{(O.".{$_}O"x3)=~s%O%Z|$`X$'|Z%gr}0,3..5]})(?{$@++})^|$/sx;$@<=>0||s%-%$_="$`O$'";$$_||=2+do$0%eg&&(/1/||/2/-1)

খালি বোর্ডে প্রয়োগ করা এটি 9506699 পজিশনের মূল্যায়ন করে যা আমার কম্পিউটারে 30 জিবি এবং 41 মিনিট সময় নেয়। ফলাফল হলো:

2222
2222
2222
2222

সুতরাং প্রতিটি শুরু করার পদক্ষেপ অঙ্কন করে। সুতরাং খেলা একটি ড্র।

চরম স্মৃতি ব্যবহার বেশিরভাগ ক্ষেত্রে পুনরাবৃত্তি ব্যবহারের কারণে ঘটে do$0। প্লেইন ফাংশনটি ব্যবহার করে এই 154 বাইট সংস্করণটি ব্যবহার করতে 3 জিবি এবং 11 মিনিটের প্রয়োজন:

#!/usr/bin/perl -0p
sub f{y/XO/OX/,$@=-$@while$|-=/(@{[map{(O.".{$_}O"x3)=~s%O%Z|$`X$'|Z%gr}0,3..5]})(?{$@++})^|$/sx;$@<=>0||s%-%$_="$`O$'";$$_||=2+&f%eeg&&(/1/||/2/-1)}f

যা আরও সহনীয় (তবে এখনও অনেক বেশি কিছু অবশ্যই স্মৃতি ফাঁস হতে পারে)।

বেশ কয়েকটি স্পিডআপের সংমিশ্রণটি এই 160 বাইট সংস্করণে (5028168 পজিশন, 4 মিনিট এবং 800 এম শূন্য বোর্ডের জন্য) বাড়ে:

#!/usr/bin/perl -0p
sub f{y/XO/OX/,$@=-$@while$|-=/(@{[map{(O.".{$_}O"x3)=~s%O%Z|$`X$'|Z%gr}0,3..5]})(?{$@++})^|$/osx;$@<=>0||s%-%$_="$`O$'";$a{$_}//=&f+1or return 1%eeg&&/1/-1}f

এই শেষটি 0একটি জয়ের জন্য ব্যবহার করে (বিভ্রান্ত করবেন না O), 1ড্র এবং 2হারের জন্য। এটির আউটপুটটি আরও বিভ্রান্তিকর। এটি রঙের অদলবদল ছাড়াই জয়ের ক্ষেত্রে এক্সের জন্য বিজয়ী পদক্ষেপে পূরণ করে, তবে যদি ইনপুট গেমটি ইতিমধ্যে জিতে থাকে তবে এটি রঙের অদলবদল করে এবং কোনও পদক্ষেপ পূরণ করে না।

বোর্ডের ভরাট হওয়ার সাথে সাথে সমস্ত সংস্করণ অবশ্যই দ্রুততর হয় এবং কম মেমরি ব্যবহার করে। দ্রুত সংস্করণগুলি 2 বা 3 পদক্ষেপগুলি করা মাত্র 10 সেকেন্ডের মধ্যে একটি পদক্ষেপ তৈরি করবে।

নীতিগতভাবে এই 146 বাইট সংস্করণেও কাজ করা উচিত:

#!/usr/bin/perl -0p
y/XO/OX/,$@=-$@while/(@{[map{(O.".{$_}O"x3)=~s%O%Z|$`X$'|Z%gr}0,3..5]})(?{$@++})^/sx,--$|;$@<=>0||s%-%$_="$`O$'";$$_||=2+do$0%eg&&(/1/||/2/-1)

তবে আমার মেশিনে এটি পার্ল বাগ এবং ডাম্পস কোরকে ট্রিগার করে।

সমস্ত সংস্করণ নীতিগতভাবে এখনও কাজ করবে যদি 6 বাইট অবস্থানের ক্যাশে করা ক্যাচিং $$_||=সরানো হয় তবে এতে এত সময় এবং মেমরি ব্যবহার হয় যে এটি কেবল প্রায় ভরাট বোর্ডগুলির জন্যই কাজ করে। তবে তত্ত্বের ক্ষেত্রে আমার কমপক্ষে একটি 140 বাইট সমাধান রয়েছে।

আপনি করা তাহলে $\=ঠিক আগে: (3 বাইট খরচ) $@<=>0তাহলে প্রতিটি আউটপুট বোর্ড পুরো বোর্ড অবস্থা দ্বারা অনুসরণ করা হবে 1জন্য Xজয়ী, 0ড্র এবং -1কমানোর জন্য।

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

#!/usr/bin/perl
sub f{
    if ($p++ % 100000 == 0) {
        local $| = 1;
        print ".";
    }
y/XO/OX/,$@=-$@while$|-=/(@{[map{(O.".{$_}O"x3)=~s%O%Z|$`X$'|Z%gr}0,3..5]})(?{$@++})^|$/osx;$@<=>0||s%-%$_="$`O$'";$a{$_}//=&f+1or return 1%eeg&&/1/-1}

# Driver
my $tomove = "X";
my $move = 0;
@board = ("----\n") x 4;
while (1) {
    print "Current board after move $move ($tomove to move):\n  ABCD\n";
    for my $i (1..4) {
        print "$i $board[$i-1]";
    }
    print "Enter a move like B4, PASS (not a valid move, just for setup) or just press enter to let the program make suggestions\n";
    my $input = <> // exit;
    if ($input eq "\n") {
        $_ = join "", @board;
        tr/OX/XO/ if $tomove eq "O";
        $p = 0;
        $@="";
        %a = ();
        my $start = time();
        my $result = f;
        if ($result == 1) {
            tr/OX/XO/ if $tomove eq "O";
            tr/012/-/;
        } else {
            tr/OX/XO/ if $tomove eq "X";
            tr/012/123/;
        }
        $result = -$result if $tomove eq "O";
        my $period = time() - $start;
        print "\nSuggested moves (evaluated $p positions in $period seconds, predicted result for X: $result):\n$_";
        redo;
    } elsif ($input =~ /^pass$/i) {
        # Do nothing
    } elsif (my ($x, $y) = $input =~ /^([A-D])([1-4])$/) {
        $x = ord($x) - ord("A");
        --$y;
        my $ch = substr($board[$y],$x, 1);
        if ($ch ne "-") {
            print "Position already has $ch. Try again\n";
            redo;
        }
        substr($board[$y],$x, 1) = $tomove;
    } else {
        print "Cannot parse move. Try again\n";
        redo;
    }
    $tomove =~ tr/OX/XO/;
    ++$move;
}

চমৎকার উত্তর. আপনি কি আমাকে পরীক্ষা করার জন্য কিছু সহজ উপায় সরবরাহ করতে পারেন? আদর্শভাবে এটি একটি ইন্টারেক্টিভ সংস্করণটি দেখতে পছন্দ করবে ... (এটি আমার নিজের কৌতূহলের জন্য কুঁড়েঘর)।
রোহান ঝুনঝুনওয়ালা

@ রোহানঝুনঝুনওয়ালা ঠিক আছে, একটি সাধারণ ইন্টারেক্টিভ চালক যুক্ত করেছেন
টন হসপেল

চলক '$ পদক্ষেপ' prog.pl:2 এ ঘোষণা করা হয় না
রোহান Jhunjhunwala

কোনও বাস্তবিক সমাধান কি কোনও মানুষ বাস্তবায়িত করতে পারে?
রোহান ঝুনঝুনওয়ালা

@ রোহানঝুনঝুনওয়ালা সবেমাত্র ড্রাইভারদের প্রোগ্রাম পরীক্ষা করে দেখুন। জরিমানা $moveচালায় , ১১-এ ঘোষণা করা হয়েছে, কোনও মানবিক হিউরিস্টিক আছে কিনা আমার কোনও ধারণা নেই। এই প্রোগ্রামটি গেম ট্রিটিতে কেবল মিনিম্যাক্স করে, এটির কোনও কৌশলগত জ্ঞান নেই।
টন হসপেল

2

জাভাস্ক্রিপ্ট (ES6) 392 বাইট

a=>b=>(c="0ed3b56879a4c21f",r=[],k=f=>r.push([a.filter(f),b.filter(f)]),[0,1,2,3].map(i=>k(n=>n%4==i)+k(n=>(n/4|0)==i)),k(n=>n%5==0),k(n=>n&&n-15&&!(n%3)),g=r.find(o=>(o[0].length==1&&o[1].length==2)||(o[0].length==2&&o[1].length==1)),g?parseInt(c[30-[...g[0],...g[1]].map(i=>parseInt(c[i],16)).reduce((p,c)=>p+c)],16):[...a,...b].indexOf(15-a[0])+1?15-a.find(i=>b.indexOf(15-i)==-1):15-a[0])

ব্যবহার

"বট" দ্বিতীয় খেলবে।

একটি 4x4 গ্রিড আঁকুন যা এরকম নম্বরযুক্ত:

+----+----+----+----+
|  0 |  1 |  2 |  3 |
+----+----+----+----+
|  4 |  5 |  6 |  7 |
+----+----+----+----+
|  8 |  9 | 10 | 11 |
+----+----+----+----+
| 12 | 13 | 14 | 15 |
+----+----+----+----+

আসুন এটি ব্রাউজার কনসোলে চালিয়ে দিন: f=কোডের আগে রেখে দিন

সুতরাং, আমি যদি শুরু করতে চাই 1, আমি দৌড়াতে পারি f([1])([])এবং এটি আমাকে দেবে 14

ভাল সরানো ... আমি 2পরে খেললে কি হবে ? f([2,1])([14])। এটি ফিরে আসবে 13

লেমমে আত্মসমর্পণের চেষ্টা করুন। খেলো 3f([3,2,1])([14,13])। ওহ 0! আমাকে বুঝতে পেরেছ!

খেলি 0? f([0,2,1])([14,13])15ঠিক আছে চল খেলি ...

বিঃদ্রঃ

  1. ইন্টারেক্টিভ খেলুন। দিয়ে শুরু f([your-step])([])

  2. আপনার পরবর্তী পদক্ষেপ প্রস্তুত করুন। (উপরে ডেমো দেখুন)

  3. "বট" ইনপুটটির পদক্ষেপগুলিতে সহায়তা করুন। আপনি এলোমেলো সেটিং দিলে এটি আপনাকে ভাল ফলাফল দেয় না। (লাইক f([1,2,4])([14,12])দিবে 14- আরে বটটি 13তার দ্বিতীয় পদক্ষেপে খেলতে চেয়েছিল !

সারাংশ

যতক্ষণ আপনি আত্মসমর্পণ করছেন না, ততক্ষণ বট একটি মিরর মুভ খেলবে।

আমি গেমের নিয়মাবলী এবং গল্ফিং টিপস ভুলভাবে পড়েছি তা বলার জন্য @EHT প্রোডাকশনসকে ধন্যবাদ: পি

এখন এটি চেকমেট পেয়েছে কিনা তাও সনাক্ত করবে। যদি হ্যাঁ, এটি ব্লক!

এর অগ্রাধিকারগুলি: ব্লক> মিরর> (ফলব্যাক) একটি আয়না পুনরুত্পাদন করার উপায়গুলি সন্ধান করুন


আমি সত্যিই "মিরর পদক্ষেপ" কৌশল পছন্দ করি :) আমি ভুল বুঝাবুঝি করতে পারি তবে 3,2,1আপনার 0জন্য এবং বোটের পক্ষে আপনার পক্ষে জয় নয়?
ETH প্রোডাকশনগুলি

ওহো, আমি "কে এক ধরণের 3 এবং অন্যের 1 টির নমুনা ক্যাপচার করি" হিসাবে ভুল বুঝেছি। লেমমে সমাধানটি কিছুটা টুইঙ্ক করুন .. ধন্যবাদ @ ইথ প্রডাকশনস।
সানি পুন

গল্ফ করার কয়েকটি টিপস: গল্ফ করা [0,1,2,3].map(i=>{k(n=>n%4==i);k(n=>Math.floor(n/4)==i);})যেতে পারে [0,1,2,3].map(i=>k(n=>n%4==i)+k(n=>(n/4|0)==i))
ETH প্রোডাকশনস

আমি মনে করি না এটি সম্ভবত জয়যুক্ত
রোহান ঝুনঝুনওয়ালা

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