เดาตัวเลข


10

ลักษณะ

สร้างเกม "เดาหมายเลข" ที่ทำงานได้อย่างสมบูรณ์ เกมนี้เล่นโดยผู้เล่นสองคนดังต่อไปนี้:

  1. ผู้เล่นคนหนึ่งเลือกหมายเลข (A) ระหว่าง 1 ถึงN
  2. ผู้เล่นสองคนพยายามเดาการเลือกตัวเลข (B) ในช่วงเดียวกัน
  3. ครั้งแรกที่ตอบสนองผู้เล่น"สูง" if A > B , "ลด" if A < Bหรือ"ถูกต้อง" if A = B
  4. ขั้นตอนที่ 2-3 ทำซ้ำฉันครั้งหรือจนกว่าจะตอบสนอง "ถูกต้อง"
  5. หากได้ยิน "ถูกต้อง" ผู้เล่นสองคนชนะมิฉะนั้นเขาจะเสีย

รายละเอียด

ข้อกำหนดขั้นต่ำสำหรับรายการที่ถูกต้อง:

  • ผู้ใช้สามารถเล่นได้ทั้งแบบผู้เล่นคนเดียวหรือผู้เล่นสองคน
  • คอมพิวเตอร์มีบทบาทอื่น
  • คอมพิวเตอร์จะต้องพยายามคาดเดาจำนวนขณะที่เล่นเป็นผู้เล่นสองคน (ดังนั้นการคาดเดาข้อมูลที่ได้รับหรือการเพิกเฉยต่อข้อมูลที่ให้นั้นเป็นการโกง)
  • N = 100 หรืออินพุตโดยผู้ใช้ (ตัวเลือกของคุณ)
  • I = 5 หรืออินพุตโดยผู้ใช้ (ตัวเลือกของคุณ)
  • โปรแกรมจะต้องประกาศผู้ชนะในตอนท้าย
  • คำแนะนำที่มนุษย์สามารถอ่านได้อย่างเต็มที่เกี่ยวกับสิ่งที่ต้องทำในแต่ละขั้นตอน (เช่น"เล่นในฐานะผู้เล่นหนึ่งคนหรือสองคนเล่น" , "ป้อนอีกครั้งเดา:"ฯลฯ ) - อย่าไปบ้ากับคนนี้ เพียงแค่ทำให้มันง่าย

เงื่อนไขการชนะ

เพื่อให้:

  1. คะแนนโหวตสูงสุดจะเป็นผู้ชนะถ้าคะแนนเสียงอย่างน้อย 3 คะแนนก่อนการโหวตสูงสุดครั้งที่สอง
  2. รายการที่สั้นที่สุดชนะ

ฉันไม่ได้อ่านอย่างชัดเจนว่าเราต้องการ AI ในอันนั้น คุณยืนยันว่าผู้เล่นทั้งสองเป็นมนุษย์หรือไม่?
JB

@JB: ขออภัยเกี่ยวกับที่: / คุณไม่จำเป็นต้องมี AI ฉันกำลังอัปเดตคำถามตอนนี้ ...
Eelvex

2
ฉันคิดว่าควรให้ตำราการเรียนการสอนในแต่ละขั้นตอนไม่เช่นนั้นยากที่จะเปรียบเทียบคำตอบ
Joey

@Joey มั่นเหมาะ
ŠimonTóth

การตรวจสอบอินพุตของผู้ใช้สำคัญหรือไม่?
zzzzBov

คำตอบ:


3

Windows PowerShell, 289

nal ^ Read-Host
filter p{"Player $_ wins.";exit}
$p=1-(^ Player 1 or 2)
$n=($x=1)..($y=99)|random
if($p){$n=^ Enter number}1..5|%{if($p){'{0:"higher";"lower";"correct";2|p}'-f($n-(^ Guess))|iex}else{"Guessing, "+($g=$x..$y|random);@{104='$x=$g+1';108='$y=$g-1';99='2|p'}[+(^)[0]]|iex}}
1|p

