সরলীকৃত তামাগোচ্চি / গিগা পোষা প্রাণী তৈরি করুন!


9

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

import msvcrt,os,sys;d=m=100;h=s=t=p=0;f=10
while 1:
 os.system('cls'if os.name=='nt'else'clear');print("health:",d,"\nhunger:",h,"\nsleep:",s,"\nfood:",f,"\npotions:",p,"\nmoney:",m);t+=1
 if msvcrt.kbhit():
  k=ord(msvcrt.getch())
  if k==102 and h>8 and f:f-=1;h-=9
  if k==115:s=0
  if k==112 and p:p-=1;d+=9
  if k==98 and m>8:m-=9;p+=1
  if k==116 and m>8:m-=9;f+=1
 if t>99:
  t=0;h+=1;s+=1
  if s>80:s=0;h+=9
  if h>80:d-=1
  if d<1:sys.exit(0)
  if d>79:m+=1

এটি 467 বাইটে একটি নগ্ন-হাড়ের ভার্চুয়াল পোষা প্রাণী! আমি তখন ভাবলাম কোড গল্ফ পেশাদাররা কতটা ভাল করতে পারে তাই এখন, চ্যালেঞ্জ।

চ্যালেঞ্জ

এমন একটি প্রোগ্রাম তৈরি করুন যা ভার্চুয়াল পোষ্যের 6 টি পরিসংখ্যানকে ট্র্যাক করে এবং সময়ের সাথে সাথে এবং ব্যবহারকারী ইনপুটটির প্রতিক্রিয়ায় সেগুলি আপডেট করে। পরিসংখ্যানগুলি হ'ল স্বাস্থ্য এবং অর্থ (100 থেকে শুরু), খাবার (10 এ শুরু) এবং ক্ষুধা, ঘুম এবং মিশ্রণ (0 থেকে শুরু)।

প্রোগ্রামটি নিম্নলিখিত ইভেন্টগুলির প্রতিক্রিয়া হিসাবে মান আপডেট করা উচিত:

  • প্রোগ্রামটি কোনও ইনপুট পাচ্ছে না, এটি নিয়মিত বিরতিতে আপডেটগুলি সম্পাদন করা উচিত (আপডেটগুলির মধ্যে অন্তরটি আধ সেকেন্ডের চেয়ে কম বা এক সেকেন্ডের চেয়ে বেশি হওয়া উচিত নয়)। প্রতিটি আপডেট নিম্নলিখিতগুলি করে:

    • ক্ষুধা এবং ঘুম প্রতিটি বৃদ্ধি 1।
    • ক্ষুধা যদি 80 বা তার বেশি হয় তবে স্বাস্থ্য 1 দ্বারা হ্রাস পায়।
    • ঘুম যদি 80 বা তার বেশি হয় তবে এটি 0 এ পুনরায় সেট করা হয় এবং ক্ষুধা অতিরিক্ত 9 দ্বারা বৃদ্ধি পায়।
    • স্বাস্থ্য যদি 80 বা তার বেশি হয় তবে অর্থ 1 দ্বারা বৃদ্ধি পায়।
    • স্বাস্থ্য 0 হলে প্রোগ্রামটি প্রস্থান করে।
  • প্রোগ্রামটি ব্যবহারকারীর দ্বারা নিম্নলিখিত কীটিপ্রেসগুলি সম্পর্কে তাত্ক্ষণিকভাবে প্রতিক্রিয়া জানাতে হবে (এর অর্থ এটি আপনাকে এমন একটি ভাষা বৈশিষ্ট্য বা গ্রন্থাগার ব্যবহার করতে হবে যা কোনও কী চাপানো হচ্ছে তা সনাক্ত করতে পারে এবং এটি কেবল স্ট্যান্ডার্ড ইনপুট থেকে পড়ার চেয়ে তাত্ক্ষণিক প্রতিক্রিয়া জানাতে পারে), পারফর্ম করে নিম্নলিখিত ক্রিয়া:

    • f: ক্ষুধা যদি 8 এর চেয়ে বেশি হয় এবং খাদ্য ননজারো হয় তবে খাবার 1 টি হ্রাস পায় এবং ক্ষুধা 9 টি হ্রাস পায়।
    • s: ঘুম 0 এ পুনরায় সেট করা হয়।
    • p: যদি পিউশনগুলি শূন্যের চেয়ে বেশি হয়, পোটিয়েন্সগুলি 1 এবং স্বাস্থ্য 9 দ্বারা বৃদ্ধি পেয়েছে।
    • b: মানি যদি 8 এর বেশি হয় তবে মান 9 দ্বারা হ্রাস পাবে এবং পোটিয়েন্স 1 দ্বারা বৃদ্ধি পেয়েছে।
    • t: মানি যদি 8 এর চেয়ে বেশি হয় তবে মান 9 দ্বারা হ্রাস পাবে এবং খাদ্য 1 দ্বারা বৃদ্ধি পেয়েছে।