ประวัติความเป็นมา:

  • 2011-02-21 18:44 (620)ไม่ดี
  • 2011-02-21 19:15 (365) การแข่งขันกอล์ฟรอบแรก
  • 2011-02-21 19:31 (359)อินไลน์บางคน
  • 2011-02-21 19:38 (340)สตริงสั้นลง
  • 2011-02-21 19:44 (339) whilefor
  • 2011-02-21 19:53 (331)สตริงที่ซ้ำกันบางตัวถูกดึงเข้าสู่ตัวแปร
  • 2011-02-21 19:53 (330) อินไลน์อีกตัวแปรหนึ่ง
  • 2011-02-21 19:53 (328)เงื่อนไขลูปที่ปรับให้เหมาะสม ไม่สามารถใช้ไพพ์ไลน์ได้
  • 2011-02-22 01:57 (326) else{if...}elseif- บันทึกการจัดฟัน
  • 2011-02-22 12:42 (325)ย้ายสิ่งของมากมายโดยใช้ hashtable แทนที่จะใช้switchเพื่อหลีกเลี่ยงการตั้งชื่อลูป ตอนนี้ฉันสามารถใช้breakและเป็นท่อได้เช่นกัน การประกาศผู้ชนะได้ย้ายไปอยู่ในตัวกรองที่ใช้งานได้โดยexitไม่ต้องหยุดพัก
  • 2011-02-23 01:23 (308)แทนที่จะใช้elseifลูกโซ่สำหรับตรวจสอบการเดาฉันแค่ใช้สตริงรูปแบบที่มีค่าต่างกันสำหรับค่าลบค่าบวกและค่าศูนย์ ประหยัดมาก
  • 2011-02-23 02:16 (306)การใช้การลบแทนความเสมอภาค
  • 2011-03-12 02:27 (289)ลดระดับการโต้ตอบผู้ใช้พื้นฐานเป็นโซลูชันทับทิม แน่นอนว่ามันสั้นกว่านั้น

9

TRS-80 พื้นฐาน, 249 ตัวอักษร

ฉันคิดว่านี่อาจเป็นครั้งแรกที่ฉันส่งคำตอบไปยังไซต์นี้ที่ฉันเขียนไว้ก่อนที่จะมีเว็บไซต์

0 CLS:RANDOM:A=1:B=1E3:Q=RND(1E3):FORX=1TO8E9:PRINTA"-"B:INPUT"
 Guess";C:IFC<AORC>B,X=X-1:NEXTELSEIFC<QPRINT"Too low":A=C+1:NEXTELSEIFC>QPRINT"Too high":B=C-1:NEXTELSEPRINTC"is right!!
 It took you"X"tries.
":X=9E9:NEXT:FORX=0TO0:X=INKEY$="":NEXT:RUN

อันที่จริงฉันเขียนไว้ก่อนที่จะมีเว็บทั่วโลก ย้อนกลับไปในช่วงปี 1980 เช่นเดียวกับ TRS-80s ที่ไม่เกี่ยวข้อง

นี่คือตัวอย่างของ "หนึ่งซับ" - ความพยายามเพื่อให้พอดีกับโปรแกรมที่น่าสนใจที่สุดที่คุณสามารถเป็นบรรทัดเดียวของ BASIC มันเป็นหนึ่งซับของฉันครั้งแรกและไม่น่าประทับใจมาก (มีผู้เดินสมุทรหนึ่งคนที่น่าตื่นตาตื่นใจลอยอยู่รอบ ๆ ที่นั่น)

บรรทัดของ TRS-80 BASIC ถูก จำกัด ที่ 255 อักขระลบด้วยค่าใช้จ่ายสองคู่ แม้ว่าบางครั้งคุณสามารถเกินสิ่งนี้ได้เนื่องจากขีด จำกัด ที่แท้จริงคือ 255 ไบต์หลังจาก tokenization - แต่ตัวแก้ไขจะตัดทอนบรรทัดที่มีอักขระเกิน 255 อักขระก่อน tokenization และคุณจำเป็นต้องใช้ลูกเล่นในตัวแก้ไขบรรทัดเพื่อแทรกอักขระควบคุมตามตัวอักษร ชอบบรรทัดใหม่ในสตริงของคุณ

และใช่เพื่อชี้แจงการแบ่งบรรทัดเหล่านั้นในรายการเป็นตัวอักษรขึ้นบรรทัดใหม่ตามตัวอักษร (เพื่อให้ได้มาในรหัสของคุณคุณจำเป็นต้องใช้Cคำสั่ง hange ขณะEDITรับสายความเจ็บปวดทั้งหมด แต่คุ้มค่าที่จะแทนที่อักขระแปดตัวหรือมากกว่า+CHR$(13)ด้วยหนึ่งตัว)

ประณามฉันเล่นกอล์ฟมานานแล้ว


6

C 397 ตัวอักษร

N,H=99,L=0,c=0,w=1;main(){char s[9];puts("Play as player 1 or 2: ");scanf("%d",&N);if(N-1){getchar();do{N=rand()%(H-L)+L+1;printf("My guess: %d\n",N);gets(s);if(*s=='c'){w=2;break;}if(*s-'l')H=N-1;else L=N-1;c++;}while(c<5);}else{N=rand()%99+1;while(c<5){puts("Enter guess: ");scanf("%d",&H);if(H==N){puts("correct");break;}else puts(H>N?"higher":"lower");c++;}if(c==5)w=2;}printf("Winner %d",w);}

ในรูปแบบที่อ่านได้มากขึ้น

main()
{
        int i,N,H=100,L=0,c=0,w=1;
        char s[10];
        puts("Play as player 1 or 2: ");
        scanf("%d",&i);
        if(i-1)
        {
                getchar();
                do{
                        N=rand()%(H-L)+L+1;
                        printf("My guess: %d\n",N);
                        gets(s);
                        if(s[0]=='c')break;
                        else if(s[0]=='h')H=N-1;
                        else L=N-1;
                        c++;
                }while (c<5);
                if(c<5)w=2;
        }
        else
        {
                N=rand()%99+1;
                while (c<5)
                {
                        puts("Enter another guess: ");
                        scanf("%d",&H);
                        if(H==N){printf("correct\n");break;}
                        else if(H>N)printf("higher\n");
                        else printf("lower\n");
                        c++;
                }
                if(c==5)w=2;
        }
        printf("Winner %d",w);
}

@ Joey ถูกต้องแล้ว
fR0DDY

ดีฉันไม่รู้ว่าสมบูรณ์ C. แต่คุณช่วยอธิบายว่าโปรแกรมที่มีตัวแปรที่ไม่มีคอมไพเลอร์ตัวระบุชนิดได้อย่างไร?
MAKZ

ตัวแปรใด ๆ ที่ไม่มีประเภทที่ระบุคือจำนวนเต็ม
Ethiraric

4

ค#:

จำนวนตัวอักษร: ด้วยช่องว่าง: 575 ไม่มีช่องว่าง: 464

    static void Main()
    {
        Action<object> w = s => Console.WriteLine(s);
        Func<object, byte> r = t => { w(t); var s = Console.ReadLine(); return Convert.ToByte(s); };
        var p = r("Player (1/2):");
        int N = 100, g, i = 0, c, d;
        var q = new List<int>(Enumerable.Range(0, N));
        Func<Guid> x = Guid.NewGuid;
        c = p == 1 ? r("Number:") : q.OrderBy(j => x()).First();
        m: i++;
        g = p == 2 ? r("Guess:") : q.OrderBy(j => x()).First();
        d = g < c ? -1 : (g > c ? 1 : 0);
        w(d == -1 ? "Higher" : (d == 1 ? "Lower" : "correct"));
        q = q.Where(n => d == -1 ? n > g : n < g).ToList();
        if(c != g && i < 5) goto m;
        r(g);
    }

แก้ไข ทำในขณะนี้คือ "ไปที่" (ตัวสั่น )


3

ดีเก่าธรรมดาค

#include <stdio.h>
#define x(s) puts(s)
main(){int c,i,l,h,g;srand(time(NULL));p:x("You want to guess (1) or should I (2)?");scanf("%d",&c);i=5;if(c==2){x("Think a number 1..100");h=100;l=1;goto t;}if(c==1){x("Guess a number 1..100");h=rand()%100+1;goto g;}return 0;t:if(!i--)goto u;printf("%d (1)higher (2)lower (3)correct",g=rand()%(h-l)+l);scanf("%d",&c);if(c==1)l=g;if(c==2)h=g;if(c==3)goto c;goto t;g:if (!i--)goto c;scanf("%d",&g);if(g>h)x("lower");if(g<h)x("higher");if(g==h){x("correct");goto u;}goto g;u:x("You win");goto p;c:x("I win");goto p;}
  • 23/11/2011 16:44:00 883ดีและสะดวกสบาย
  • 24/11/2554 09:38:00 616คงที่ & ย่อ
  • 24/11/2011 11:52:00 สั้นลง555

1
คุณเขียนสิ่งนี้ในอนาคตหรือไม่ มันฉลาดมาก !!
mikera

3

JavaScript