যখনই পরিসংখ্যানের মান পরিবর্তন হয়, সেগুলি অবশ্যই ফর্মের স্ক্রিনে প্রদর্শিত হবে । যখনই তাদের কোনও পরিবর্তন হয় সমস্ত ছয়টি পরিসংখ্যান অবশ্যই প্রদর্শিত হবে; এবং প্রদর্শনের মধ্যে থাকা পরিসংখ্যানগুলি কমা দ্বারা বা নিউলাইন দ্বারা পৃথক করা উচিত।Stat: value

এই চ্যালেঞ্জটি স্বাভাবিকভাবে অনুসরণ করে বিধিগুলি: সংক্ষিপ্ততম প্রোগ্রামটি জয়ের উপরের স্পেসিফিকেশনটির সাথে সম্মতি জানায়। (নোট করুন যে যথারীতি ভাষাটি যদি প্রতিযোগিতার চেয়ে নতুন হয় তবে সাবমিশনটি অবশ্যই প্রতিদ্বন্দ্বী হিসাবে চিহ্নিত করা উচিত))


প্রারম্ভিক পরিসংখ্যানগুলি কী আপনি তা বলবেন না
ব্লু

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

1
এটা অস্পষ্ট কিভাবে? আমি অস্পষ্ট আরও বিশদ থাকতে চান, কারণ নিজেই অস্পষ্ট।
এন্ডের_সাইক্লি

2
স্যান্ডবক্স আর সাহায্য করবে না, কারণ ইতিমধ্যে উত্তর রয়েছে। যে লোকেরা এটিকে অস্পষ্ট হিসাবে চিহ্নিত করেছে তাদের উচিত তাদের অস্পষ্ট হওয়ার পরিবর্তে এটি কেন অস্পষ্ট।
ender_scythe

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

উত্তর:


6

সি, 424 406 386 357 বাইট

#define x(a,b,c)if(*#a==C){if(b>8){c-=9;}Z=0;}
L,M=100,H,S=-1,F=10,P,Z,C;t(){H++;S++;L-=H>79;if(S>79)S=0,H+=9;Z=1/L/2;alarm(1);}main(){nodelay(initscr(),L=M);signal(14,t);for(t(H=S);C=getch();Z=Z||printf("\rhealth: %d,hunger: %d,sleep: %d,food: %d,potions: %d,money: %d\n",L,H,S,F,P,M)){x(s,9,S=9;S)x(p,P+8,P--;L+=18;L)x(f,H,F--;H)x(b,M,P++;M)x(t,M,F++;M)}}

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

গেমটি কীভাবে ওভারটি নির্দেশ করা হয় তা আপনি নির্দিষ্ট করে দেননি, সুতরাং "ফ্লোটিং পয়েন্ট ব্যতিক্রম (কোর ডাম্পড)" এর চিরাচরিত তামাগোচ্চি মৃত্যুর ক্রন্দনের সাথে এটি মারা যায়।

Ungolfed

/* Playing a bit fast and loose with the prototyping rules by omitting these;
 * none of the functions I'm using from them *exactly* match the default
 * prototype of `int f();`
 */
//#include <curses.h>
//#include <stdio.h>
//#include <signal.h>
//#include <unistd.h>

#define x(a,b,c)if(*#a==C){if(b>8){c-=9;}Z=0;}
L,M=100,H,S=-1,F=10,P,Z,C;

t() {
    H++;
    S++;
    L-=H>79;
    if(S>79)S=0,H+=9;
    Z=1/L/2;//0 if L>0. otherwise the pet dies of a floating point error
    alarm(1);
}

main(){
    nodelay(initscr(),L=M);
    signal(14,t);
    for(t(H=S); C=getch(); Z=Z||printf("\rhealth: %d,hunger: %d,sleep: %d,food: %d,potions: %d,money: %d\n",L,H,S,F,P,M)){
        x(s,9,S=9;S)
        x(p,P+8,P--;L+=18;L)
        x(f,H,F--;H)
        x(b,M,P++;M)
        x(t,M,F++;M)
    }
}