เวอร์ชั่นย่อใหม่ (สายหลุดvarและalertสายลดลง:

268 ตัวอักษร

function g(m){n=u(confirm('Player pick?'));function u(p){if (p){do{n=parseInt(prompt('Number'))}while(isNaN(n)||!n||n>m)}else{n=parseInt(Math.random()*m)+1}return n}while(g!==n){do{g=parseInt(prompt('Guess'))}while(isNaN(g));alert(g<n?'higher':g>n?'lower':'correct')}}

ในการเรียกใช้การดำเนินการg(100);ด้วยตนเองจะไม่ถูกนับเนื่องจากเป็นการเพิ่มจำนวนอักขระ (275 ตัวอักษรให้g(100);)

ต้นฉบับ (ประมาณ 600 ตัวรวมถึงช่องว่าง)

function guessTheNumber(m)
{
  var n = getNum(confirm('Player pick the number?')), g;

  function getNum(p)
  {
    var n;
    if (p)
    {
      do
      {
        n = parseInt(prompt('What number?'));
      } while(isNaN(n) || !n || n > m);
    }
    else
    {
      n = parseInt(Math.random() * m) + 1;
    }
    return n;
  }

  while(g!==n)
  {
    do
    {
      g = parseInt(prompt('Take a guess!'));
    } while(isNaN(g));
    if (g < n)
    {
      alert('higher');
    }
    else if (g > n)
    {
      alert('lower');
    }
    else
    {
      alert('correct!');
    }
  }
}

ลดขนาด(312) :

function g(m){var g,n=u(confirm('Player pick?'));function u(p){var n;if (p){do{n=parseInt(prompt('Number'))}while(isNaN(n)||!n||n>m)}else{n=parseInt(Math.random()*m)+1}return n}while(g!==n){do{g=parseInt(prompt('Guess'))}while(isNaN(g));if(g<n) alert('higher');else if(g>n) alert('lower');else alert('correct')}}

ขอโทษฉันไม่ได้สังเกต ควรใส่รหัสล่าสุดของคุณไว้ด้านบน (นอกจากนี้ฉันไม่สามารถทำให้มันทำงานได้อย่างถูกต้อง: - /)
Eelvex

@Elex: ในขณะที่คุณกำลังพยายามที่จะเรียกใช้โซลูชั่นของฉันสั้นกว่าที่ยอมรับในปัจจุบันอีกครั้ง และคุณควรระบุสตริงที่แน่นอนที่จะใช้เมื่อโต้ตอบกับผู้ใช้ โดยทั่วไปทุกสิ่งที่แมกนัสทำคือใช้การโต้ตอบที่กระชับมากขึ้นซึ่งแน่นอนว่าสั้นกว่า
Joey

ฉันเห็นว่าถูกต้องและโปรแกรมนี้ไม่สามารถจัดการกับกรณีที่มนุษย์เป็นผู้เล่น 1 ได้อย่างถูกต้องหรือไม่? อย่างน้อยฉันก็ไม่เห็นรหัสสำหรับ AI ที่จะคาดเดาตัวเลขและผู้เล่นให้ใส่ "สูง«," ต่ำกว่า "หรือ" ถูกต้อง "ที่ใดก็ได้ ...
Joey

@ โจอี้ฉันรู้สึกว่าหากผู้เล่นเป็นคนแรกที่จะไปพวกเขาจะต้องเลือกตัวเลขเท่านั้น ฉันเดาว่าฉันมีหมอกเล็กน้อยว่าทำไมผู้เล่นคนไหนถึงเลือกที่สูงขึ้นต่ำลงและถูกต้อง
zzzzBov

เพียงทำตามคำแนะนำสำหรับผู้เล่น 1 และ 2 หนึ่งในนั้นคือมนุษย์คนอื่น ๆ ก็คือคอมพิวเตอร์ ไม่มีความแตกต่างในโปรโตคอล แต่ นอกจากนี้คอมพิวเตอร์จะต้องพยายามเดาตัวเลขขณะที่เล่นเป็นผู้เล่นสองคน«อย่างมากหมายความว่าคอมพิวเตอร์ต้องเดาตัวเลข
Joey

3

Python 2.7 334 335 327 314 300 ตัวอักษร (การเล่นกอล์ฟครั้งแรกของฉัน)

(335) ลืมหนีขึ้นบรรทัดใหม่

(327) ลบซ้ำซ้อน 100 สำหรับ randint การเปรียบเทียบอักขระแรกของการตอบกลับแทนที่จะเป็นสตริงทั้งหมด

(314) การพิมพ์ล่าสุดที่ได้รับรางวัล

(300) เปลี่ยนเมื่อผู้เล่นเป็นผู้เล่น 1: เปลี่ยนการเดาหมายเลขเป็นคอมพิวเตอร์

from random import*
i=input
s="Enter number:"
p=i("Player 1/2:")-1
h=100
N=(i(s),randint(1,h))[p]
b=l=0
for _ in[0]*5:
 exec("g=(h+l)/2;r=raw_input('Guessing '+`g`+':')[0];exec('h=g','l=g')[r=='l'];b=r=='c'","g=i(s);b=g==N;print(('higher','lower')[N<g],'correct')[b]")[p]
 if b:break
print 1+b,"won"

2

ขั้นพื้นฐาน, 184

100 INPUT "P1 NUMBER? ";
200 FOR I%=1 TO 5
300 INPUT "P2 GUESS? ";G%
400 INPUT "P1 SENTENCE? ";S$
500 IF S$="CORRECT" THEN 800
600 NEXT I%
700 PRINT "WINNER 1":END
800 PRINT "WINNER 2"

นี่คือรุ่นที่ไม่มี AI


ฉันรู้ว่านี่เป็นคำตอบเก่า แต่ฉันไม่รู้เรื่องนี้แล้วและฉันก็สะดุดเมื่อ - คุณอาจใช้หมายเลขบรรทัดที่สั้นกว่าเช่น 1, 2, 3 ฯลฯ หรือแค่สมมติ QBASIC / FreeBASIC และ ละเว้นพวกเขาอย่างสมบูรณ์
nyuszika7h

@ nyuszika7h มันเป็นการประกวดที่ได้รับความนิยมมากกว่าโค้ดกอล์ฟฉันควรจะไปหาตัวเลขร้อยช่วงทั่วๆไป
JB

มันคือ? มันติดแท็กcode-golfแล้ว
nyuszika7h

ด้วยเงื่อนไขการชนะที่เฉพาะเจาะจงและชัดเจน (และหมัด IMHO)
JB

โอ้ใช่ฉันเห็นแล้ว แต่ลืมไปแล้ว
nyuszika7h

2

Lua 360 Chars

i=io.read p=print I=5 N=100 math.randomseed(os.time())r=math.random p"Play as player one or two?"o=i"*n">1 _=o and p("Input number between 1 and",N)n=o and i"*n"or r(I,N)l,u=1,N for k=1,I do p"Guess!"g=o and r(l,u)or i"*n"p("Guessed",g)if n==g then p"Correct"break elseif n>g then p"Higher"l=g else p"Lower"u=g end end p(o and"I"or"You",n==g and"Won"or"Loose")

รุ่นที่ไม่ใช่กอล์ฟ:

i=io.read
p=print
I=5
N=100
math.randomseed(os.time())      -- Make things less predictable
r=math.random                   
p"Play as player one or two?"
o=i"*n">1
_=o and p("Input number between 1 and",N) -- if one, ask for number
n=o and i"*n"or r(I,N)          -- get number from user or random
l,u=1,N                         -- boundaries for doing "smart" guessing
for k=1,I do
    p"Guess!"
    g=o and r(l,u)or i"*n"      -- get guess (random or input)
    p("Guessed",g)
    if n==g then p"Correct!"break -- break loop if guessed correctly
    elseif n>g then             -- if guess to low
    p"Higher"l=g else           -- print + update boundaries
    p"Lower"u=g end
end
p(o and"I"or"You",n==g and"Won"or"Loose") -- Determine outcome!

2

จาวาสคริ

นี่คือประมาณ 800 ตัวอักษรและรวมถึงการเลือกไบนารีพื้นฐานของคุณ 'AI' สำหรับผู้เล่นคอมพิวเตอร์ครึ่งหนึ่ง ฉันอาจบันทึกตัวละครสักสองสามตัวถ้าฉันกำจัดทุกอย่างออกไปvarแต่ฉันไม่ชอบตัวแปรที่รั่วไหลแม้ในขณะที่โค้ดกอล์ฟ ฉันทำสองขั้นตอน "ถูกต้องหรือไม่" / "สูงกว่านี้หรือไม่" สิ่งที่ยืนยันป๊อปอัปแทนที่จะให้ป๊อปอัปแจ้งเตือนและตรวจสอบ "ถูกต้อง" / "สูงกว่า" / "ต่ำกว่า" ถึงแม้ว่ามันอาจช่วยประหยัดอักขระบางตัวได้ แต่ก็ไม่ได้ตรวจสอบจริงๆ

นอกจากนี้ฉันทดสอบบน Firefox 4 เท่านั้นดังนั้นฉันไม่รู้ว่าบางสิ่งที่ฉันทำงานอย่างสม่ำเสมอโดยเฉพาะอย่างยิ่งการรวมอินพุตที่ไม่ถูกต้องแยกเป็น NaN เป็นค่าเริ่มต้นในwpฟังก์ชันของฉัน

function game(N, I) {
    var wa=function(a){window.alert(a)};
    var wc=function(s){return window.confirm(s)};
    var wp=function(s){return window.prompt(s)};
    var ri=function(s,d){return parseInt(wp(s),10)||d};
    var m=function(l,h){return Math.round((h+l)/2)};
    N = N || pd("Highest possible number?",100);
    I = I || pd("How many guesses?",5);
    var p = wc("Be player 2?");
    var s = [1,N];
    var a = p?Math.ceil(Math.random()*N):Math.min(N,Math.max(1,ri("Pick a number from 1 to " + N,1)));
    var w = 0;
    var g = 0;
    if(p) while(I--){while(!(g = ri("Guess:",0)));if(g==a){wa("correct");w=p+1;break;}else{wa(g<a?"higher":"lower")}}
    else while(I--){g = m(s[0],s[1]);if(wc("Is "+g+" correct?")) { w=p+1;break;} else if (wc("Is "+g+" higher?")){s=[s[0],g];}else{s=[g,s[1]];}}
    if(!w)w=!p+1;
    wa("Player " + w + " wins!");
}
game(100,5);

2

Java, 1886 ตัวอักษร

import java.io.*;import java.util.*;import java.util.regex.*;public class GuessGame {int L=1;int H=100;int G=5;int N;String HS="higher";String LS="lower";String CS="correct";public static void main(String[] args){if (args.length==2)new GuessGame(Integer.parseInt(args[0]),Integer.parseInt(args[1])).play();else if(args.length==0)new GuessGame(100,5).play();else System.out.println("usage GuessGame HighInteger NumberGuess");}GuessGame(int H,int G){this.H = H;this.G = G;}void play(){int pNum=getInt("Play As Player 1 or Player 2?","1|2");if(pNum==1)playP2();else playP1();System.out.println("The number was "+N);}int getInt(String pmpt,String val){BufferedReader cin=new BufferedReader(new InputStreamReader(System.in));int i=0;Pattern p=Pattern.compile(val);boolean fnd=false;String ln="";try{while(!fnd){System.out.println(pmpt);ln=cin.readLine();Matcher m=p.matcher(ln);fnd=m.find();}i=Integer.parseInt(ln);} catch (Exception ex) {}return i;}String processGuess(int g){if(N>g)return HS;else if(N<g)return LS;else return CS;}void playP1(){N=new Random().nextInt(H);for(;G>0;G--){String rslt=processGuess(getInt("Player 2, enter your guess:","\\d?"));System.out.println(rslt);if(rslt.equals(CS)){System.out.println("Player 2 wins!");break;}}}void playP2() {N=getInt("Player 1, enter your number:", "\\d+");int max=H;int min=L;int nextGuess=min+(max-min)/2;for (;G>0;G--){System.out.println("Player 2, enter your guess:" + nextGuess);String rslt=processGuess(nextGuess);System.out.println(rslt);if(rslt.equals(HS)){min=nextGuess+1;nextGuess=fuzzify(nextGuess+(max-nextGuess)/2,min,max);}if (rslt.equals(LS)){max=nextGuess-1;nextGuess=fuzzify(nextGuess-(nextGuess-min)/2,min,max);}if(rslt.equals(CS)){System.out.println("Player 2 wins!");break;}}}int fuzzify(int i,int mn,int mx){int fz=new Random().nextInt(3);if(fz==1)return Math.max(mn,--i);if(fz==2)return Math.min(mx,++i);return i;}}

ไม่ใช่รุ่น golfed:

import java.io.*;
import java.util.*;
import java.util.regex.*;
public class GuessGame {
    int L = 1;
    int H = 100;
    int G = 5;
    int N;
    String HS = "higher";
    String LS = "lower";
    String CS = "correct";
    public static void main(String[] args) {
        if (args.length == 2)
            new GuessGame(Integer.parseInt(args[0]), Integer.parseInt(args[1])).play();
        else if (args.length == 0)
            new GuessGame(100, 5).play();
        else
            System.out.println("usage GuessGame HighInteger NumberGuess");
    }
    GuessGame(int H, int G) {
        this.H = H;
        this.G = G;
    }
    void play() {
        int pNum = getInt("Play As Player 1 or Player 2?","1|2");
        if (pNum == 1)
            playP2();
        else
            playP1();
        System.out.println("The number was " + N);
    }
    int getInt(String pmpt, String val) {
        BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));
        int i = 0;
        Pattern p = Pattern.compile(val);
        boolean fnd = false;
        String ln = "";
        try {
            while (!fnd) {
                System.out.println(pmpt);
                ln = cin.readLine();
                Matcher m = p.matcher(ln);
                fnd = m.find();
            }
            i = Integer.parseInt(ln);
        } catch (Exception ex) {}
        return i;
    }
    String processGuess(int g) {
        if (N > g)
            return HS;
        else if (N < g)
            return LS;
        else
            return CS;
    }
    void playP1() {
        N = new Random().nextInt(H);
        for (; G > 0; G--) {
            String rslt = processGuess(getInt("Player 2, enter your guess:", "\\d?"));
            System.out.println(rslt);
            if (rslt.equals(CS)) {
                System.out.println("Player 2 wins!");
                break;
            }
        }
    }
    void playP2() {
        N = getInt("Player 1, enter your number:", "\\d+");
        int max = H;
        int min = L;
        int nextGuess = min + (max - min) / 2;
        for (; G > 0; G--) {
            System.out.println("Player 2, enter your guess:" + nextGuess);
            String rslt = processGuess(nextGuess);
            System.out.println(rslt);
            if (rslt.equals(HS)) {
                min = nextGuess + 1;
                nextGuess = fuzzify(nextGuess + (max - nextGuess) / 2, min, max);
            }
            if (rslt.equals(LS)) {
                max = nextGuess - 1;
                nextGuess = fuzzify(nextGuess - (nextGuess - min) / 2, min, max);
            }
            if (rslt.equals(CS)) {
                System.out.println("Player 2 wins!");
                break;
            }
        }
    }
    int fuzzify(int i, int mn, int mx) {
        int fz = new Random().nextInt(3);
        if (fz == 1)
            return Math.max(mn, --i);
        if (fz == 2)
            return Math.min(mx, ++i);
        return i;
    }
}