2

পিএইচপি, 396 413 বাইট

(ডাং, আমার প্রথম কোড গল্ফ এন্ট্রি যা আমাকে বাইট কাউন্টে সম্পাদনা করতে হয়েছিল sleep

অ-ব্লক করা STDIN এর জন্য একটি ইউনিক্স-ইশ ওএস প্রয়োজন। অদ্ভুতভাবে, স্যুইচ / কেস বনাম ক্যাসকেড ব্যবহার করে / অন্যটি যদি সংক্ষিপ্ত উত্স কোড তৈরি করে তবে পরবর্তী সংক্ষেপিত সংস্করণটি দীর্ঘ ছিল।

<?eval(gzinflate(base64_decode('bY5BT8MwDIXv/Ao0WWujtVJ7YmtITwiNAwhp3KutOE20pImWVGxa999J1IEAcbH87O892wlUqsEjtmnivD/d5rLd9qZPCHX+gFvdOPTNTpl2L/su3bw9PL1kBaEwMHAMLCsocFaGKhjo0BT0Q0iFaUnO4JmXGlPyPZI8TWHPeIe+nbIIGccJqsGTXbi4p4EKEEt4Qs6xH+rlfA6c5DnwEYacregFlcMvziUk/FLQnzN79drosiOIxV/X7kroeklAh9BxsQD7m/H/MXxi4iKoob5bxRuCTtpFHd8Jn8ab0S7iLOz0pO5LgkfpQ0wrzGyNW+VFBSJ7Nj2eKtDZozHvFfBsPfQdHioYso1CtBW47NV4aXpXgb2Z0csn')));

Ungolfed:

<?
shell_exec('stty -icanon');
stream_set_blocking(STDIN, 0);
$u = $s = $p =0;
$f = 10;
$h = $m = 100;
while(1) {
    $t=time();
    while(1)
        if (($k = fgetc(STDIN)) || time() > $t)
            break;
    if ($k == 'f'){
        if ($u > 8 && $f) --$f | $u -= 9;
    } elseif ($k == 's')
        $s = 0;
    elseif ($k == 'p') {
        if ($p) --$p | $h += 9;
    } elseif ($k == 'b') {
        if ($m > 8) $m -= 9 | ++$p;
    } elseif ($k == 't') {
        if ($m > 8) $m -= 9 | ++$f;
    } else {
        if (++$u > 79) --$h;
        if (++$s > 79) $s = 0 | $u += 9;
        if ($h > 79) ++$m;
        if ($h < 1) exit;
    }
    echo"Health:$h,Money:$m,Food:$f,Hunger:$u,Sleep:$s,Potions:$p\n";
}

এটি "ব্যবহারকারী দ্বারা নিম্নলিখিত কী টিপুনগুলিতে অবিলম্বে প্রতিক্রিয়া জানায় না"। sleep(1)ইনপুট প্রক্রিয়াজাতকরণের আগে কলটি ফিরে না আসা পর্যন্ত এটি অপেক্ষা করে । যদিও এটি পরবর্তী আপডেট করার আগে কোনও সারিবদ্ধ কমান্ডগুলি প্রক্রিয়া করে, তাই এটি ঠিক আছে।
রায়

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

2

গণিত, 374 বাইট

h=m=100;f=10;g=s=p=0;RunScheduledTask[g++;s++;If[g>79,h--];If[s>79,s=0;g+=9];If[h>79,m++];If[h<1,Quit[]]];Dynamic@Row[{EventHandler[InputField[],"KeyDown":>Switch[CurrentValue@"EventKey","f",If[g>8&&f>0,f--;g-=9],"s",s=0,"p",If[p>0,p--;h+=9],"b",If[m>8,m-=9;p++],"t",If[m>8,m-=9;f++]]],"
Health: ",h,"
Money: ",m,"
Food: ",f,"
Hunger: ",g,"
Sleep: ",s,"
Potions: ",p}]

লাইন বিরতি গুরুত্বপূর্ণ কারণ তারা স্ট্রিংয়ে নতুন লাইন অক্ষর তাই আমি এর Rowপরিবর্তে ব্যবহার করতে পারি Column। আপনি যদি এটি গাণিতিক নোটবুকে মূল্যায়ন করেন তবে আপনার এমন কিছু দেখা উচিত:

তমগোচ্চি সিমুলেশন

ইনপুট ক্ষেত্রে আপনাকে ক্লিক Dynamicকরতে হবে এবং ইনপুট ক্ষেত্রটি আপডেট হওয়ার আগে দ্রুত (একটি সেকেন্ডেরও কম) নিজের অক্ষরটি টাইপ করুন । এই মাথাব্যথা সম্পূর্ণরূপে এড়ানো যেতে পারে যদি এটি EventHandlerএকটি উপাদান হওয়ার পরিবর্তে নিজস্ব কক্ষে থাকে তবে এটির Rowজন্য প্রোগ্রামটি একটি .nb ফাইল হিসাবে সংরক্ষণ করা দরকার যা বাইট সংখ্যা বাড়িয়ে তুলবে।


চমৎকার কাজ! আমি যেমন কাঠামো ব্যবহার করতে যাচ্ছি CurrentValue[EvaluationNotebook[], NotebookEventActions] = {"KeyDown" :> Switch[CurrentValue@"EventKey", "f", If[g > 8 && f > 0, f--; g -= 9], "s", s = 0, "p", If[p > 0, p--; h += 9], "b", If[m > 8, m -= 9; p++], "t", If[m > 8, m -= 9; f++]]};... এটি আপনাকে একটি ইনপুট ক্ষেত্রে ক্লিক করার প্রয়োজন এড়াতে দেয় should এই কোডটির শেষে বিকল্পটি যুক্ত , PassEventsDown -> Trueকরা আপনাকে নোটবুকটি সম্পাদনা করা চালিয়ে যেতে দেবে, তবে বাইট সাশ্রয়ের জন্য একেবারে শেষে সরিয়ে দেওয়া যেতে পারে :)
গ্রেগ মার্টিন

ধন্যবাদ, প্রথম দিকে আমি ঠিক সেই কার্যকারিতাটি খুঁজছিলাম! দুর্ভাগ্যক্রমে মনে হচ্ছে এটি বর্তমানে আমার যা আছে তার চেয়ে বেশি দিন।
নেজেনিসিস

2

সি # 6, 567 563 বাইট

using System;using System.Threading;class T{int L,M,F=10,H,S,P;static void Main(){T t=new T();}T(){M=L=100;var W=new Thread(new ThreadStart(Q));W.Start();while(1>0){var r=Console.Read();bool B=0>1,K=1>0;if(r=='f'&H>8&F>0){F--;H-=9;B=K;}if(r=='s'){S=0;B=K;}if(r=='p'&P>0){P--;L+=9;B=K;}if(r=='b'&M>8){M-=9;P++;B=K;}if(r=='t'&M>8){M-=9;F++;B=K;}if(B)p();}}void Q(){while(1>0){H++;S++;if(H>79)L--;if(S>79){S=0;H+=9;}if(L>79)M++;L*=L/L;p();Thread.Sleep(500);}}void p(){Console.Write($"\nhealth: {L}\nhunger: {H}\nsleep: {S}\nfood: {F}\nmoney: {M}\npotions: {P}\n");}}

Ungolfed:

using System;
using System.Threading;
class T
{
    int L,M,F=10,H,S,P;
    static void Main()
    {
        T t=new T();
    }
    T()
    {
        M=L=100;
        var W=new Thread(new ThreadStart(Q));
        W.Start();
        while(1>0)
        {
            var r=Console.Read();
            var B=0>1;
            if(r=='f'&H>8&F>0){F--;H-=9;B=1>0;}
            if(r=='s'){S=0;B=1>0;}
            if(r=='p'&P>0){P--;L+=9;B=1>0;}
            if(r=='b'&M>8){M-=9;P++;B=1>0;}
            if(r=='t'&M>8){M-=9;F++;B=1>0;}
            if(B)p();
        }
    }
    void Q()
    {
        while(1>0)
        {
            H++;S++;
            if(H>79)L--;
            if(S>79){S=0;H+=9;}
            if(L>79)M++;
            L*=L/L;
            p();
            Thread.Sleep(500);
        }
    }
    void p()
    {
        Console.Write($"\nhealth: {L}\nhunger: {H}\nsleep: {S}\nfood: {F}\nmoney: {M}\npotions: {P}\n");
    }
}

1

ক্লোজার, 1224 702 বাইট

থেকে V2

রাষ্ট্রীয় বস্তুর অভ্যন্তরে না গিয়ে সমস্ত পরমাণুকে আলগা ভেরিয়েবল তৈরি করে। এটি একা প্রচুর কোড থেকে মুক্তি পেয়েছিল। আমিও শর্টকাট ফাংশন নির্মিত a!এবং s!যোগ করতে পারেন এবং থেকে বিয়োগ করতে atoms(মূলত হিসাবে অভিনয় সহজ +=এবং -=যেহেতু Clojure ঐ অপারেটার নেই)।

আমি বুঝতে পেরেছি যে আমি atomকী-তে ইনপুট একীভূত করতে পরিচালিত হলে আমি সম্ভবত এগুলি বন্ধ করে দিতে পারি loop। আমাকে দেখতে হবে।

(ns bits.golf.pet.v2.petms)(def h(atom 100))(def j(atom 0))(def s(atom 0))(def f(atom 10))(def p(atom 0))(def m(atom 100))(defn a[sa n](swap! sa #(+ % n)))(defn v[sa n](swap! sa #(- % n)))(defn c[](a j 1)(a s 1)(if(>=@j 80)(v h 1))(if (>=@s 80)(do(reset! s 0)(a j 9)))(if(>= @h 80)(a m 1)))(defn l[k](case k\f(if(> @j 8)(do(v f 1)(v j 9)))\s(reset! s 0) \p(if(>@p 0)(do(v p 1)(a h 9)))\b(if(> @m 8)(do(v m 9)(a p 1)))\t(if(>@m 8)(do(v m 9)(a f 1)))nil))(defn b[](.start(Thread.^Runnable(fn[](while(>@h 0)(l(first (read-line))))))))(defn -main[](b)(while(>@h 0)(Thread/sleep 500)(c)(println(str"Health: "@h"\nHunger: " @j"\nSleep: "@s"\nFood: "@f"\nPotions: "@p"\nMoney:"@m"\n")))(println"You died!\n"))

Ungolfed:

(ns bits.golf.pet.v2.pet)

; 100 0 0 10 0 100
(def he (atom 100))
(def hu (atom 0))
(def sl (atom 0))
(def fo (atom 10))
(def po (atom 0))
(def mo (atom 100))

(defn a! [sa n]
  (swap! sa #(+ % n)))

(defn s! [sa n]
  (swap! sa #(- % n)))

(defn apply-rules []
    (a! hu 1)
    (a! sl 1)
    (if (>= @hu 80)
      (s! he 1))
    (if (>= @sl 80)
      (do
        (reset! sl 0)
        (a! hu 9)))
    (if (>= @he 80)
      (a! mo 1)))

(defn handle-keypress [k]
    (case k
      \f (if (> @hu 8)
           (do
             (s! fo 1)
             (s! hu 9)))
      \s (reset! sl 0)
      \p (if (> @po 0)
           (do
             (s! po 1)
             (a! he 9)))
      \b (if (> @mo 8)
           (do
             (s! mo 9)
             (a! po 1)))
      \t (if (> @mo 8)
           (do
             (s! mo  9)
             (a! fo 1)))
      nil))


(defn start-listener []
  (.start
    (Thread. ^Runnable
      (fn []
        (while (> @he 0)
            (handle-keypress (first (read-line))))))))

(defn -main []
  (start-listener)
  (while (> @he 0)
    (Thread/sleep 500)

    (apply-rules)

    (println (str
               "Health: " @he "\n"
               "Hunger: " @hu "\n"
               "Sleep: " @sl "\n"
               "Food: " @fo "\n"
               "Potions: " @po "\n"
               "Money:" @mo "\n")))

  (println "You died!\n"))

V1 থেকে

ওহ আল্লাহ. অবশ্যই উন্নতির জন্য এখানে জায়গা। এই ধরণের সমস্যাটি পার্শ্ব প্রতিক্রিয়াগুলি করা সবচেয়ে সহজ, এবং ক্লোজুরে কার্যকরী, তাই atomপ্রয়োজনীয় কোডের পরিমাণ হ্রাস করার জন্য আমি এস ব্যবহার করার চেষ্টা করছি । দুর্ভাগ্যক্রমে, আমি কোনও পরিকল্পনা নিয়ে যাইনি, সুতরাং এখনই এটি একধরণের হাফাজার্ড। যদিও আমি সঙ্কুচিত করতে ইতিমধ্যে কয়েকটি ধারণা পেয়েছি।

এটি একটি সম্পূর্ণ প্রোগ্রাম। এটি চালিয়ে চালানো যেতে পারে -main

(ns bits.golf.pet)(defrecord S[he hu sl fo po mo])(def new-state(->S 100 0 0 10 0 100))(def state(atom new-state))(defn update![sa k f](swap! sa #(update % k f)))(defn apply-rules[s](let [s' (atom s)u! #(update! s' %1 %2)g #(get @s' %)](u! :hu inc)(u! :sl inc)(if(>=(g :hu)80)(u! :he dec))(if(>= (g :sl)80)(do(u! :sl (fn[_]0))(u! :hu #(+ % 9))))(if(>=(g :he)80)(u! :mo inc))@s'))(defn get-input [](let [raw (read-line)](first raw)))(defn handle-keypress[s k](let [s'(atom s)u! #(update! s' %1 %2)g #(get @s' %)](case k\f(if (> (g :hu)8)(do(u! :fo dec)(u! :hu #(- % 9))))\s(u! :sl (fn [_] 0))\p(if(> (g :po)0)(do(u! :po dec)(u! :he #(+ % 9))))\b(if(>(g :mo))(do(u! :mo #(- % 9))(u! :po inc)))\t(if(>(g :mo)8)(do(u! :mo #(- % 9))(u! :fo inc)))nil@s')))(defn start-listener[](.start(Thread.^Runnable(fn[](while true(let[k(get-input)](swap! state #(handle-keypress % k))))))))(defn -main[](start-listener)(let[g #(get @%1 %2)](while true(Thread/sleep 500)(swap! state #(apply-rules %))(println(str"Health: "(g state :he)"\nHunger: "(g state :hu)"\n""Sleep: " (g state :sl)"\nFood: "(g state :fo)"\nPotions: "(g state :po)"\n""Money:"(g state :mo)"\n"))(if(<=(g state :he)0)(do(println"You died!\n")(reset! state new-state))))))

Ungolfed:

(ns bits.golf.pet)

(defrecord State [he hu sl fo po mo])

(def new-state (->State 100 0 0 10 0 100))

(def state (atom new-state))

(defn update! [sa k f]
  (swap! sa #(update % k f)))

(defn apply-rules [s]
  (let [s' (atom s)
        u! #(update! s' %1 %2)
        g #(get @s' %)]
    (u! :hu inc)
    (u! :sl inc)
    (if (>= (g :hu) 80)
      (u! :he dec))
    (if (>= (g :sl) 80)
      (do
        (u! :sl (fn [_] 0))
        (u! :hu #(+ % 9))))
    (if (>= (g :he) 80)
      (u! :mo inc))
    @s'))

(defn get-input []
  (let [raw (read-line)]
    (first raw)))

(defn handle-keypress [s k]
  (let [s' (atom s)
        u! #(update! s' %1 %2)
        g #(get @s' %)]
    (case k
      \f (if (> (g :hu) 8)
           (do
             (u! :fo dec)
             (u! :hu #(- % 9))))
      \s (u! :sl (fn [_] 0))
      \p (if (> (g :po) 0)
           (do
             (u! :po dec)
             (u! :he #(+ % 9))))
      \b (if (> (g :mo))
           (do
             (u! :mo #(- % 9))
             (u! :po inc)))
      \t (if (> (g :mo) 8)
           (do
             (u! :mo #(- % 9))
             (u! :fo inc)))
      nil
      @s')))

(defn start-listener []
  (.start
    (Thread. ^Runnable
      (fn []
        (while true
          (let [k (get-input)]
            (swap! state #(handle-keypress % k))))))))

(defn -main []
  (start-listener)
  (let [g #(get @%1 %2)]
    (while true
      (Thread/sleep 500)

      (swap! state #(apply-rules %))

      (println (str
                 "Health: " (g state :he) "\n"
                 "Hunger: " (g state :hu) "\n"
                 "Sleep: " (g state :sl) "\n"
                 "Food: " (g state :fo) "\n"
                 "Potions: " (g state :po) "\n"
                 "Money:" (g state :mo) "\n"))

      (if (<= (g state :he) 0)
        (do
          (println "You died!\n\n\n\n\n")
          (reset! state new-state))))))

এটি সেখানে কোডের একটি দুর্দান্ত পরিমাণ।
ender_scythe

@ender_scythe ইয়া আমি কিছু জায়গায় অর্ধ-শালীন কোডিং অভ্যাসগুলি মেনে চলার চেষ্টা করছিলাম, যেমন তৈরি applying-rulesএবং handle-keypressখাঁটি। আমি এখনই একটি "স্ক্রু-এটি" সংস্করণ লিখছি।
কারসিজেনিকেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.