ครั้งแรกของทั้งหมด: ที่ไม่ได้คอมไพล์ในขณะที่ Java ไม่มีสตริงหลายบรรทัด คุณไม่สามารถคาดหวังที่จะทำลายเส้นตรงกลางของสตริงและที่จะทำงาน
Joey

ตกลงฉันหยุดพยายามทำให้มันดูดีบนหน้าจอและวางบรรทัดเดียว
Joe Zitzelberger

1
นอกจากนี้ (ประหยัดในวงเล็บ): ชั้นสามารถตั้งชื่อด้วยตัวอักษรเดียว (40) มีช่องว่างที่ไม่จำเป็นมากมายในนั้น (80) คุณสามารถยุบประกาศของหลายตัวแปรประเภทเดียวกันเช่นint a=5,b=10(34) คุณสามารถตั้งชื่ออาร์กิวเมนต์ในตัวสร้างที่แตกต่างจากฟิลด์เพื่อหลีกเลี่ยงthis.(10) คุณสามารถกำจัดได้Lทั้งหมดเนื่องจากมันจะอยู่ที่1(4) คุณสามารถออกจากการเริ่มต้นHและGได้รับการตั้งค่าในตัวสร้างต่อไป (6) คุณสามารถใช้ชื่อหนึ่งตัวอักษรสำหรับตัวแปรและวิธีการทั้งหมด (235)
Joey

จริง แต่นั่นคงไม่สามารถอ่านได้ทั้งหมด นี่คือจุดที่ฉันเห็น code-golf กลายเป็นโบว์ลิ่ง - code จริงๆ แต่ถ้าฉันหาเวลาฉันจะขัดมันคืนนี้
Joe Zitzelberger

1
การแก้ไขสำหรับตัวเลขก่อนหน้า: (272) คุณสามารถเขียนfuzzifyซ้ำได้โดยใช้โอเปอเรเตอร์ที่มีเงื่อนไข (20) คุณสามารถอินไลน์BufferedReaderในgetInt(19) คุณสามารถใช้String#matchesเพื่อหลีกเลี่ยงPatternและMatcherในgetInt(48) คุณสามารถใช้โอเปอเรเตอร์ที่มีเงื่อนไขได้processGuessเช่นกัน (30) ตอนนี้ฉันลงไปที่ 1,360 แทนการเริ่มต้นของคุณ 1953
Joey

2

วิทยุนาฬิกาปลุก 5756 บิต (2159 ไบต์)

ใกล้จะถึงนาฬิกาปลุกที่อยู่ใกล้คุณ! บรรทัดใหม่มีไว้เพื่อให้สามารถอ่านได้เท่านั้น ค่า ASCII จะถูกใช้เป็นครั้งคราวแทนการแสดงตัวเลขที่แท้จริงบนหน้าจอ เหมาะกับสเป็ค ค่าเริ่มต้นการใช้งานสำหรับการและA Iในอินพุตแรกใช้ NULL เพื่อเป็นตัวทายมิฉะนั้นคุณจะตั้งค่าตัวเลข PADSIZE ต้องเป็น 4! เซลล์ต้องมีขนาด 7 บิตและใช้งานได้! ทัวริงสมบูรณ์! เอาท์พุทhigher, lower, correct, และyou wonyou lost

}+>,[,>>+++++++[>>>>>>>+++++++>+++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++]>>>>>>>++++++.>>>>>>>++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++[+++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++>+++>>>>>>>]>++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++.++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.++++++.++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++[++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++>+>>>>>>>]>+++.+++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++[
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++>++++>>>>>>>]>+++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++.+++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++.[+]+][++++[+++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++>,[+[+++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++>++>>>>>>>]>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+++.++++++++.[+
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++>+++>>>>>>>]>.+++++++++++++.[+
]+][++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++[++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++>+>>>>>>>]>++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
++++++++++++.+++..++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++.++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++.+++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++[+
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++>+>>>>>>>]>+++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++.>>>>>>>[+]>>>>>>>+++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++]]][>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++[++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++>+++>>>>>>>]>+++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++.+++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.++++++.+++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++[+++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++>+>>>>>>>]>+++.++[+++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>+
+>>>>>>>]>.+++.++++.+.>>>>>>>[+]+][+++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++[++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++>+++>>>>>>>]>+++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++.+++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
++++++.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++[+++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++>+>>>>>>>]>+++.++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++[+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>++++>>>>>>>]>++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++.++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.]

1

ทับทิม 1.9 (298)

b=->f{puts "> "+f;gets}
a=->f{b[f].to_i}
q=a["Player 1 or 2?"]
i,j,g=100,1
n=q<2?a["Enter number:"]:rand(i)+j
5.times{q<2?(g=j+(i-j)/2
c=b["Guessing, #{g}"]
c[0]==?c?break: c[0]==?h?j=g :i=g):(
g=a["Guess:"]
puts g==n ?"correct":g<n ?"higher":"lower"
g==n&&break)}
puts "Player #{g==n ?2:1} won!"

คำแนะนำที่ไม่ค่อยเป็นมิตร


ดีมาก! ถ้าเพียง แต่คุณมีการสุ่มบางอย่างเมื่อ AI เป็นผู้เล่น 2 ...
Eelvex

@Eevenx พ่ายแพ้ 30 ตัวอักษร
zzzzBov

1

ฉันรู้สึกว่าจำเป็นต้องทำ Java เพื่อความยุติธรรม :)

Java - 486 437 421 414

แข็งแรงเล่นกอล์ฟ

import java.util.*;class GuessANumber{static<T>void p(T p){System.out.println(p);}static int i(){return new Scanner(System.in).nextInt();}public static void main(String[]a){int c,g,f=101,i=0;p("Pick (1) or guess (2)?");c=i();if(c==1)p("Pick a number (1-100)");g=c==1?i():new Random().nextInt(100);while(f!=g&&i++<5){p("Guess:");f=c==2?i():f>g?f/2:f+f/2;if(c==1)p(f);p(f>g?"lower":"higher");}if(f==g)p("correct");}}

Ungolfed เล็กน้อย

import java.util.*;

class a{

    static<T>void p(T p){
        System.out.println(p);
    }

    static int i(){
        return new Scanner(System.in).nextInt();
    }

    public static void main(String[]a){
        int c,g,f=101,i=0;
        p("Pick (1) or guess (2)?");
        c=i();
        if(c==1)p("Pick a number (1-100)");
        g=c==1?i():new Random().nextInt(100);
        while(f!=g&&i++<5){
            p("Guess:");
            f=c==2?i():f>g?f/2:f+f/2;
            if(c==1)p(f);
            p(f>g?"lower":"higher");
        }
        if(f==g)p("correct");
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.