Initial data commit
This commit is contained in:
parent
72d218235f
commit
f23f22d71c
199087 changed files with 3378941 additions and 0 deletions
3
Task/Penneys-game/00-META.yaml
Normal file
3
Task/Penneys-game/00-META.yaml
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
---
|
||||
from: http://rosettacode.org/wiki/Penney's_game
|
||||
note: Games
|
||||
29
Task/Penneys-game/00-TASK.txt
Normal file
29
Task/Penneys-game/00-TASK.txt
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
[[wp:Penney's_game|Penney's game]] is a game where two players bet on being the first to see a particular sequence of [[wp:Coin_flipping|heads or tails]] in consecutive tosses of a [[wp:Fair_coin|fair coin]].
|
||||
|
||||
It is common to agree on a sequence length of three then one player will openly choose a sequence, for example:
|
||||
Heads, Tails, Heads, or '''HTH''' for short.
|
||||
The other player on seeing the first players choice will choose his sequence. The coin is tossed and the first player to see his sequence in the sequence of coin tosses wins.
|
||||
|
||||
|
||||
;Example:
|
||||
One player might choose the sequence '''HHT''' and the other '''THT'''.
|
||||
|
||||
Successive coin tosses of '''HTTHT''' gives the win to the second player as the last three coin tosses are his sequence.
|
||||
|
||||
|
||||
;Task
|
||||
Create a program that tosses the coin, keeps score and plays Penney's game against a human opponent.
|
||||
* Who chooses and shows their sequence of three should be chosen randomly.
|
||||
* If going first, the computer should randomly choose its sequence of three.
|
||||
* If going second, the computer should automatically play [[wp:Penney's_game#Analysis_of_the_three-bit_game|the optimum sequence]].
|
||||
* Successive coin tosses should be shown.
|
||||
|
||||
<br>
|
||||
Show output of a game where the computer chooses first and a game where the user goes first here on this page.
|
||||
|
||||
|
||||
;See also
|
||||
* [https://www.youtube.com/watch?v=OcYnlSenF04 The Penney Ante Part 1] (Video).
|
||||
* [https://www.youtube.com/watch?v=U9wak7g5yQA The Penney Ante Part 2] (Video).
|
||||
<br><br>
|
||||
|
||||
28
Task/Penneys-game/11l/penneys-game.11l
Normal file
28
Task/Penneys-game/11l/penneys-game.11l
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
V first = random:choice([1B, 0B])
|
||||
|
||||
V you = ‘’
|
||||
V me = ‘’
|
||||
V ht = ‘HT’ // to get round ‘bug in MSVC 2017’[https://developercommunity.visualstudio.com/t/bug-with-operator-in-c/565417]
|
||||
I first
|
||||
me = random:sample(Array(‘HT’ * 3), 3).join(‘’)
|
||||
print(‘I choose first and will win on first seeing #. in the list of tosses’.format(me))
|
||||
L you.len != 3 | any(you.map(ch -> ch !C :ht)) | you == me
|
||||
you = input(‘What sequence of three Heads/Tails will you win with: ’)
|
||||
E
|
||||
L you.len != 3 | any(you.map(ch -> ch !C :ht))
|
||||
you = input(‘After you: What sequence of three Heads/Tails will you win with: ’)
|
||||
me = (I you[1] == ‘T’ {‘H’} E ‘T’)‘’you[0.<2]
|
||||
print(‘I win on first seeing #. in the list of tosses’.format(me))
|
||||
|
||||
print("Rolling:\n ", end' ‘’)
|
||||
V rolled = ‘’
|
||||
L
|
||||
rolled ‘’= random:choice(‘HT’)
|
||||
print(rolled.last, end' ‘’)
|
||||
I rolled.ends_with(you)
|
||||
print("\n You win!")
|
||||
L.break
|
||||
I rolled.ends_with(me)
|
||||
print("\n I win!")
|
||||
L.break
|
||||
sleep(1)
|
||||
87
Task/Penneys-game/Amazing-Hopper/penneys-game.hopper
Normal file
87
Task/Penneys-game/Amazing-Hopper/penneys-game.hopper
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
#include <jambo.h>
|
||||
|
||||
#define Getanuppercasecharinto(_X_) Getchar(_X_),Let( _X_ := Ucase(_X_) )
|
||||
#define Isnotvalidin(_X_) Not( Occurs in (_X_) )
|
||||
#define NOELIGEPCDESPUESDETI 0
|
||||
#define ELIGEPCDESPUESDETI 1
|
||||
|
||||
Main
|
||||
Set break
|
||||
Get total args
|
||||
If ( Is equal to '2' )
|
||||
largo=0
|
||||
Let ( largo := Get if( Argnum(2) Is less than '3', 3, Argnum(2) ) )
|
||||
OTRO="S"
|
||||
|
||||
Cursor off
|
||||
Loop
|
||||
P="", C="", S="", L=0
|
||||
Cls
|
||||
Locate(1,1), Printnl ("***** Penney's Game *****")
|
||||
|
||||
If ( Geq( Rand(1), 0.5) )
|
||||
Gosub ' Yo tiro ', Set 'NO ELIGE PC DESPUES DE TI',Gosub ' Tú tiras '
|
||||
Else
|
||||
Set 'ELIGE PC DESPUES DE TI', Gosub ' Tú tiras '
|
||||
End If
|
||||
|
||||
// a jugar:
|
||||
G="", SW=1
|
||||
Loop
|
||||
Let( G := Cat( G, Get if( Geq( Rand(1), 0.5), "T", "H" ) ) )
|
||||
Locate( 6, 1 ), Printnl( "Tiradas: ", G )
|
||||
|
||||
Continue if ( Less ( Len (G) ---Backup to 'L'---, 3) )
|
||||
|
||||
Let ( S := Right( Sub(L, Minus one 'largo') , G) )
|
||||
|
||||
If ( Eq( S, P ) )
|
||||
Set ("TU GANAS!!"), SW=0
|
||||
Else If (Eq( S, C ) )
|
||||
Set ("YO GANO!!"), SW=0
|
||||
End If
|
||||
Prnl
|
||||
Sleep(1)
|
||||
Back if( SW ) is not zero
|
||||
Printnl ( Utf8("¿Otro juego? S/* ") )
|
||||
Getchar(OTRO)
|
||||
While( Eq (OTRO, "S") )
|
||||
|
||||
Cursor on
|
||||
Else
|
||||
Printnl("Modo de uso: hopper penny.jambo <n>\ndonde \"n\" es el largo de la secuencia")
|
||||
End If
|
||||
End
|
||||
|
||||
Subrutines
|
||||
|
||||
Define ' Yo tiro '
|
||||
Locate(4,1), Print( "Yo elijo... " )
|
||||
i=largo
|
||||
Loop
|
||||
Let( C := Cat( C, Get if( Geq( Rand(1), 0.5), "T", "H" ) ) )
|
||||
--i
|
||||
Back if (i) is positive
|
||||
Printnl (C)
|
||||
|
||||
Return
|
||||
|
||||
Define ' Tú tiras, elige pc '
|
||||
Locate(3,1), Printnl ( Utf8("Tú eliges...") )
|
||||
i=largo, c=0
|
||||
Loop
|
||||
Get an uppercase char into 'c'
|
||||
Continue if ( var(c) Is not valid in ("HT") )
|
||||
Let( P:=Cat(P,c) )
|
||||
Loccol(13), Printnl(P)
|
||||
--i
|
||||
Back if (i) is positive
|
||||
|
||||
If ( elige pc )
|
||||
Let (C := P)
|
||||
[2] Get from (C)
|
||||
Set if( Is equal to ("H"), "T", "H" )
|
||||
Cput (C)
|
||||
Locate(4,1), Print( "Yo elijo... ", C )
|
||||
End If
|
||||
Return
|
||||
70
Task/Penneys-game/Applesoft-BASIC/penneys-game.basic
Normal file
70
Task/Penneys-game/Applesoft-BASIC/penneys-game.basic
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
100 R = RND ( - 1 * ( PEEK (78) + 256 * PEEK (79))): REM RANDOMIZE
|
||||
110 DEF FN R(R) = INT ( RND (1) * R) * (3 ^ (R = 8)) + 1
|
||||
120 READ P$
|
||||
130 DATA HTHHHHHHTHTTTHHTHTTTHTTT
|
||||
140 LET M$ = CHR$ (13)
|
||||
150 PRINT "WELCOME TO PENNEY'S GAME!"M$
|
||||
160 INPUT "HOW MANY ROUNDS WOULD YOU LIKE TO PLAY? ";ROUNDS%
|
||||
170 PRINT M$"OK, LET'S PLAY "ROUNDS%" ROUNDS."
|
||||
180 FOR COUNT = 1 TO ROUNDS%
|
||||
190 PRINT M$"*** ROUND #"COUNT" ***"M$
|
||||
200 ON FN R(2) GOSUB 300,400
|
||||
210 PRINT "LET'S GO!"M$
|
||||
220 GOSUB 450"PLAY ROUND
|
||||
230 INPUT "PRESS RETURN TO GO ON...";N$
|
||||
240 NEXT COUNT
|
||||
250 PRINT M$"*** END RESULT ***"M$
|
||||
260 IF YOU > ME THEN PRINT "CONGRATULATIONS! YOU WON!"
|
||||
270 IF ME > YOU THEN PRINT "HOORAY! I WON"
|
||||
280 IF ME = YOU THEN PRINT "COOL, WE TIED."
|
||||
290 END
|
||||
|
||||
300 ME$ = MID$ (P$, FN R(8),3): REM RANDOM SEQUENCE
|
||||
310 PRINT "I'LL PICK FIRST THIS TIME."M$" MY SEQUENCE IS "ME$"."
|
||||
320 FOR REP = 0 TO 1 STEP 0
|
||||
330 PRINT "WHAT SEQUENCE DO YOU WANT?"
|
||||
340 GOSUB 590"GET YOUR SEQUENCE
|
||||
350 LET REP = YOU$ < > ME$
|
||||
360 IF NOT REP THEN PRINT "HEY, THAT'S MY SEQUENCE! THINK FOR YOURSELF!"
|
||||
370 NEXT REP
|
||||
380 PRINT YOU$", HUH? SOUNDS OK TO ME."
|
||||
390 RETURN
|
||||
|
||||
400 PRINT "YOU PICK FIRST THIS TIME."
|
||||
410 GOSUB 590"GET YOUR SEQUENCE
|
||||
420 LET ME$ = MID$ ("HT",( MID$ (YOU$,2,1) = "H") + 1,1) + LEFT$ (YOU$,2)
|
||||
430 PRINT "OK, SO YOU PICKED "YOU$M$M$"MY SEQUENCE WILL BE "ME$M$
|
||||
440 RETURN
|
||||
|
||||
450 T0SSE$ = MID$ (P$, FN R(8),3): REM RANDOM SEQUENCE
|
||||
460 PRINT "TOSSING THE COIN: "M$ MID$ (T0SSE$,2);
|
||||
470 FOR T0SS = 0 TO 1 STEP 0
|
||||
480 LET T0SSE$ = RIGHT$ (T0SSE$,2) + MID$ ("HT", FN R(2),1)
|
||||
490 PRINT MID$ (T0SSE$,3);
|
||||
500 IF YOU$ = T0SSE$ THEN 530"YOU WON
|
||||
510 IF ME$ = T0SSE$ THEN 560"I WON
|
||||
520 NEXT T0SS
|
||||
|
||||
530 YOU = YOU + 1
|
||||
540 PRINT M$M$"CONGRATULATIONS! YOU WON THIS ROUND."M$"YOUR NEW SCORE IS "YOU"."
|
||||
550 RETURN
|
||||
|
||||
560 ME = ME + 1
|
||||
570 PRINT M$M$"YAY, I WON THIS ROUND!"M$"MY NEW SCORE IS "ME"."
|
||||
580 RETURN
|
||||
|
||||
590 YOU$ = ""
|
||||
600 PRINT "TYPE 3 LETTERS H OR T: "
|
||||
610 FOR I = 1 TO 3
|
||||
620 LET V$ = "HT"
|
||||
630 GOSUB 670"GET VALID KEYPRESS
|
||||
640 LET YOU$ = YOU$ + C$
|
||||
650 NEXT I
|
||||
660 LET V$ = M$ + M$
|
||||
670 FOR C = 0 TO 1 STEP 0
|
||||
680 GET C$
|
||||
690 IF ASC (C$) > 95 THEN C$ = CHR$ ( ASC (C$) - 32)
|
||||
700 LET C = C$ = LEFT$ (V$,1) OR C$ = MID$ (V$,2)
|
||||
710 NEXT C
|
||||
720 PRINT C$;
|
||||
730 RETURN
|
||||
81
Task/Penneys-game/AutoHotkey/penneys-game.ahk
Normal file
81
Task/Penneys-game/AutoHotkey/penneys-game.ahk
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
Gui, font, s12
|
||||
Gui, add, text, w90, Computer:
|
||||
loop, 3
|
||||
Gui, add, button, x+10 h30 w30 vCB%A_Index%
|
||||
Gui, add, edit, xs w240 R3 vSequence
|
||||
Gui, add, text, w90, Human:
|
||||
loop, 3
|
||||
Gui, add, button, x+10 h30 w30 vHB%A_Index% gHumButton, H
|
||||
Gui, add, button, xm gToss, toss
|
||||
Gui, add, button, x+10 gReset, Reset
|
||||
Gui, show,, Penney's game
|
||||
CompSeq := HumSeq := Seq := GameEnd := ""
|
||||
|
||||
RandomStart:
|
||||
Random, WhoStarts, 1, 2
|
||||
if (WhoStarts=1)
|
||||
gosub, CompButton
|
||||
return
|
||||
;-----------------------------------------------
|
||||
CompButton:
|
||||
if CompSeq
|
||||
return
|
||||
Loop, 3
|
||||
{
|
||||
Random, coin, 1, 2
|
||||
GuiControl,, CB%A_Index%, % coin=1?"H":"T"
|
||||
CompSeq .= coin=1?"H":"T"
|
||||
}
|
||||
return
|
||||
;-----------------------------------------------
|
||||
HumButton:
|
||||
if HumSeq
|
||||
return
|
||||
GuiControlGet, B,, % A_GuiControl
|
||||
GuiControl,, % A_GuiControl, % B="H"?"T":"H"
|
||||
return
|
||||
;-----------------------------------------------
|
||||
Toss:
|
||||
if GameEnd
|
||||
return
|
||||
if !HumSeq
|
||||
{
|
||||
loop 3
|
||||
{
|
||||
GuiControlGet, B,, HB%A_Index%
|
||||
HumSeq .= B
|
||||
}
|
||||
if (CompSeq = HumSeq)
|
||||
{
|
||||
MsgBox, 262160, Penney's game, Human's Selection Has to be different From Computer's Selection`nTry Again
|
||||
HumSeq := ""
|
||||
return
|
||||
}
|
||||
}
|
||||
if !CompSeq
|
||||
{
|
||||
CompSeq := (SubStr(HumSeq,2,1)="H"?"T":"H") . SubStr(HumSeq,1,2)
|
||||
loop, Parse, CompSeq
|
||||
GuiControl,, CB%A_Index%, % A_LoopField
|
||||
}
|
||||
|
||||
Random, coin, 1, 2
|
||||
Seq .= coin=1?"H":"T"
|
||||
GuiControl,, Sequence, % seq
|
||||
if (SubStr(Seq, -2) = HumSeq)
|
||||
MsgBox % GameEnd := "Human Wins"
|
||||
else if (SubStr(Seq, -2) = CompSeq)
|
||||
MsgBox % GameEnd := "Computer Wins"
|
||||
return
|
||||
;-----------------------------------------------
|
||||
Reset:
|
||||
loop, 3
|
||||
{
|
||||
GuiControl,, CB%A_Index%
|
||||
GuiControl,, HB%A_Index%, H
|
||||
}
|
||||
GuiControl,, Sequence
|
||||
CompSeq := HumSeq := Seq := GameEnd := ""
|
||||
gosub, RandomStart
|
||||
return
|
||||
;-----------------------------------------------
|
||||
69
Task/Penneys-game/BASIC256/penneys-game.basic
Normal file
69
Task/Penneys-game/BASIC256/penneys-game.basic
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
global jugador, computador, secuencia
|
||||
jugador = "" : computador = ""
|
||||
|
||||
function SecuenciaJugador(secuencia)
|
||||
do
|
||||
valido = TRUE
|
||||
print chr(10) + "Ingresa una secuencia de 3 opciones, cada una de ellas H o T:";
|
||||
input " > ", secuencia
|
||||
secuencia = upper(secuencia)
|
||||
if length(secuencia) <> 3 then valido = FALSE
|
||||
if secuencia = computador then print "Pero no la misma que yo..."+ chr(10): valido = FALSE
|
||||
if valido then
|
||||
for i = 1 to 3
|
||||
opcion = mid(secuencia, i, 1)
|
||||
if opcion <> "H" and opcion <> "T" then valido = FALSE
|
||||
next i
|
||||
end if
|
||||
until valido
|
||||
SecuenciaJugador = secuencia
|
||||
end function
|
||||
|
||||
function LanzamientoCPU()
|
||||
secuencia = ""
|
||||
computador =""
|
||||
for i = 1 to 3
|
||||
opcion = rand
|
||||
if opcion < .5 then secuencia += "H" else secuencia += "T"
|
||||
next i
|
||||
LanzamientoCPU = secuencia
|
||||
end function
|
||||
|
||||
do
|
||||
cls
|
||||
print "*** Penney's Game ***" + chr(10)
|
||||
if rand < .5 then
|
||||
print "Empiezas... ";
|
||||
jugador = SecuenciaJugador(jugador)
|
||||
computador = LanzamientoCPU()
|
||||
if jugador = computador then computador = LanzamientoCPU()
|
||||
print "Yo gano al ver "; computador; " por primera vez en la lista de lanzamientos..."
|
||||
else
|
||||
computador = LanzamientoCPU()
|
||||
print "Elijo primero y gano al ver "; computador; " por primera vez en la lista de lanzamientos..."
|
||||
jugador = SecuenciaJugador(jugador)
|
||||
end if
|
||||
print: print "Lanzamientos..."
|
||||
secuencia = ""
|
||||
winner = FALSE
|
||||
do
|
||||
pause 1
|
||||
if rand <= .5 then
|
||||
secuencia += "H"
|
||||
print "H ";
|
||||
else
|
||||
print "T ";
|
||||
secuencia += "T"
|
||||
end if
|
||||
if right(secuencia, 3) = jugador then print: print "¡Felicidades! ¡Ganaste!": winner = TRUE
|
||||
if right(secuencia, 3) = computador then print: print "¡Yo gano!": winner = TRUE
|
||||
until winner
|
||||
do
|
||||
valido = FALSE
|
||||
print
|
||||
input "¿Otra partida? (S/N) ", otra
|
||||
if instr("SsNn", otra) then valido = TRUE
|
||||
until valido
|
||||
until upper(otra) = "N"
|
||||
print "¡Gracias por jugar!"
|
||||
end
|
||||
81
Task/Penneys-game/BBC-BASIC/penneys-game.basic
Normal file
81
Task/Penneys-game/BBC-BASIC/penneys-game.basic
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
REM >penney
|
||||
PRINT "*** Penney's Game ***"
|
||||
REPEAT
|
||||
PRINT ' "Heads you pick first, tails I pick first."
|
||||
PRINT "And it is... ";
|
||||
WAIT 100
|
||||
ht% = RND(0 - TIME) AND 1
|
||||
IF ht% THEN
|
||||
PRINT "heads!"
|
||||
PROC_player_chooses(player$)
|
||||
computer$ = FN_optimal(player$)
|
||||
PRINT "I choose "; computer$; "."
|
||||
ELSE
|
||||
PRINT "tails!"
|
||||
computer$ = FN_random
|
||||
PRINT "I choose "; computer$; "."
|
||||
PROC_player_chooses(player$)
|
||||
ENDIF
|
||||
PRINT "Starting the game..." ' SPC 5;
|
||||
sequence$ = ""
|
||||
winner% = FALSE
|
||||
REPEAT
|
||||
WAIT 100
|
||||
roll% = RND AND 1
|
||||
IF roll% THEN
|
||||
sequence$ += "H"
|
||||
PRINT "H ";
|
||||
ELSE
|
||||
PRINT "T ";
|
||||
sequence$ += "T"
|
||||
ENDIF
|
||||
IF RIGHT$(sequence$, 3) = computer$ THEN
|
||||
PRINT ' "I won!"
|
||||
winner% = TRUE
|
||||
ELSE
|
||||
IF RIGHT$(sequence$, 3) = player$ THEN
|
||||
PRINT ' "Congratulations! You won."
|
||||
winner% = TRUE
|
||||
ENDIF
|
||||
ENDIF
|
||||
UNTIL winner%
|
||||
REPEAT
|
||||
valid% = FALSE
|
||||
INPUT "Another game? (Y/N) " another$
|
||||
IF INSTR("YN", another$) THEN valid% = TRUE
|
||||
UNTIL valid%
|
||||
UNTIL another$ = "N"
|
||||
PRINT "Thank you for playing!"
|
||||
END
|
||||
:
|
||||
DEF PROC_player_chooses(RETURN sequence$)
|
||||
LOCAL choice$, valid%, i%
|
||||
REPEAT
|
||||
valid% = TRUE
|
||||
PRINT "Enter a sequence of three choices, each of them either H or T:"
|
||||
INPUT "> " sequence$
|
||||
IF LEN sequence$ <> 3 THEN valid% = FALSE
|
||||
IF valid% THEN
|
||||
FOR i% = 1 TO 3
|
||||
choice$ = MID$(sequence$, i%, 1)
|
||||
IF choice$ <> "H" AND choice$ <> "T" THEN valid% = FALSE
|
||||
NEXT
|
||||
ENDIF
|
||||
UNTIL valid%
|
||||
ENDPROC
|
||||
:
|
||||
DEF FN_random
|
||||
LOCAL sequence$, choice%, i%
|
||||
sequence$ = ""
|
||||
FOR i% = 1 TO 3
|
||||
choice% = RND AND 1
|
||||
IF choice% THEN sequence$ += "H" ELSE sequence$ += "T"
|
||||
NEXT
|
||||
= sequence$
|
||||
:
|
||||
DEF FN_optimal(sequence$)
|
||||
IF MID$(sequence$, 2, 1) = "H" THEN
|
||||
= "T" + LEFT$(sequence$, 2)
|
||||
ELSE
|
||||
= "H" + LEFT$(sequence$, 2)
|
||||
ENDIF
|
||||
103
Task/Penneys-game/Batch-File/penneys-game.bat
Normal file
103
Task/Penneys-game/Batch-File/penneys-game.bat
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
::
|
||||
::Penney's Game Task from Rosetta Code Wiki
|
||||
::Batch File Implementation
|
||||
::
|
||||
::Please Directly Open the Batch File to play...
|
||||
::
|
||||
|
||||
@echo off
|
||||
setlocal enabledelayedexpansion
|
||||
title The Penney's Game Batch File
|
||||
|
||||
set cpu=0&set you=0
|
||||
cls
|
||||
echo.
|
||||
echo Penney's Game
|
||||
echo Batch File Implementation
|
||||
|
||||
:main
|
||||
set you_bet=&set cpu_bet=
|
||||
echo.&echo --------------------------------------------------------&echo.
|
||||
echo CPU's Score: %cpu% Your Score: %you%
|
||||
echo.
|
||||
<nul set /p "dummy=Heads I start, Tails you start..."
|
||||
set /a startrnd=%random%%%2
|
||||
set firsttoss=Tails&set func=optimal
|
||||
if %startrnd%==1 (set firsttoss=Heads&set func=rndbet)
|
||||
ping -n 3 localhost >nul
|
||||
<nul set /p "dummy=. %firsttoss%^!"
|
||||
echo.&echo.
|
||||
goto %func%
|
||||
|
||||
:rndbet
|
||||
set /a "seq1=%random%%%2","seq2=%random%%%2","seq3=%random%%%2"
|
||||
set binary=%seq1%%seq2%%seq3%
|
||||
set cpu_bet=%binary:1=H%
|
||||
set cpu_bet=%cpu_bet:0=T%
|
||||
echo I will bet first. So, my bet sequence will be %cpu_bet%.
|
||||
:again1
|
||||
set /p "you_bet=What will be your bet sequence? "
|
||||
call :validate again1
|
||||
echo.&echo So, you're feeling lucky on %you_bet%. We'll see...
|
||||
goto succesivetossing
|
||||
|
||||
:optimal
|
||||
echo Ok. You will bet first.
|
||||
:again2
|
||||
set /p "you_bet=What will be your bet sequence? "
|
||||
call :validate again2
|
||||
set seq1=%you_bet:~0,1%&set seq2=%you_bet:~1,1%
|
||||
set new_seq1=T
|
||||
if /i %seq2%==T set new_seq1=H
|
||||
set cpu_bet=%new_seq1%%seq1%%seq2%
|
||||
echo.&echo Hmm... My bet will be %cpu_bet%. We'll see who's lucky...
|
||||
|
||||
:succesivetossing
|
||||
set toses=&set cnt=0
|
||||
echo.
|
||||
<nul set /p "dummy=Tosses: "
|
||||
:tossloop
|
||||
call :tossgen
|
||||
<nul set /p dummy=%toss%
|
||||
ping -n 2 localhost >nul
|
||||
set /a newline=%cnt%%%60
|
||||
if %newline%==59 (
|
||||
echo.
|
||||
<nul set /p "dummy=. "
|
||||
)
|
||||
if "%toses:~-3,3%"=="%cpu_bet%" goto iwin
|
||||
if "%toses:~-3,3%"=="%you_bet%" goto uwin
|
||||
set /a cnt+=1&goto tossloop
|
||||
|
||||
:tossgen
|
||||
set /a rand=%random%%%2
|
||||
set toss=T
|
||||
if %rand%==0 set toss=H
|
||||
set toses=%toses%%toss%
|
||||
goto :EOF
|
||||
|
||||
:iwin
|
||||
set /a cpu+=1&set newgame=
|
||||
echo.&echo.
|
||||
echo I Win^^! Better Luck Next Time...
|
||||
echo.
|
||||
set /p "newgame=[Type Y if U Wanna Beat Me, or Else, Exit...] "
|
||||
if /i "!newgame!"=="Y" goto :main
|
||||
exit
|
||||
|
||||
:uwin
|
||||
set /a you+=1&set newgame=
|
||||
echo.&echo.
|
||||
echo Argh, You Win^^! ...But One Time I'll Beat You.
|
||||
echo.
|
||||
set /p "newgame=[Type Y for Another Game, or Else, Exit...] "
|
||||
if /i "!newgame!"=="Y" goto :main
|
||||
exit
|
||||
|
||||
:validate
|
||||
echo "!you_bet!"|findstr /r /c:"^\"[hHtT][hHtT][hHtT]\"$">nul || (
|
||||
echo [Invalid Input...]&echo.&goto %1
|
||||
)
|
||||
if /i "!you_bet!"=="%cpu_bet%" (echo [Bet something different...]&echo.&goto %1)
|
||||
for %%i in ("t=T" "h=H") do set "you_bet=!you_bet:%%~i!"
|
||||
goto :EOF
|
||||
86
Task/Penneys-game/C++/penneys-game.cpp
Normal file
86
Task/Penneys-game/C++/penneys-game.cpp
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
#include <time.h>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
using namespace std;
|
||||
|
||||
class penney
|
||||
{
|
||||
public:
|
||||
penney()
|
||||
{ pW = cW = 0; }
|
||||
void gameLoop()
|
||||
{
|
||||
string a;
|
||||
while( true )
|
||||
{
|
||||
playerChoice = computerChoice = "";
|
||||
if( rand() % 2 )
|
||||
{ computer(); player(); }
|
||||
else
|
||||
{ player(); computer(); }
|
||||
|
||||
play();
|
||||
|
||||
cout << "[Y] to play again "; cin >> a;
|
||||
if( a[0] != 'Y' && a[0] != 'y' )
|
||||
{
|
||||
cout << "Computer won " << cW << " times." << endl << "Player won " << pW << " times.";
|
||||
break;
|
||||
}
|
||||
cout << endl << endl;
|
||||
}
|
||||
}
|
||||
private:
|
||||
void computer()
|
||||
{
|
||||
if( playerChoice.length() == 0 )
|
||||
{
|
||||
for( int x = 0; x < 3; x++ )
|
||||
computerChoice.append( ( rand() % 2 ) ? "H" : "T", 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
computerChoice.append( playerChoice[1] == 'T' ? "H" : "T", 1 );
|
||||
computerChoice += playerChoice.substr( 0, 2 );
|
||||
}
|
||||
cout << "Computer's sequence of three is: " << computerChoice << endl;
|
||||
}
|
||||
void player()
|
||||
{
|
||||
cout << "Enter your sequence of three (H/T) "; cin >> playerChoice;
|
||||
}
|
||||
void play()
|
||||
{
|
||||
sequence = "";
|
||||
while( true )
|
||||
{
|
||||
sequence.append( ( rand() % 2 ) ? "H" : "T", 1 );
|
||||
if( sequence.find( playerChoice ) != sequence.npos )
|
||||
{
|
||||
showWinner( 1 );
|
||||
break;
|
||||
}
|
||||
else if( sequence.find( computerChoice ) != sequence.npos )
|
||||
{
|
||||
showWinner( 0 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
void showWinner( int i )
|
||||
{
|
||||
string s;
|
||||
if( i ) { s = "Player wins!"; pW++; }
|
||||
else { s = "Computer wins!"; cW++; }
|
||||
cout << "Tossed sequence: " << sequence << endl << s << endl << endl;
|
||||
}
|
||||
string playerChoice, computerChoice, sequence;
|
||||
int pW, cW;
|
||||
};
|
||||
int main( int argc, char* argv[] )
|
||||
{
|
||||
srand( static_cast<unsigned>( time( NULL ) ) );
|
||||
penney game; game.gameLoop();
|
||||
return 0;
|
||||
}
|
||||
103
Task/Penneys-game/C-sharp/penneys-game.cs
Normal file
103
Task/Penneys-game/C-sharp/penneys-game.cs
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
using static System.Console;
|
||||
using static System.Threading.Thread;
|
||||
using System;
|
||||
|
||||
public static class PenneysGame
|
||||
{
|
||||
const int pause = 500;
|
||||
const int N = 3;
|
||||
static Random rng = new Random();
|
||||
|
||||
static int Toss() => rng.Next(2);
|
||||
|
||||
static string AsString(this int sequence) {
|
||||
string s = "";
|
||||
for (int b = 0b100; b > 0; b >>= 1) {
|
||||
s += (sequence & b) > 0 ? 'T' : 'H';
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
static int UserInput() {
|
||||
while (true) {
|
||||
switch (ReadKey().Key) {
|
||||
case ConsoleKey.Escape: return -1;
|
||||
case ConsoleKey.H: return 0;
|
||||
case ConsoleKey.T: return 1;
|
||||
}
|
||||
Console.Write('\b');
|
||||
}
|
||||
}
|
||||
|
||||
public static void Main2() {
|
||||
int yourScore = 0, myScore = 0;
|
||||
while (true) {
|
||||
WriteLine($"Your score: {yourScore}, My score: {myScore}");
|
||||
WriteLine("Determining who goes first...");
|
||||
Sleep(pause);
|
||||
bool youStart = Toss() == 1;
|
||||
WriteLine(youStart ? "You go first." : "I go first.");
|
||||
int yourSequence = 0, mySequence = 0;
|
||||
if (youStart) {
|
||||
WriteLine("Choose your sequence of (H)eads and (T)ails (or press Esc to exit)");
|
||||
int userChoice;
|
||||
for (int i = 0; i < N; i++) {
|
||||
if ((userChoice = UserInput()) < 0) return;
|
||||
yourSequence = (yourSequence << 1) + userChoice;
|
||||
}
|
||||
mySequence = ((~yourSequence << 1) & 0b100) | (yourSequence >> 1);
|
||||
} else {
|
||||
for (int i = 0; i < N; i++) {
|
||||
mySequence = (mySequence << 1) + Toss();
|
||||
}
|
||||
|
||||
WriteLine("I chose " + mySequence.AsString());
|
||||
do {
|
||||
WriteLine("Choose your sequence of (H)eads and (T)ails (or press Esc to exit)");
|
||||
int choice;
|
||||
yourSequence = 0;
|
||||
for (int i = 0; i < N; i++) {
|
||||
if ((choice = UserInput()) < 0) return;
|
||||
yourSequence = (yourSequence << 1) + choice;
|
||||
}
|
||||
if (yourSequence == mySequence) {
|
||||
WriteLine();
|
||||
WriteLine("You cannot choose the same sequence.");
|
||||
}
|
||||
} while (yourSequence == mySequence);
|
||||
}
|
||||
|
||||
WriteLine();
|
||||
WriteLine($"Your sequence: {yourSequence.AsString()}, My sequence: {mySequence.AsString()}");
|
||||
WriteLine("Tossing...");
|
||||
int sequence = 0;
|
||||
for (int i = 0; i < N; i++) {
|
||||
Sleep(pause);
|
||||
int toss = Toss();
|
||||
sequence = (sequence << 1) + toss;
|
||||
Write(toss > 0 ? 'T' : 'H');
|
||||
}
|
||||
while (true) {
|
||||
if (sequence == yourSequence) {
|
||||
WriteLine();
|
||||
WriteLine("You win!");
|
||||
yourScore++;
|
||||
break;
|
||||
} else if (sequence == mySequence) {
|
||||
WriteLine();
|
||||
WriteLine("I win!");
|
||||
myScore++;
|
||||
break;
|
||||
}
|
||||
Sleep(pause);
|
||||
int toss = Toss();
|
||||
sequence = ((sequence << 1) + toss) & 0b111;
|
||||
Write(toss > 0 ? 'T' : 'H');
|
||||
}
|
||||
WriteLine("Press a key.");
|
||||
ReadKey();
|
||||
Clear();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
121
Task/Penneys-game/C/penneys-game.c
Normal file
121
Task/Penneys-game/C/penneys-game.c
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
#define SEQLEN 3
|
||||
|
||||
int getseq(char *s)
|
||||
{
|
||||
int r = 0;
|
||||
int i = 1 << (SEQLEN - 1);
|
||||
|
||||
while (*s && i) {
|
||||
switch (*s++) {
|
||||
case 'H':
|
||||
case 'h':
|
||||
r |= i;
|
||||
break;
|
||||
case 'T':
|
||||
case 't':
|
||||
/* 0 indicates tails, this is 0, so do nothing */
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
i >>= 1;
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
void printseq(int seq)
|
||||
{
|
||||
int i;
|
||||
for (i = SEQLEN - 1; i >= 0; --i)
|
||||
printf("%c", seq & (1 << i) ? 'h' : 't');
|
||||
}
|
||||
|
||||
int getuser(void)
|
||||
{
|
||||
int user;
|
||||
char s[SEQLEN + 1];
|
||||
|
||||
printf("Enter your sequence of %d (h/t): ", SEQLEN);
|
||||
while (1) {
|
||||
/* This needs to be manually changed if SEQLEN is changed */
|
||||
if (scanf("%3s", s) != 1) exit(1);
|
||||
if ((user = getseq(s)) != -1) return user;
|
||||
printf("Please enter only h/t characters: ");
|
||||
}
|
||||
}
|
||||
|
||||
int getai(int user)
|
||||
{
|
||||
int ai;
|
||||
|
||||
printf("Computers sequence of %d is: ", SEQLEN);
|
||||
/* The ai's perfect choice will only be perfect for SEQLEN == 3 */
|
||||
if (user == -1)
|
||||
ai = rand() & (1 << SEQLEN) - 1;
|
||||
else
|
||||
ai = (user >> 1) | ((~user << 1) & (1 << SEQLEN - 1));
|
||||
|
||||
printseq(ai);
|
||||
printf("\n");
|
||||
return ai;
|
||||
}
|
||||
|
||||
int rungame(int user, int ai)
|
||||
{
|
||||
/* Generate first SEQLEN flips. We only need to store the last SEQLEN
|
||||
* tosses at any one time. */
|
||||
int last3 = rand() & (1 << SEQLEN) - 1;
|
||||
|
||||
printf("Tossed sequence: ");
|
||||
printseq(last3);
|
||||
while (1) {
|
||||
if (user == last3) {
|
||||
printf("\nUser wins!\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (ai == last3) {
|
||||
printf("\nAi wins!\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
last3 = ((last3 << 1) & (1 << SEQLEN) - 2) | (rand() & 1);
|
||||
printf("%c", last3 & 1 ? 'h' : 't');
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
srand(time(NULL));
|
||||
int playerwins = 0;
|
||||
int totalgames = 0;
|
||||
|
||||
/* Just use ctrl-c for exit */
|
||||
while (1) {
|
||||
int user = -1;
|
||||
int ai = -1;
|
||||
|
||||
printf("\n");
|
||||
if (rand() & 1) {
|
||||
ai = getai(user);
|
||||
user = getuser();
|
||||
}
|
||||
else {
|
||||
user = getuser();
|
||||
ai = getai(user);
|
||||
}
|
||||
|
||||
playerwins += rungame(user, ai);
|
||||
totalgames++;
|
||||
|
||||
printf("You have won %d out of %d games\n", playerwins, totalgames);
|
||||
printf("=================================\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
64
Task/Penneys-game/Clojure/penneys-game.clj
Normal file
64
Task/Penneys-game/Clojure/penneys-game.clj
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
(ns penney.core
|
||||
(:gen-class))
|
||||
|
||||
(def heads \H)
|
||||
(def tails \T)
|
||||
|
||||
(defn flip-coin []
|
||||
(let [flip (rand-int 2)]
|
||||
(if (= flip 0) heads tails)))
|
||||
|
||||
(defn turn [coin]
|
||||
(if (= coin heads) tails heads))
|
||||
|
||||
(defn first-index [combo coll]
|
||||
(some #(if (= (second %) combo) (first %)) coll))
|
||||
|
||||
(defn find-winner [h c]
|
||||
(if (< h c)
|
||||
(do (println "YOU WIN!\n") :human)
|
||||
(do (println "COMPUTER WINS!\n") :computer)))
|
||||
|
||||
(defn flip-off [human comp]
|
||||
(let [flips (repeatedly flip-coin)
|
||||
idx-flips (map-indexed vector (partition 3 1 flips))
|
||||
h (first-index (seq human) idx-flips)
|
||||
c (first-index (seq comp) idx-flips)]
|
||||
(println (format "Tosses: %s" (apply str (take (+ 3 (min h c)) flips))))
|
||||
(find-winner h c)))
|
||||
|
||||
(defn valid? [combo]
|
||||
(if (empty? combo) true (and (= 3 (count combo)) (every? #(or (= heads %) (= tails %)) combo))))
|
||||
|
||||
(defn ask-move []
|
||||
(println "What sequence of 3 Heads/Tails do you choose?")
|
||||
(let [input (clojure.string/upper-case (read-line))]
|
||||
(if-not (valid? input) (recur) input)))
|
||||
|
||||
(defn optimize-against [combo]
|
||||
(let [mid (nth combo 1)
|
||||
comp (str (turn mid) (first combo) mid)]
|
||||
(println (format "Computer chooses %s: " comp)) comp))
|
||||
|
||||
(defn initial-move [game]
|
||||
(let [combo (apply str (repeatedly 3 flip-coin))]
|
||||
(println "--------------")
|
||||
(println (format "Current score | CPU: %s, You: %s" (:computer game) (:human game)))
|
||||
(if (= (:first-player game) tails)
|
||||
(do
|
||||
(println "Computer goes first and chooses: " combo)
|
||||
combo)
|
||||
(println "YOU get to go first."))))
|
||||
|
||||
(defn play-game [game]
|
||||
(let [c-move (initial-move game)
|
||||
h-move (ask-move)]
|
||||
(if-not (empty? h-move)
|
||||
(let [winner (flip-off h-move (if (nil? c-move) (optimize-against h-move) c-move))]
|
||||
(recur (assoc game winner (inc (winner game)) :first-player (flip-coin))))
|
||||
(println "Thanks for playing!"))))
|
||||
|
||||
(defn -main [& args]
|
||||
(println "Penney's Game.")
|
||||
(play-game {:first-player (flip-coin)
|
||||
:human 0, :computer 0}))
|
||||
65
Task/Penneys-game/Common-Lisp/penneys-game.lisp
Normal file
65
Task/Penneys-game/Common-Lisp/penneys-game.lisp
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
(setf *random-state* (make-random-state t))
|
||||
|
||||
(defparameter *heads* #\H)
|
||||
(defparameter *tails* #\T)
|
||||
|
||||
(defun main ()
|
||||
(format t "Penney's Game~%~%")
|
||||
(format t "Flipping to see who goes first ...")
|
||||
|
||||
(setq p2 nil)
|
||||
(if (string= (flip) *heads*)
|
||||
(progn (format t " I do.~%")
|
||||
(setq p2 (choose-random-sequence))
|
||||
(format t "I choose: ~A~%" p2))
|
||||
(format t "You do.~%"))
|
||||
|
||||
(setq p1 nil)
|
||||
(loop while (null p1) doing
|
||||
(format t "Enter your three-flip sequence: ")
|
||||
(setq p1 (string (read)))
|
||||
(cond ((/= (length p1) 3)
|
||||
(format t "Sequence must consist of three flips.~%")
|
||||
(setq p1 nil))
|
||||
((string= p1 p2)
|
||||
(format t "Sequence must be different from mine.~%")
|
||||
(setq p1 nil))
|
||||
((notevery #'valid? (coerce p1 'list))
|
||||
(format t "Sequence must be contain only ~A's and ~A's.~%" *heads* *tails*)
|
||||
(setq p1 nil))))
|
||||
(format t "You picked: ~A~%" p1)
|
||||
|
||||
(if (null p2)
|
||||
(progn
|
||||
(setq p2 (choose-optimal-sequence p1))
|
||||
(format t "I choose: ~A~%" p2)))
|
||||
|
||||
(format t "Here we go. ~A, you win; ~A, I win.~%" p1 p2)
|
||||
(format t "Flips:")
|
||||
(let ((winner nil)
|
||||
(flips '()))
|
||||
(loop while (null winner) doing
|
||||
(setq flips (cons (flip) flips))
|
||||
(format t " ~A" (car flips))
|
||||
(if (>= (length flips) 3)
|
||||
(let ((trail (coerce (reverse (subseq flips 0 3)) 'string)))
|
||||
(cond ((string= trail p1) (setq winner "You"))
|
||||
((string= trail p2) (setq winner "I"))))))
|
||||
(format t "~&~A win!" winner)))
|
||||
|
||||
(defparameter *sides* (list *heads* *tails*))
|
||||
(defun flip () (nth (random 2 *random-state*) *sides*))
|
||||
|
||||
(defun valid? (flip) (not (null (member flip *sides*))))
|
||||
|
||||
(defun opposite (flip) (if (string= flip *heads*) *tails* *heads*))
|
||||
|
||||
(defun choose-random-sequence () (coerce (list (flip) (flip) (flip)) 'string))
|
||||
|
||||
(defun choose-optimal-sequence (against)
|
||||
(let* ((opposed (coerce against 'list))
|
||||
(middle (cadr opposed))
|
||||
(my-list (list (opposite middle) (car opposed) middle)))
|
||||
(coerce my-list 'string)))
|
||||
|
||||
(main)
|
||||
35
Task/Penneys-game/D/penneys-game.d
Normal file
35
Task/Penneys-game/D/penneys-game.d
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
void main() {
|
||||
import std.stdio, std.random, std.algorithm, std.string,
|
||||
std.conv, std.range, core.thread;
|
||||
|
||||
immutable first = uniform(0, 2) == 0;
|
||||
|
||||
string you, me;
|
||||
if (first) {
|
||||
me = 3.iota.map!(_ => "HT"[uniform(0, $)]).text;
|
||||
writefln("I choose first and will win on first seeing %s in the list of tosses", me);
|
||||
while (you.length != 3 || you.any!(c => !c.among('H', 'T')) || you == me) {
|
||||
"What sequence of three Heads/Tails will you win with: ".write;
|
||||
you = readln.strip;
|
||||
}
|
||||
} else {
|
||||
while (you.length != 3 || you.any!(c => !c.among('H', 'T'))) {
|
||||
"After you: What sequence of three Heads/Tails will you win with: ".write;
|
||||
you = readln.strip;
|
||||
}
|
||||
me = (you[1] == 'T' ? 'H' : 'T') ~ you[0 .. 2];
|
||||
writefln("I win on first seeing %s in the list of tosses", me);
|
||||
}
|
||||
|
||||
"Rolling:\n ".write;
|
||||
string rolled;
|
||||
while (true) {
|
||||
rolled ~= "HT"[uniform(0, $)];
|
||||
rolled.back.write;
|
||||
if (rolled.endsWith(you))
|
||||
return "\n You win!".writeln;
|
||||
if (rolled.endsWith(me))
|
||||
return "\n I win!".writeln;
|
||||
Thread.sleep(1.seconds);
|
||||
}
|
||||
}
|
||||
57
Task/Penneys-game/Elixir/penneys-game.elixir
Normal file
57
Task/Penneys-game/Elixir/penneys-game.elixir
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
defmodule Penney do
|
||||
@toss [:Heads, :Tails]
|
||||
|
||||
def game(score \\ {0,0})
|
||||
def game({iwin, ywin}=score) do
|
||||
IO.puts "Penney game score I : #{iwin}, You : #{ywin}"
|
||||
[i, you] = @toss
|
||||
coin = Enum.random(@toss)
|
||||
IO.puts "#{i} I start, #{you} you start ..... #{coin}"
|
||||
{myC, yC} = setup(coin)
|
||||
seq = for _ <- 1..3, do: Enum.random(@toss)
|
||||
IO.write Enum.join(seq, " ")
|
||||
{winner, score} = loop(seq, myC, yC, score)
|
||||
IO.puts "\n #{winner} win!\n"
|
||||
game(score)
|
||||
end
|
||||
|
||||
defp setup(:Heads) do
|
||||
myC = Enum.shuffle(@toss) ++ [Enum.random(@toss)]
|
||||
joined = Enum.join(myC, " ")
|
||||
IO.puts "I chose : #{joined}"
|
||||
{myC, yourChoice}
|
||||
end
|
||||
defp setup(:Tails) do
|
||||
yC = yourChoice
|
||||
myC = (@toss -- [Enum.at(yC,1)]) ++ Enum.take(yC,2)
|
||||
joined = Enum.join(myC, " ")
|
||||
IO.puts "I chose : #{joined}"
|
||||
{myC, yC}
|
||||
end
|
||||
|
||||
defp yourChoice do
|
||||
IO.write "Enter your choice (H/T) "
|
||||
choice = read([])
|
||||
IO.puts "You chose: #{Enum.join(choice, " ")}"
|
||||
choice
|
||||
end
|
||||
|
||||
defp read([_,_,_]=choice), do: choice
|
||||
defp read(choice) do
|
||||
case IO.getn("") |> String.upcase do
|
||||
"H" -> read(choice ++ [:Heads])
|
||||
"T" -> read(choice ++ [:Tails])
|
||||
_ -> read(choice)
|
||||
end
|
||||
end
|
||||
|
||||
defp loop(myC, myC, _, {iwin, ywin}), do: {"I", {iwin+1, ywin}}
|
||||
defp loop(yC, _, yC, {iwin, ywin}), do: {"You", {iwin, ywin+1}}
|
||||
defp loop(seq, myC, yC, score) do
|
||||
append = Enum.random(@toss)
|
||||
IO.write " #{append}"
|
||||
loop(tl(seq)++[append], myC, yC, score)
|
||||
end
|
||||
end
|
||||
|
||||
Penney.game
|
||||
88
Task/Penneys-game/Factor/penneys-game.factor
Normal file
88
Task/Penneys-game/Factor/penneys-game.factor
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
USING: arrays ascii io kernel math prettyprint random sequences
|
||||
strings ;
|
||||
IN: rosetta-code.penneys-game
|
||||
|
||||
! Generate a random boolean.
|
||||
: t|f ( -- t/f )
|
||||
1 random-bits 0 = ;
|
||||
|
||||
! Checks whether the sequence chosen by the human is valid.
|
||||
: valid-input? ( seq -- ? )
|
||||
[ [ CHAR: H = ] [ CHAR: T = ] bi or ] filter length 3 = ;
|
||||
|
||||
! Prompt the human player for a sequence.
|
||||
: input-seq ( -- seq )
|
||||
"Please input a 3-long sequence of H or T (heads or tails)."
|
||||
print "Example: HTH" print "> " write readln >upper >array ;
|
||||
|
||||
! Get the human player's input sequence with error checking.
|
||||
: get-input ( -- seq )
|
||||
t [ drop input-seq dup valid-input? not ] loop ;
|
||||
|
||||
! Add a random coin flip to a vector.
|
||||
: flip-coin ( vector -- vector' )
|
||||
t|f CHAR: H CHAR: T ? over push ;
|
||||
|
||||
! Generate a random 3-long sequence of coin flips.
|
||||
: rand-seq ( -- seq )
|
||||
V{ } clone 3 [ flip-coin ] times ;
|
||||
|
||||
! Generate the optimal sequence response to a given sequence.
|
||||
: optimal ( seq1 -- seq2 )
|
||||
[ second dup CHAR: H = [ CHAR: T ] [ CHAR: H ] if ]
|
||||
[ first ] [ second ] tri 3array nip dup
|
||||
"The computer chose " write >string write "." print ;
|
||||
|
||||
! Choose a random sequence for the computer and report what
|
||||
! was chosen.
|
||||
: computer-first ( -- seq )
|
||||
"The computer picks a sequence first and chooses " write
|
||||
rand-seq dup >string write "." print >array ;
|
||||
|
||||
! The human is prompted to choose any sequence with no
|
||||
! restrictions.
|
||||
: human-first ( -- seq )
|
||||
"You get to go first." print get-input ;
|
||||
|
||||
! Forbid the player from choosing the same sequence as the
|
||||
! computer.
|
||||
: human-second ( cseq -- cseq hseq )
|
||||
get-input [ 2dup = not ]
|
||||
[ drop
|
||||
"You may not choose the same sequence as the computer."
|
||||
print get-input
|
||||
] until ;
|
||||
|
||||
! Display a message introducing the game.
|
||||
: welcome ( -- )
|
||||
"Welcome to Penney's Game. The computer or the player" print
|
||||
"will be randomly selected to choose a sequence of" print
|
||||
"three coin tosses. The sequence will be shown to the" print
|
||||
"opponent, and then he will choose a sequence." print nl
|
||||
"Then, a coin will be flipped until the sequence" print
|
||||
"matches the last three coin flips, and a winner" print
|
||||
"announced." print nl ;
|
||||
|
||||
! Check for human victory.
|
||||
: human-won? ( cseq hseq coin-flips -- ? )
|
||||
3 tail* >array = nip ;
|
||||
|
||||
! Check for computer victory.
|
||||
: computer-won? ( cseq hseq coin-flips -- ? )
|
||||
3 tail* >array pick = 2nip ;
|
||||
|
||||
! Flip a coin until a victory is detected. Then, inform the
|
||||
! player who won.
|
||||
: flip-coins ( cseq hseq -- )
|
||||
"Flipping coins..." print
|
||||
rand-seq [ 3dup [ human-won? ] [ computer-won? ] 3bi or ]
|
||||
[ flip-coin ] until dup >string print human-won?
|
||||
[ "You won!" print ] [ "The computer won." print ] if ;
|
||||
|
||||
! Randomly choose a player to choose their sequence first.
|
||||
! Then play a full round of Penney's Game.
|
||||
: start-game ( -- )
|
||||
welcome t|f [ human-first dup optimal swap ]
|
||||
[ computer-first human-second ] if flip-coins ;
|
||||
|
||||
start-game
|
||||
93
Task/Penneys-game/FreeBASIC/penneys-game.basic
Normal file
93
Task/Penneys-game/FreeBASIC/penneys-game.basic
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
Sub Jugador_elige(secuencia As String)
|
||||
Dim As String eleccion
|
||||
Dim As Byte valido, i
|
||||
Do
|
||||
valido = True
|
||||
Print !"\nIngresa una secuencia de 3 opciones, cada una de ellas H o T:";
|
||||
Input " > ", secuencia
|
||||
If Len(secuencia) <> 3 Then valido = False
|
||||
If valido Then
|
||||
For i = 1 To 3
|
||||
eleccion = Mid(Ucase(secuencia), i, 1)
|
||||
If eleccion <> "H" And eleccion <> "T" Then valido = False
|
||||
Next
|
||||
End If
|
||||
Loop Until valido
|
||||
End Sub
|
||||
|
||||
Function Aleatorio() As String
|
||||
Dim As Byte eleccion, i
|
||||
Dim As String tirada
|
||||
tirada = ""
|
||||
For i = 1 To 3
|
||||
eleccion = Rnd And 1
|
||||
If eleccion Then tirada += "H" Else tirada += "T"
|
||||
Next
|
||||
Return tirada
|
||||
End Function
|
||||
|
||||
Function Optima(secuencia As String) As String
|
||||
If Mid(secuencia, 2, 1) = "H" Then
|
||||
Optima = "T" + Left(secuencia, 2)
|
||||
Else
|
||||
Optima = "H" + Left(secuencia, 2)
|
||||
End If
|
||||
End Function
|
||||
|
||||
Randomize Timer
|
||||
Dim As String jugador, computador, otro
|
||||
Dim Shared As String secuencia
|
||||
Dim As Boolean ganador, valido
|
||||
Do
|
||||
Cls
|
||||
Color 11
|
||||
Print "*** Penney's Game ***" & Chr(10)
|
||||
Color 7
|
||||
Print "Cara eliges primero, cruz yo elijo primero."
|
||||
Print "Y es... ";
|
||||
Sleep 300
|
||||
Dim As Double ht: ht = Rnd(0 - Timer) And 1
|
||||
If ht Then
|
||||
Print "cara!"
|
||||
Jugador_elige(jugador)
|
||||
computador = Optima(jugador)
|
||||
Print !"\nYo elijo "; computador; !".\n"
|
||||
Else
|
||||
Print "cruz!"
|
||||
computador = Aleatorio
|
||||
Print !"\nYo elijo "; computador; !".\n"
|
||||
Jugador_elige(jugador)
|
||||
End If
|
||||
Print "Comenzando el juego ..."
|
||||
secuencia = ""
|
||||
ganador = False
|
||||
Do
|
||||
Sleep 200
|
||||
Dim As Integer lanzar = Rnd And 1
|
||||
If lanzar Then
|
||||
secuencia += "H"
|
||||
Print "H ";
|
||||
Else
|
||||
Print "T ";
|
||||
secuencia += "T"
|
||||
End If
|
||||
|
||||
If Right(secuencia, 3) = computador Then
|
||||
Print !"\nGan‚!\n"
|
||||
ganador = True
|
||||
Else
|
||||
If Right(secuencia, 3) = jugador Then
|
||||
Print !"\nFelicidades! Ganaste.\n"
|
||||
ganador = True
|
||||
End If
|
||||
End If
|
||||
Loop Until ganador
|
||||
Do
|
||||
valido = False
|
||||
Input "¨Otra ronda? (S/N) ", otro
|
||||
If Instr("SYN", Ucase(otro)) Then valido = True
|
||||
Loop Until valido
|
||||
Loop Until Ucase(otro) = "N"
|
||||
Print !"\nGracias por jugar!"
|
||||
Sleep
|
||||
End
|
||||
87
Task/Penneys-game/Go/penneys-game.go
Normal file
87
Task/Penneys-game/Go/penneys-game.go
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
package main
|
||||
import "fmt"
|
||||
import "math/rand"
|
||||
func main(){
|
||||
var a1,a2,a3,y,match,j,k int
|
||||
var inp string
|
||||
y=1
|
||||
for y==1{
|
||||
fmt.Println("Enter your sequence:")
|
||||
fmt.Scanln(&inp)
|
||||
var Ai [3] int
|
||||
var user [3] int
|
||||
for j=0;j<3;j++{
|
||||
if(inp[j]==104){
|
||||
user[j]=1
|
||||
}else{
|
||||
user[j]=0
|
||||
}
|
||||
}
|
||||
for k=0;k<3;k++{
|
||||
Ai[k]=rand.Intn(2)
|
||||
}
|
||||
for user[0]==Ai[0]&&user[1]==Ai[1]&&user[2]==Ai[2]{
|
||||
for k=0;k<3;k++{
|
||||
Ai[k]=rand.Intn(2)
|
||||
}
|
||||
}
|
||||
fmt.Println("You gave the sequence:")
|
||||
printht(user)
|
||||
fmt.Println()
|
||||
fmt.Println("The computer generated sequence is:")
|
||||
printht(Ai)
|
||||
fmt.Println()
|
||||
a1=rand.Intn(2)
|
||||
a2=rand.Intn(2)
|
||||
a3=rand.Intn(2)
|
||||
fmt.Print("The generated sequence is:")
|
||||
printh(a1)
|
||||
printh(a2)
|
||||
printh(a3)
|
||||
match=0
|
||||
for match==0{
|
||||
if(matches(user,a1,a2,a3)==1){
|
||||
fmt.Println()
|
||||
fmt.Println("You have won!!!")
|
||||
match=1
|
||||
}else if(matches(Ai,a1,a2,a3)==1){
|
||||
fmt.Println()
|
||||
fmt.Println("You lost!! Computer wins")
|
||||
match=1
|
||||
}else{
|
||||
a1=a2
|
||||
a2=a3
|
||||
a3=rand.Intn(2)
|
||||
printh(a3)
|
||||
}
|
||||
}
|
||||
fmt.Println("Do you want to continue(0/1):")
|
||||
fmt.Scanln(&y)
|
||||
}
|
||||
}
|
||||
func printht(a [3] int) int{
|
||||
var i int
|
||||
for i=0;i<3;i++{
|
||||
if(a[i]==1){
|
||||
fmt.Print("h")
|
||||
}else{
|
||||
fmt.Print("t")
|
||||
}
|
||||
}
|
||||
return 1
|
||||
}
|
||||
func printh(a int) int{
|
||||
if(a==1){
|
||||
fmt.Print("h")
|
||||
}else{
|
||||
fmt.Print("t")
|
||||
}
|
||||
return 1
|
||||
}
|
||||
func matches(a [3] int,p int,q int,r int) int{
|
||||
if(a[0]==p&&a[1]==q&&a[2]==r){
|
||||
return 1
|
||||
}else{
|
||||
return 0
|
||||
}
|
||||
}
|
||||
91
Task/Penneys-game/Haskell/penneys-game.hs
Normal file
91
Task/Penneys-game/Haskell/penneys-game.hs
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
import qualified Data.List as L
|
||||
import System.IO
|
||||
import System.Random
|
||||
|
||||
data CoinToss = H | T deriving (Read, Show, Eq)
|
||||
|
||||
parseToss :: String -> [CoinToss]
|
||||
parseToss [] = []
|
||||
parseToss (s:sx)
|
||||
| s == 'h' || s == 'H' = H : parseToss sx
|
||||
| s == 't' || s == 'T' = T : parseToss sx
|
||||
| otherwise = parseToss sx
|
||||
|
||||
notToss :: CoinToss -> CoinToss
|
||||
notToss H = T
|
||||
notToss T = H
|
||||
|
||||
instance Random CoinToss where
|
||||
random g = let (b, gb) = random g in (if b then H else T, gb)
|
||||
randomR = undefined
|
||||
|
||||
prompt :: (Read a) => String -> String -> (String -> Maybe a) -> IO a
|
||||
prompt msg err parse = do
|
||||
putStrLn msg
|
||||
line <- getLine
|
||||
let ans = parse line
|
||||
case ans of
|
||||
Nothing -> do
|
||||
putStrLn err
|
||||
prompt msg err parse
|
||||
Just ansB -> return ansB
|
||||
|
||||
showCat :: (Show a) => [a] -> String
|
||||
showCat = concatMap show
|
||||
|
||||
data Winner = Player | CPU
|
||||
|
||||
-- This may never terminate.
|
||||
runToss :: (RandomGen g) => [CoinToss] -> [CoinToss] -> g -> ([CoinToss], Winner)
|
||||
runToss player cpu gen =
|
||||
let stream = randoms gen
|
||||
run ss@(s:sx)
|
||||
| L.isPrefixOf player ss = player
|
||||
| L.isPrefixOf cpu ss = cpu
|
||||
| otherwise = s : run sx
|
||||
winner = run stream
|
||||
in if L.isSuffixOf player winner
|
||||
then (winner, Player)
|
||||
else (winner, CPU)
|
||||
|
||||
game :: (RandomGen g, Num a, Show a) => Bool -> a -> a -> g -> IO ()
|
||||
game cpuTurn playerScore cpuScore gen = do
|
||||
putStrLn $ "\nThe current score is CPU: " ++ show cpuScore
|
||||
++ ", You: " ++ show playerScore
|
||||
|
||||
let (genA, genB) = split gen
|
||||
promptPlayer check =
|
||||
prompt "Pick 3 coin sides: " "Invalid input." $ \s ->
|
||||
let tosses = parseToss s in
|
||||
if check tosses then Just tosses else Nothing
|
||||
promptCpu x = putStrLn $ "I have chosen: " ++ showCat x
|
||||
|
||||
(tosses, winner) <-
|
||||
if cpuTurn
|
||||
then do
|
||||
let cpuChoice = take 3 $ randoms gen
|
||||
promptCpu cpuChoice
|
||||
playerChoice <- promptPlayer $ \n -> n /= cpuChoice && 3 == length n
|
||||
return $ runToss playerChoice cpuChoice genA
|
||||
else do
|
||||
playerChoice <- promptPlayer $ \n -> 3 == length n
|
||||
let cpuChoice = case playerChoice of [a,b,_] -> [notToss b, a, b]
|
||||
promptCpu cpuChoice
|
||||
return $ runToss playerChoice cpuChoice genA
|
||||
|
||||
putStrLn $ "The sequence tossed was: " ++ showCat tosses
|
||||
|
||||
case winner of
|
||||
Player -> do
|
||||
putStrLn "You win!"
|
||||
game (not cpuTurn) (playerScore + 1) cpuScore genB
|
||||
CPU -> do
|
||||
putStrLn "I win!"
|
||||
game (not cpuTurn) playerScore (cpuScore + 1) genB
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
hSetBuffering stdin LineBuffering
|
||||
stdgen <- getStdGen
|
||||
let (cpuFirst, genA) = random stdgen
|
||||
game cpuFirst 0 0 genA
|
||||
28
Task/Penneys-game/J/penneys-game-1.j
Normal file
28
Task/Penneys-game/J/penneys-game-1.j
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
require 'format/printf numeric'
|
||||
|
||||
randomize '' NB. randomize seed for new session
|
||||
|
||||
Vals=: 'HT' NB. valid values
|
||||
input=: 1!:1@<&1: NB. get input from user
|
||||
prompt=: input@echo NB. prompt user for input
|
||||
checkInput=: 'Choose 3 H/Ts' assert (Vals e.~ ]) , 3 = #
|
||||
getUserSeq=: (] [ checkInput)@toupper@prompt
|
||||
choose1st=: Vals {~ 3 ?@$ 2: NB. computer chooses 1st
|
||||
choose2nd=: (0 1 1=1 0 1{])&.(Vals&i.) NB. computer chooses 2nd
|
||||
|
||||
playPenney=: verb define
|
||||
if. ?2 do. NB. randomize first chooser
|
||||
Comp=. choose1st ''
|
||||
'Computer chose %s' printf <Comp
|
||||
You=. getUserSeq 'Choose a sequence of three coin tosses (H/T):'
|
||||
'Choose a different sequence to computer' assert You -.@-: Comp
|
||||
else.
|
||||
You=. getUserSeq 'Choose a sequence of three coin tosses (H/T):'
|
||||
Comp=. choose2nd You
|
||||
'Computer chose %s ' printf <Comp
|
||||
end.
|
||||
Tosses=. Vals {~ 100 ?@$ 2
|
||||
Result=. (Comp,:You) {.@I.@E."1 Tosses
|
||||
'Toss sequence is %s' printf < (3 + <./ Result) {. Tosses
|
||||
echo ('No result';'You win!';'Computer won!') {::~ *-/ Result
|
||||
)
|
||||
12
Task/Penneys-game/J/penneys-game-2.j
Normal file
12
Task/Penneys-game/J/penneys-game-2.j
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
playPenney''
|
||||
Computer chose TTT
|
||||
Choose a sequence of three coin tosses (H/T):
|
||||
HTT
|
||||
Toss sequence is TTHHTT
|
||||
You win!
|
||||
playPenney''
|
||||
Choose a sequence of three coin tosses (H/T):
|
||||
HTT
|
||||
Computer chose HHT
|
||||
Toss sequence is HTHTT
|
||||
You win!
|
||||
52
Task/Penneys-game/Java/penneys-game.java
Normal file
52
Task/Penneys-game/Java/penneys-game.java
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
import java.util.*;
|
||||
|
||||
public class PenneysGame {
|
||||
|
||||
public static void main(String[] args) {
|
||||
Random rand = new Random();
|
||||
|
||||
String compChoice = "", playerChoice;
|
||||
if (rand.nextBoolean()) {
|
||||
|
||||
for (int i = 0; i < 3; i++)
|
||||
compChoice += "HT".charAt(rand.nextInt(2));
|
||||
System.out.printf("Computer chooses %s%n", compChoice);
|
||||
|
||||
playerChoice = prompt(compChoice);
|
||||
|
||||
} else {
|
||||
|
||||
playerChoice = prompt(compChoice);
|
||||
|
||||
compChoice = "T";
|
||||
if (playerChoice.charAt(1) == 'T')
|
||||
compChoice = "H";
|
||||
compChoice += playerChoice.substring(0, 2);
|
||||
System.out.printf("Computer chooses %s%n", compChoice);
|
||||
}
|
||||
|
||||
String tossed = "";
|
||||
while (true) {
|
||||
tossed += "HT".charAt(rand.nextInt(2));
|
||||
System.out.printf("Tossed %s%n" , tossed);
|
||||
if (tossed.endsWith(playerChoice)) {
|
||||
System.out.println("You win!");
|
||||
break;
|
||||
}
|
||||
if (tossed.endsWith(compChoice)) {
|
||||
System.out.println("Computer wins!");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static String prompt(String otherChoice) {
|
||||
Scanner sc = new Scanner(System.in);
|
||||
String s;
|
||||
do {
|
||||
System.out.print("Choose a sequence: ");
|
||||
s = sc.nextLine().trim().toUpperCase();
|
||||
} while (!s.matches("[HT]{3}") || s.equals(otherChoice));
|
||||
return s;
|
||||
}
|
||||
}
|
||||
32
Task/Penneys-game/Julia/penneys-game-1.julia
Normal file
32
Task/Penneys-game/Julia/penneys-game-1.julia
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
const SLEN = 3
|
||||
|
||||
autobet() = randbool(SLEN)
|
||||
function autobet(ob::BitArray{1})
|
||||
rlen = length(ob)
|
||||
2 < rlen || return ~ob
|
||||
3 < rlen || return [~ob[2], ob[1:2]]
|
||||
opt = falses(rlen)
|
||||
opt[1] = true
|
||||
opt[end-1:end] = true
|
||||
ob != opt || return ~opt
|
||||
return opt
|
||||
end
|
||||
autobet(ob::Array{Bool,1}) = autobet(convert(BitArray{1}, ob))
|
||||
|
||||
function pgencode{T<:String}(a::T)
|
||||
b = uppercase(a)
|
||||
0 < length(b) || return trues(0)
|
||||
!ismatch(r"[^HT]+", b) || error(@sprintf "%s is not a HT sequence" a)
|
||||
b = split(b, "")
|
||||
b .== "H"
|
||||
end
|
||||
pgdecode(a::BitArray{1}) = join([i ? "H" : "T" for i in a], "")
|
||||
|
||||
function humanbet()
|
||||
b = ""
|
||||
while length(b) != SLEN || ismatch(r"[^HT]+", b)
|
||||
print("Your bet? ")
|
||||
b = uppercase(chomp(readline()))
|
||||
end
|
||||
return b
|
||||
end
|
||||
14
Task/Penneys-game/Julia/penneys-game-2.julia
Normal file
14
Task/Penneys-game/Julia/penneys-game-2.julia
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
println("Playing Penney's Game Against the computer.")
|
||||
|
||||
if randbool()
|
||||
mach = autobet()
|
||||
println(@sprintf "The computer bet first, chosing %s." pgdecode(mach))
|
||||
println("Now you can bet.")
|
||||
human = pgencode(humanbet())
|
||||
else
|
||||
println("You bet first.")
|
||||
human = pgencode(humanbet())
|
||||
mach = autobet(human)
|
||||
end
|
||||
print(@sprintf "You bet %s " pgdecode(human))
|
||||
println(@sprintf "and the computer bet %s." pgdecode(mach))
|
||||
17
Task/Penneys-game/Julia/penneys-game-3.julia
Normal file
17
Task/Penneys-game/Julia/penneys-game-3.julia
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
pg = randbool(SLEN)
|
||||
pgtail = copy(pg)
|
||||
while pgtail != mach && pgtail != human
|
||||
push!(pg, randbool())
|
||||
pgtail = [pgtail[2:end], pg[end]]
|
||||
end
|
||||
|
||||
println(@sprintf("This game lasted %d turns yielding\n %s",
|
||||
length(pg), pgdecode(pg)))
|
||||
|
||||
if human == mach
|
||||
println("so you and the computer tied.")
|
||||
elseif pgtail == mach
|
||||
println("so the computer won.")
|
||||
else
|
||||
println("so you won.")
|
||||
end
|
||||
69
Task/Penneys-game/Kotlin/penneys-game.kotlin
Normal file
69
Task/Penneys-game/Kotlin/penneys-game.kotlin
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
// version 1.2.10
|
||||
|
||||
import java.util.Random
|
||||
|
||||
val rand = Random()
|
||||
|
||||
val optimum = mapOf(
|
||||
"HHH" to "THH", "HHT" to "THH", "HTH" to "HHT", "HTT" to "HHT",
|
||||
"THH" to "TTH", "THT" to "TTH", "TTH" to "HTT", "TTT" to "HTT"
|
||||
)
|
||||
|
||||
fun getUserSequence(): String {
|
||||
println("A sequence of three H or T should be entered")
|
||||
var userSeq: String
|
||||
do {
|
||||
print("Enter your sequence: ")
|
||||
userSeq = readLine()!!.toUpperCase()
|
||||
}
|
||||
while (userSeq.length != 3 || userSeq.any { it != 'H' && it != 'T' })
|
||||
return userSeq
|
||||
}
|
||||
|
||||
fun getComputerSequence(userSeq: String = ""): String {
|
||||
val compSeq = if(userSeq == "")
|
||||
String(CharArray(3) { if (rand.nextInt(2) == 0) 'T' else 'H' })
|
||||
else
|
||||
optimum[userSeq]!!
|
||||
println("Computer's sequence: $compSeq")
|
||||
return compSeq
|
||||
}
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
var userSeq: String
|
||||
var compSeq: String
|
||||
val r = rand.nextInt(2)
|
||||
if (r == 0) {
|
||||
println("You go first")
|
||||
userSeq = getUserSequence()
|
||||
println()
|
||||
compSeq = getComputerSequence(userSeq)
|
||||
}
|
||||
else {
|
||||
println("Computer goes first")
|
||||
compSeq = getComputerSequence()
|
||||
println()
|
||||
userSeq = getUserSequence()
|
||||
}
|
||||
|
||||
println()
|
||||
val coins = StringBuilder()
|
||||
while (true) {
|
||||
val coin = if (rand.nextInt(2) == 0) 'H' else 'T'
|
||||
coins.append(coin)
|
||||
println("Coins flipped: $coins")
|
||||
val len = coins.length
|
||||
if (len >= 3) {
|
||||
val seq = coins.substring(len - 3, len)
|
||||
if (seq == userSeq) {
|
||||
println("\nYou win!")
|
||||
return
|
||||
}
|
||||
else if (seq == compSeq) {
|
||||
println("\nComputer wins!")
|
||||
return
|
||||
}
|
||||
}
|
||||
Thread.sleep(2000) // wait two seconds for next flip
|
||||
}
|
||||
}
|
||||
88
Task/Penneys-game/Lua/penneys-game.lua
Normal file
88
Task/Penneys-game/Lua/penneys-game.lua
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
function penny_game()
|
||||
local player, computer = "", ""
|
||||
function player_choose()
|
||||
io.write( "Enter your sequence of three H and/or T: " )
|
||||
local t = io.read():upper()
|
||||
if #t > 3 then t = t:sub( 1, 3 )
|
||||
elseif #t < 3 then return ""
|
||||
end
|
||||
|
||||
for i = 1, 3 do
|
||||
c = t:sub( i, i )
|
||||
if c ~= "T" and c ~= "H" then
|
||||
print( "Just H's and T's!" )
|
||||
return ""
|
||||
end
|
||||
end
|
||||
return t
|
||||
end
|
||||
function computer_choose()
|
||||
local t = ""
|
||||
if #player > 0 then
|
||||
if player:sub( 2, 2 ) == "T" then
|
||||
t = "H"
|
||||
else
|
||||
t = "T";
|
||||
end
|
||||
t = t .. player:sub( 1, 2 )
|
||||
else
|
||||
for i = 1, 3 do
|
||||
if math.random( 2 ) == 1 then
|
||||
t = t .. "H"
|
||||
else
|
||||
t = t .. "T"
|
||||
end
|
||||
end
|
||||
end
|
||||
return t
|
||||
end
|
||||
if math.random( 2 ) == 1 then
|
||||
computer = computer_choose()
|
||||
io.write( "My sequence is: " .. computer .. "\n" )
|
||||
while( true ) do
|
||||
player = player_choose()
|
||||
if player:len() == 3 then break end
|
||||
end
|
||||
else
|
||||
while( true ) do
|
||||
player = player_choose()
|
||||
if player:len() == 3 then break end
|
||||
end
|
||||
computer = computer_choose()
|
||||
io.write( "My sequence is: " .. computer .. "\n" )
|
||||
end
|
||||
local coin, i = "", 1
|
||||
while( true ) do
|
||||
if math.random( 2 ) == 1 then
|
||||
coin = coin .. "T"
|
||||
io.write( "T" )
|
||||
else
|
||||
coin = coin .. "H"
|
||||
io.write( "H" )
|
||||
end
|
||||
if #coin > 2 then
|
||||
local seq = coin:sub( i, i + 2 )
|
||||
i = i + 1
|
||||
if seq == player then
|
||||
print( "\nPlayer WINS!!!" )
|
||||
return 1
|
||||
elseif seq == computer then
|
||||
print( "\nComputer WINS!!!" )
|
||||
return -1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
math.randomseed( os.time() )
|
||||
local cpu, user = 0, 0
|
||||
repeat
|
||||
r = penny_game()
|
||||
if r > 0 then
|
||||
user = user + 1
|
||||
else
|
||||
cpu = cpu + 1
|
||||
end
|
||||
print( "Player: " .. user .. " CPU: " .. cpu )
|
||||
io.write( "Play again (Y/N)? " )
|
||||
r = io.read()
|
||||
until( r == "N" or r == "n" )
|
||||
30
Task/Penneys-game/MiniScript/penneys-game.mini
Normal file
30
Task/Penneys-game/MiniScript/penneys-game.mini
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
randomTorH = function()
|
||||
if rnd < 0.5 then return "T" else return "H"
|
||||
end function
|
||||
|
||||
if rnd < 0.5 then
|
||||
playerSeq = input("Input your sequence (e.g. HTH): ").upper
|
||||
if playerSeq[1] == "T" then compSeq = "H" else compSeq = "T"
|
||||
compSeq = compSeq + playerSeq[:2]
|
||||
print "I choose: " + compSeq
|
||||
else
|
||||
compSeq = randomTorH + randomTorH + randomTorH
|
||||
print "I choose: " + compSeq
|
||||
playerSeq = input("Input your sequence (e.g. HTH): ").upper
|
||||
end if
|
||||
|
||||
print "Here we go..."
|
||||
seq = ""
|
||||
while true
|
||||
flip = randomTorH
|
||||
print flip
|
||||
seq = seq + flip
|
||||
if seq[-3:] == playerSeq then
|
||||
print "You win!"
|
||||
break
|
||||
else if seq[-3:] == compSeq then
|
||||
print "I win!"
|
||||
break
|
||||
end if
|
||||
wait
|
||||
end while
|
||||
33
Task/Penneys-game/Nim/penneys-game.nim
Normal file
33
Task/Penneys-game/Nim/penneys-game.nim
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
import os, random, sequtils, strutils
|
||||
|
||||
randomize()
|
||||
|
||||
let first = sample([false, true])
|
||||
|
||||
var you, me = ""
|
||||
if first:
|
||||
me = newSeqWith(3, sample("HT")).join()
|
||||
echo "I choose first and will win on first seeing $# in the list of tosses." % me
|
||||
while you.len != 3 or not allCharsInSet(you, {'H', 'T'}) or you == me:
|
||||
stdout.write "What sequence of three Heads/Tails will you win with? "
|
||||
you = stdin.readLine()
|
||||
else:
|
||||
while you.len != 3 or not allCharsInSet(you, {'H', 'T'}):
|
||||
echo "After you: what sequence of three Heads/Tails will you win with? "
|
||||
you = stdin.readLine()
|
||||
me = (if you[1] == 'T': 'H' else: 'T') & you[0..1]
|
||||
echo "I win on first seeing $# in the list of tosses" % me
|
||||
|
||||
var rolled = ""
|
||||
stdout.write "Rolling:\n "
|
||||
while true:
|
||||
rolled.add sample("HT")
|
||||
stdout.write rolled[^1]
|
||||
stdout.flushFile()
|
||||
if rolled.endsWith(you):
|
||||
echo "\n You win!"
|
||||
break
|
||||
elif rolled.endsWith(me):
|
||||
echo "\n I win!"
|
||||
break
|
||||
sleep(1000)
|
||||
196
Task/Penneys-game/Pascal/penneys-game.pas
Normal file
196
Task/Penneys-game/Pascal/penneys-game.pas
Normal file
|
|
@ -0,0 +1,196 @@
|
|||
PROGRAM Penney;
|
||||
|
||||
TYPE
|
||||
CoinToss = (heads, tails);
|
||||
Sequence = array [1..3] of CoinToss;
|
||||
Player = record
|
||||
bet: Sequence;
|
||||
score: integer;
|
||||
end;
|
||||
|
||||
VAR
|
||||
Human, Computer: Player;
|
||||
Rounds, Count: integer;
|
||||
|
||||
Function TossCoin: CoinToss;
|
||||
{ Returns heads or tails at random }
|
||||
Begin
|
||||
if random(2) = 1 then TossCoin := Heads
|
||||
else TossCoin := tails
|
||||
End;
|
||||
|
||||
Procedure PutToss(toss: CoinToss);
|
||||
{ Outputs heads or tails as a letter }
|
||||
Begin
|
||||
if toss = heads then write('H')
|
||||
else write('T')
|
||||
End;
|
||||
|
||||
Function GetToss: CoinToss;
|
||||
{ Reads H or T from the keyboard in either lettercase }
|
||||
var c: char;
|
||||
Begin
|
||||
{ Keep reading characters until we get an appropriate letter }
|
||||
repeat read(c) until c in ['H', 'h', 'T', 't'];
|
||||
{ Interpret the letter }
|
||||
if c in ['H', 'h'] then GetToss := heads
|
||||
else GetToss := tails
|
||||
End;
|
||||
|
||||
Procedure ShowSequence(tosses: Sequence);
|
||||
{ Outputs three coin tosses at once }
|
||||
Var
|
||||
i: integer;
|
||||
Begin
|
||||
for i := 1 to 3 do PutToss(tosses[i])
|
||||
End;
|
||||
|
||||
Procedure ReadSequence(var tosses: Sequence);
|
||||
{ Accepts three coin tosses from the keyboard }
|
||||
Var i: integer;
|
||||
Begin
|
||||
{ Get the 3 letters }
|
||||
for i := 1 to 3 do tosses[i] := GetToss;
|
||||
{ Ignore the rest of the line }
|
||||
readln
|
||||
End;
|
||||
|
||||
Function Optimum(opponent: Sequence): Sequence;
|
||||
{ Generates the optimum sequence against an opponent }
|
||||
Begin
|
||||
case opponent[2] of
|
||||
heads: Optimum[1] := tails;
|
||||
tails: Optimum[1] := heads
|
||||
end;
|
||||
Optimum[2] := opponent[1];
|
||||
Optimum[3] := opponent[2]
|
||||
End;
|
||||
|
||||
Function RandomSequence: Sequence;
|
||||
{ Generates three random coin tosses }
|
||||
Var
|
||||
i: integer;
|
||||
Begin
|
||||
for i := 1 to 3 do RandomSequence[i] := TossCoin
|
||||
End;
|
||||
|
||||
Function Match(first, second: Sequence): Boolean;
|
||||
{ Detects whether a sequence of tosses matches another }
|
||||
Var
|
||||
different: boolean;
|
||||
i: integer;
|
||||
Begin
|
||||
different := false;
|
||||
i := 1;
|
||||
while (i <= 3) and not different do begin
|
||||
if not (first[i] = second[i]) then different := true;
|
||||
i := i + 1
|
||||
end;
|
||||
Match := not different
|
||||
End;
|
||||
|
||||
Procedure PlayRound(var human, computer: Player);
|
||||
{ Shows coin tosses and announces the winner }
|
||||
Var
|
||||
{ We only ever need to store the 3 most recent tosses in memory. }
|
||||
tosses: Sequence;
|
||||
Begin
|
||||
{ Start with the first three tosses }
|
||||
write('Tossing the coin: ');
|
||||
tosses := RandomSequence;
|
||||
ShowSequence(tosses);
|
||||
{ Keep tossing the coin until there is a winner. }
|
||||
while not (Match(human.bet, tosses) or Match(computer.bet, tosses)) do begin
|
||||
tosses[1] := tosses[2];
|
||||
tosses[2] := tosses[3];
|
||||
tosses[3] := TossCoin;
|
||||
PutToss(tosses[3])
|
||||
end;
|
||||
{ Update the winner's score and announce the winner }
|
||||
writeln;
|
||||
writeln;
|
||||
if Match(human.bet, tosses) then begin
|
||||
writeln('Congratulations! You won this round.');
|
||||
human.score := human.score + 1;
|
||||
writeln('Your new score is ', human.score, '.')
|
||||
end
|
||||
else begin
|
||||
writeln('Yay, I won this round!');
|
||||
computer.score := computer.score + 1;
|
||||
writeln('My new score is ', computer.score, '.')
|
||||
end
|
||||
End;
|
||||
|
||||
{ Main Algorithm }
|
||||
|
||||
BEGIN
|
||||
|
||||
{ Welcome the player }
|
||||
writeln('Welcome to Penney''s game!');
|
||||
writeln;
|
||||
write('How many rounds would you like to play? ');
|
||||
readln(Rounds);
|
||||
writeln;
|
||||
writeln('Ok, let''s play ', Rounds, ' rounds.');
|
||||
|
||||
{ Start the game }
|
||||
randomize;
|
||||
Human.score := 0;
|
||||
Computer.score := 0;
|
||||
|
||||
for Count := 1 to Rounds do begin
|
||||
|
||||
writeln;
|
||||
writeln('*** Round #', Count, ' ***');
|
||||
writeln;
|
||||
|
||||
{ Choose someone randomly to pick the first sequence }
|
||||
if TossCoin = heads then begin
|
||||
write('I''ll pick first this time.');
|
||||
Computer.bet := RandomSequence;
|
||||
write(' My sequence is ');
|
||||
ShowSequence(Computer.bet);
|
||||
writeln('.');
|
||||
repeat
|
||||
write('What sequence do you want? ');
|
||||
ReadSequence(Human.bet);
|
||||
if Match(Human.bet, Computer.bet) then
|
||||
writeln('Hey, that''s my sequence! Think for yourself!')
|
||||
until not Match(Human.bet, Computer.bet);
|
||||
ShowSequence(Human.bet);
|
||||
writeln(', huh? Sounds ok to me.')
|
||||
end
|
||||
else begin
|
||||
write('You pick first this time. Enter 3 letters H or T: ');
|
||||
ReadSequence(Human.bet);
|
||||
Computer.bet := Optimum(Human.bet);
|
||||
write('Ok, so you picked ');
|
||||
ShowSequence(Human.bet);
|
||||
writeln;
|
||||
write('My sequence will be ');
|
||||
ShowSequence(Computer.bet);
|
||||
writeln
|
||||
end;
|
||||
|
||||
{ Then we can actually play the round }
|
||||
writeln('Let''s go!');
|
||||
writeln;
|
||||
PlayRound(Human, Computer);
|
||||
writeln;
|
||||
writeln('Press ENTER to go on...');
|
||||
readln
|
||||
|
||||
end;
|
||||
|
||||
{ All the rounds are finished; time to decide who won }
|
||||
writeln;
|
||||
writeln('*** End Result ***');
|
||||
writeln;
|
||||
if Human.score > Computer.score then writeln('Congratulations! You won!')
|
||||
else if Computer.score > Human.score then writeln('Hooray! I won')
|
||||
else writeln('Cool, we tied.');
|
||||
writeln;
|
||||
writeln('Press ENTER to finish.');
|
||||
readln
|
||||
|
||||
END.
|
||||
110
Task/Penneys-game/Perl/penneys-game.pl
Normal file
110
Task/Penneys-game/Perl/penneys-game.pl
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
#!usr/bin/perl
|
||||
use 5.020;
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
#Choose who goes first
|
||||
binaryRand() == 0 ? flipCoin(userFirst()) : flipCoin(compFirst());
|
||||
|
||||
#Return a randomly generated 1 or 0
|
||||
sub binaryRand
|
||||
{
|
||||
return int(rand(2));
|
||||
}
|
||||
#Converts 1's and 0's to H's and T's, respectively.
|
||||
sub convert
|
||||
{
|
||||
my $randNum = binaryRand();
|
||||
if($randNum == 0)
|
||||
{
|
||||
return "T"
|
||||
}
|
||||
else
|
||||
{
|
||||
return "H";
|
||||
}
|
||||
}
|
||||
|
||||
#Prompts for and returns a user's sequence of 3
|
||||
sub uSeq
|
||||
{
|
||||
print("Please enter a sequence of 3 of \"H\" and \"T\". EG: HHT\n>");
|
||||
my $uString = <STDIN>;
|
||||
|
||||
while(1)
|
||||
{
|
||||
#Make it uppercase and validate input
|
||||
chomp($uString);
|
||||
$uString = uc $uString;
|
||||
#Check length and content (H's and T's only!)
|
||||
if(length $uString == 3 && (substr($uString, 0, 1) =~ /[HT]/ &&
|
||||
substr($uString, 1, 1) =~ /[HT]/ &&
|
||||
substr($uString, 2, 1) =~ /[HT]/))
|
||||
{
|
||||
last;
|
||||
}
|
||||
else
|
||||
{
|
||||
print("Error, try again. \n");
|
||||
print("Please enter a sequence of 3 of \"H\" and \"T\". EG: HHT\n");
|
||||
$uString = <STDIN>;
|
||||
}
|
||||
}
|
||||
return $uString;
|
||||
}
|
||||
|
||||
#Returns an array with two elements: [0] user's seq, [1] random computer seq.
|
||||
sub compFirst
|
||||
{
|
||||
my $cSeq;
|
||||
#Randomly draw a sequence of 3
|
||||
for(my $i = 0; $i < 3; $i++)
|
||||
{
|
||||
$cSeq = $cSeq . convert();
|
||||
}
|
||||
|
||||
print("The computer guesses first:\ncomp- $cSeq\n");
|
||||
my $uSeq = uSeq();
|
||||
print("user- $uSeq\n");
|
||||
my @seqArr = ($uSeq, $cSeq);
|
||||
return @seqArr;
|
||||
}
|
||||
|
||||
#Returns an array with two elements: [0] user's seq, [1] optimal computer seq.
|
||||
sub userFirst
|
||||
{
|
||||
print("The user quesses first:\n");
|
||||
my $uSeq = uSeq();
|
||||
my $cSeq;
|
||||
#Generate the optimal sequence based on $uSeq
|
||||
my $middle = substr($uSeq, 1, 1);
|
||||
$middle eq "H" ? $cSeq = "T" : $cSeq = "H";
|
||||
$cSeq = $cSeq . substr($uSeq, 0, 2);
|
||||
|
||||
print("user- $uSeq\ncomp- $cSeq\n");
|
||||
my @seqArr = ($uSeq, $cSeq);
|
||||
return @seqArr;
|
||||
}
|
||||
|
||||
#Flips a coin, checking both sequences against the contents of the given array
|
||||
sub flipCoin
|
||||
{
|
||||
my ($uSeq, $cSeq) = @_;
|
||||
my $coin;
|
||||
while(1)
|
||||
{
|
||||
$coin = $coin . convert();
|
||||
if($coin =~ m/$uSeq/)
|
||||
{
|
||||
print("The sequence of tosses was: $coin\n");
|
||||
say("The player wins! ");
|
||||
last;
|
||||
}
|
||||
elsif($coin =~ m/$cSeq/)
|
||||
{
|
||||
print("The sequence of tosses was: $coin\n");
|
||||
say("The computer wins! ");
|
||||
last;
|
||||
}
|
||||
}
|
||||
}
|
||||
80
Task/Penneys-game/Phix/penneys-game.phix
Normal file
80
Task/Penneys-game/Phix/penneys-game.phix
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
function trio(integer pick)
|
||||
return substitute_all(sprintf("%03b",pick),"10","HT")
|
||||
end function
|
||||
|
||||
function getuser(integer bot)
|
||||
integer user
|
||||
while 1 do
|
||||
user = 8 -- (a bit that clears after 3 shifts)
|
||||
printf(1,"Enter your sequence of 3 (H/T):");
|
||||
while user>7 do
|
||||
integer c = upper(wait_key())
|
||||
if c=#1B then abort(0) end if -- (Escape)
|
||||
if find(c,"HT") then
|
||||
puts(1,c)
|
||||
user = and_bits(user*2+(c='H'),0b111111)
|
||||
end if
|
||||
end while
|
||||
if user!=bot then exit end if
|
||||
printf(1,"\nYou may not pick the same as Robort!\n")
|
||||
end while
|
||||
printf(1,"\n")
|
||||
return user
|
||||
end function
|
||||
|
||||
function getbot(int user)
|
||||
int bot = iff(user=-1?rand(8)-1
|
||||
:4-and_bits(user,2)*2+floor(user/2))
|
||||
printf(1,"Robort picks %s\n", {trio(bot)})
|
||||
return bot
|
||||
end function
|
||||
|
||||
function rungame(integer user, bot)
|
||||
/* We only need to store the last 3 tosses, as 0..7 */
|
||||
int last3 = rand(8)-1
|
||||
|
||||
printf(1,"Rolling: %s",{trio(last3)})
|
||||
while 1 do
|
||||
if user=last3 then
|
||||
printf(1,"\nUser wins!\n")
|
||||
return 1
|
||||
elsif bot=last3 then
|
||||
printf(1,"\nRobort wins!\n")
|
||||
return 0
|
||||
end if
|
||||
last3 = and_bits(last3,3)*2+(rand(2)=1)
|
||||
printf(1,"%c", iff(and_bits(last3,1) ? 'H' : 'T'))
|
||||
sleep(0.5)
|
||||
end while
|
||||
end function
|
||||
|
||||
procedure main()
|
||||
integer playerwins = 0,
|
||||
totalgames = 0,
|
||||
robortwins = 0
|
||||
|
||||
/* Just use ctrl-c or Escape to exit */
|
||||
while 1 do
|
||||
integer user = -1,
|
||||
bot = -1
|
||||
|
||||
printf(1,"\n")
|
||||
if rand(2)=1 then
|
||||
bot = getbot(-1)
|
||||
user = getuser(bot)
|
||||
else
|
||||
user = getuser(-1)
|
||||
bot = getbot(user)
|
||||
end if
|
||||
|
||||
playerwins += rungame(user, bot)
|
||||
totalgames += 1
|
||||
robortwins = totalgames-playerwins
|
||||
|
||||
printf(1,"Robort:%d You:%d out of %d games\n",
|
||||
{robortwins, playerwins, totalgames})
|
||||
printf(1,"==================================\n")
|
||||
end while
|
||||
|
||||
end procedure
|
||||
main()
|
||||
45
Task/Penneys-game/PicoLisp/penneys-game.l
Normal file
45
Task/Penneys-game/PicoLisp/penneys-game.l
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
(seed (in "/dev/urandom" (rd 8)))
|
||||
|
||||
(setq *S (list 0 0))
|
||||
|
||||
(de toss (N)
|
||||
(make
|
||||
(do N
|
||||
(link (if (rand T) "T" "H")) ) ) )
|
||||
|
||||
(de comp (A Lst)
|
||||
(or
|
||||
(for ((I . L) Lst (cddr L) (cdr L))
|
||||
(T (fully = A L) I) )
|
||||
T ) )
|
||||
|
||||
(de score NIL
|
||||
(prinl)
|
||||
(prinl "Total score:")
|
||||
(prinl "^Iuser: " (car *S))
|
||||
(prinl "^Icomp: " (cadr *S)) )
|
||||
|
||||
(de play NIL
|
||||
(let (C (toss 3) Lst (toss (rand 5 12)) U)
|
||||
(prinl)
|
||||
(prin "Select toss: ")
|
||||
(setq U (in NIL (skip) (line)))
|
||||
(prinl "Comp toss: " C)
|
||||
(prinl "Toss: " Lst)
|
||||
(setq @ (comp U Lst) @@ (comp C Lst) )
|
||||
(cond
|
||||
((< @ @@) (prinl "User win.") (inc *S))
|
||||
((> @ @@) (prinl "Comp win.") (inc (cdr *S)))
|
||||
(T (prinl "Draw, lets play again.")) )
|
||||
(score) ) )
|
||||
|
||||
(de go NIL
|
||||
(loop
|
||||
(play)
|
||||
(T
|
||||
(prog
|
||||
(prinl)
|
||||
(prin "Want play again? Y/N: ")
|
||||
(= "N" (uppc (in NIL (char)))) ) ) ) )
|
||||
|
||||
(go)
|
||||
37
Task/Penneys-game/Prolog/penneys-game.pro
Normal file
37
Task/Penneys-game/Prolog/penneys-game.pro
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
play :- rand1(R), game(R).
|
||||
|
||||
game(h) :-
|
||||
format('Your turn first!~n'), player_move(P),
|
||||
response(P,C), format('I am choosing '), maplist(writec, C), nl,
|
||||
rand3(R), maplist(writec,R),
|
||||
roll(P, C, R).
|
||||
|
||||
game(t) :-
|
||||
rand3(C),
|
||||
format('I am choosing '), maplist(writec, C), nl,
|
||||
player_move(P),
|
||||
rand3(R), maplist(writec, R),
|
||||
roll(P, C, R).
|
||||
|
||||
player_move([P1,P2,P3]) :-
|
||||
read_line_to_codes(user_input,Codes),
|
||||
maplist(char_code,[P1,P2,P3],Codes).
|
||||
|
||||
roll(P, _, P) :- format('~nYou Win!~n'), !.
|
||||
roll(_, C, C) :- format('~nI Win!~n'), !.
|
||||
|
||||
roll(P, C, [_,A,B]) :-
|
||||
rand1(R),
|
||||
coin_s(R,S),
|
||||
write(S),
|
||||
roll(P,C,[A,B,R]).
|
||||
|
||||
response([A,B,_], [C,A,B]) :- opp(A,C).
|
||||
|
||||
writec(A) :- coin_s(A,A1), write(A1).
|
||||
rand1(R) :- random(V), round(V,I), coin(I,R).
|
||||
rand3([R1,R2,R3]) :- rand1(R1), rand1(R2), rand1(R3).
|
||||
|
||||
coin(0,h). coin(1,t).
|
||||
coin_s(h, 'H'). coin_s(t, 'T').
|
||||
opp(h, t). opp(t, h).
|
||||
30
Task/Penneys-game/Python/penneys-game.py
Normal file
30
Task/Penneys-game/Python/penneys-game.py
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
from __future__ import print_function
|
||||
import random
|
||||
from time import sleep
|
||||
|
||||
first = random.choice([True, False])
|
||||
|
||||
you = ''
|
||||
if first:
|
||||
me = ''.join(random.sample('HT'*3, 3))
|
||||
print('I choose first and will win on first seeing {} in the list of tosses'.format(me))
|
||||
while len(you) != 3 or any(ch not in 'HT' for ch in you) or you == me:
|
||||
you = input('What sequence of three Heads/Tails will you win with: ')
|
||||
else:
|
||||
while len(you) != 3 or any(ch not in 'HT' for ch in you):
|
||||
you = input('After you: What sequence of three Heads/Tails will you win with: ')
|
||||
me = ('H' if you[1] == 'T' else 'T') + you[:2]
|
||||
print('I win on first seeing {} in the list of tosses'.format(me))
|
||||
|
||||
print('Rolling:\n ', end='')
|
||||
rolled = ''
|
||||
while True:
|
||||
rolled += random.choice('HT')
|
||||
print(rolled[-1], end='')
|
||||
if rolled.endswith(you):
|
||||
print('\n You win!')
|
||||
break
|
||||
if rolled.endswith(me):
|
||||
print('\n I win!')
|
||||
break
|
||||
sleep(1) # For dramatic effect
|
||||
63
Task/Penneys-game/R/penneys-game.r
Normal file
63
Task/Penneys-game/R/penneys-game.r
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
#===============================================================
|
||||
# Penney's Game Task from Rosetta Code Wiki
|
||||
# R implementation
|
||||
#===============================================================
|
||||
|
||||
penneysgame <- function() {
|
||||
|
||||
#---------------------------------------------------------------
|
||||
# Who goes first?
|
||||
#---------------------------------------------------------------
|
||||
|
||||
first <- sample(c("PC", "Human"), 1)
|
||||
|
||||
#---------------------------------------------------------------
|
||||
# Determine the sequences
|
||||
#---------------------------------------------------------------
|
||||
|
||||
if (first == "PC") { # PC goes first
|
||||
|
||||
pc.seq <- sample(c("H", "T"), 3, replace = TRUE)
|
||||
cat(paste("\nI choose first and will win on first seeing", paste(pc.seq, collapse = ""), "in the list of tosses.\n\n"))
|
||||
human.seq <- readline("What sequence of three Heads/Tails will you win with: ")
|
||||
human.seq <- unlist(strsplit(human.seq, ""))
|
||||
|
||||
} else if (first == "Human") { # Player goest first
|
||||
|
||||
cat(paste("\nYou can choose your winning sequence first.\n\n"))
|
||||
human.seq <- readline("What sequence of three Heads/Tails will you win with: ")
|
||||
human.seq <- unlist(strsplit(human.seq, "")) # Split the string into characters
|
||||
pc.seq <- c(human.seq[2], human.seq[1:2]) # Append second element at the start
|
||||
pc.seq[1] <- ifelse(pc.seq[1] == "H", "T", "H") # Switch first element to get the optimal guess
|
||||
cat(paste("\nI win on first seeing", paste(pc.seq, collapse = ""), "in the list of tosses.\n"))
|
||||
|
||||
}
|
||||
|
||||
#---------------------------------------------------------------
|
||||
# Start throwing the coin
|
||||
#---------------------------------------------------------------
|
||||
|
||||
cat("\nThrowing:\n")
|
||||
|
||||
ran.seq <- NULL
|
||||
|
||||
while(TRUE) {
|
||||
|
||||
ran.seq <- c(ran.seq, sample(c("H", "T"), 1)) # Add a new coin throw to the vector of throws
|
||||
|
||||
cat("\n", paste(ran.seq, sep = "", collapse = "")) # Print the sequence thrown so far
|
||||
|
||||
if (length(ran.seq) >= 3 && all(tail(ran.seq, 3) == pc.seq)) {
|
||||
cat("\n\nI win!\n")
|
||||
break
|
||||
}
|
||||
|
||||
if (length(ran.seq) >= 3 && all(tail(ran.seq, 3) == human.seq)) {
|
||||
cat("\n\nYou win!\n")
|
||||
break
|
||||
}
|
||||
|
||||
Sys.sleep(0.5) # Pause for 0.5 seconds
|
||||
|
||||
}
|
||||
}
|
||||
68
Task/Penneys-game/REXX/penneys-game.rexx
Normal file
68
Task/Penneys-game/REXX/penneys-game.rexx
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
/*REXX program plays/simulates Penney's Game, a two─player coin toss sequence game. */
|
||||
__= copies('─', 9) /*literal for eye─catching fence. */
|
||||
signal on halt /*a clean way out if CLBF quits. */
|
||||
parse arg # seed . /*obtain optional arguments from the CL*/
|
||||
if #=='' | #=="," then #= 3 /*Not specified? Then use the default.*/
|
||||
if datatype(seed,'W') then call random ,,seed /*use seed for RANDOM #s repeatability.*/
|
||||
wins=0; do games=1 /*simulate a number of Penney's games. */
|
||||
call game /*simulate a single inning of a game. */
|
||||
end /*games*/ /*keep at it until QUIT or halt. */
|
||||
exit /*stick a fork in it, we're all done. */
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
halt: say; say __ "Penney's Game was halted."; say; exit 13
|
||||
r: arg ,$; do arg(1); $=$ || random(100, 9991) // 2; end; return $
|
||||
s: if arg(1)==1 then return arg(3); return word(arg(2) 's',1) /*pluralizer.*/
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
game: @.=; tosses=@. /*the coin toss sequence so far. */
|
||||
toss1= r(1) /*result: 0=computer, 1=CBLF.*/
|
||||
if \toss1 then call randComp /*maybe let the computer go first*/
|
||||
if toss1 then say __ "You win the first toss, so you pick your sequence first."
|
||||
else say __ "The computer won first toss, the pick was: " @.comp
|
||||
call prompter /*get the human's guess from C.L.*/
|
||||
call randComp /*get computer's guess if needed.*/
|
||||
/*CBLF: carbon-based life form. */
|
||||
say __ " your pick:" @.CBLF /*echo human's pick to terminal. */
|
||||
say __ "computer's pick:" @.comp /* " comp.'s " " " */
|
||||
say /* [↓] flip the coin 'til a win.*/
|
||||
do flips=1 until pos(@.CBLF, tosses)\==0 | pos(@.comp, tosses)\==0
|
||||
tosses= tosses || translate( r(1), 'HT', 10)
|
||||
end /*flips*/ /* [↑] this is a flipping coin,*/
|
||||
/* [↓] series of tosses*/
|
||||
say __ "The tossed coin series was: " tosses
|
||||
say
|
||||
@@@="won this toss with " flips ' coin tosses.'
|
||||
if pos(@.CBLF,tosses)\==0 then do; say __ "You" @@@; wins=wins+1; end
|
||||
else say __ "The computer" @@@
|
||||
_=wins; if _==0 then _='no'
|
||||
say __ "You've won" _ "game"s(wins) 'out of ' games"."
|
||||
say; say copies('╩╦', 79 % 2)'╩'; say
|
||||
return
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
prompter: oops= __ 'Oops! '; a= /*define some handy REXX literals*/
|
||||
@a_z= 'ABCDEFG-IJKLMNOPQRS+UVWXYZ' /*the extraneous alphabetic chars*/
|
||||
p=__ 'Pick a sequence of' # "coin tosses of H or T (Heads or Tails) or Quit:"
|
||||
do until ok; say; say p; pull a /*uppercase the answer. */
|
||||
if abbrev('QUIT', a, 1) then exit 1 /*the human wants to quit. */
|
||||
a= space( translate(a,,@a_z',./\;:_'), 0) /*elide extraneous characters. */
|
||||
b= translate(a, 10, 'HT'); L= length(a) /*translate ───► bin; get length.*/
|
||||
ok= 0 /*the response is OK (so far). */
|
||||
select /*verify the user response. */
|
||||
when \datatype(b, 'B') then say oops "Illegal response."
|
||||
when \datatype(a, 'M') then say oops "Illegal characters in response."
|
||||
when L==0 then say oops "No choice was given."
|
||||
when L<# then say oops "Not enough coin choices."
|
||||
when L># then say oops "Too many coin choices."
|
||||
when a==@.comp then say oops "You can't choose the computer's" ,
|
||||
"choice: " @.comp
|
||||
otherwise ok= 1
|
||||
end /*select*/
|
||||
end /*until ok*/
|
||||
@.CBLF= a; @.CBLF!= b /*we have the human's guess now. */
|
||||
return
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
randComp: if @.comp\=='' then return /*the computer already has a pick*/
|
||||
_= @.CBLF! /* [↓] use best-choice algorithm.*/
|
||||
if _\=='' then g= left((\substr(_, min(2, #), 1))left(_, 1)substr(_, 3), #)
|
||||
do until g\==@.CBLF!; g= r(#); end /*otherwise, generate a choice. */
|
||||
@.comp= translate(g, 'HT', 10)
|
||||
return
|
||||
37
Task/Penneys-game/Racket/penneys-game.rkt
Normal file
37
Task/Penneys-game/Racket/penneys-game.rkt
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
#lang racket
|
||||
;; Penney's Game. Tim Brown 2014-10-15
|
||||
(define (flip . _) (match (random 2) (0 "H") (1 "T")))
|
||||
|
||||
(define (get-human-sequence) ; no sanity checking here!
|
||||
(display "choose your winning sequence of 3 H or T > ")
|
||||
(drop-right (drop (string-split (string-upcase (read-line)) "") 1) 1))
|
||||
|
||||
(define flips->string (curryr string-join "."))
|
||||
|
||||
(define (game-on p1 p2)
|
||||
(printf "~a chooses: ~a. ~a chooses: ~a~%"
|
||||
(car p1) (flips->string (cdr p1)) (car p2) (flips->string (cdr p2)))
|
||||
(match-define (list (list name.1 p1.1 p1.2 p1.3) (list name.2 p2.1 p2.2 p2.3)) (list p1 p2))
|
||||
(let turn ((seq null))
|
||||
(match seq
|
||||
[(list-rest (== p1.3) (== p1.2) (== p1.1) _) name.1]
|
||||
[(list-rest (== p2.3) (== p2.2) (== p2.1) _) name.2]
|
||||
[else
|
||||
(let* ((flp (flip)) (seq+ (cons flp else)))
|
||||
(printf "new-flip: ~a -> ~a~%" flp (flips->string (reverse seq+))) (turn seq+))])))
|
||||
|
||||
(define (play-game)
|
||||
(define-values
|
||||
(player-1 player-2)
|
||||
(match (flip)
|
||||
["H" (printf "Human chooses first: ")
|
||||
(define p1 (cons 'Hom-Sap (get-human-sequence)))
|
||||
(values p1 (cons 'Computer
|
||||
(match p1
|
||||
[(list _ f1 (and f2 (app (match-lambda ("H" "T") ("T" "H")) ¬f2)) _)
|
||||
(list ¬f2 f1 f2)])))]
|
||||
["T" (printf "Computer chooses first. ")
|
||||
(define p1 (cons 'Computer (build-list 3 flip)))
|
||||
(printf "~a chooses: ~a~%" (car p1) (flips->string (cdr p1)))
|
||||
(values p1 (cons 'Hom-Sap (get-human-sequence)))]))
|
||||
(printf "~a wins!~%" (game-on player-1 player-2)))
|
||||
72
Task/Penneys-game/Raku/penneys-game.raku
Normal file
72
Task/Penneys-game/Raku/penneys-game.raku
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
enum Coin <Heads Tails>;
|
||||
enum Yay <Yay Good Super Hah Ooh Yipee Sweet Cool Yes Haha>;
|
||||
enum Boo <Drat Darn Crumb Oops Rats Bah Criminy Argh Shards>;
|
||||
enum Bozo «'Dude' 'Cha' 'Bzzt' 'Hey' 'Silly dilly' 'Say what!?' 'You numbskull'»;
|
||||
|
||||
sub flipping {
|
||||
for 1..4 {
|
||||
print "-\b"; sleep .1;
|
||||
print "\\\b"; sleep .1;
|
||||
print "|\b"; sleep .1;
|
||||
print "/\b"; sleep .1;
|
||||
}
|
||||
}
|
||||
|
||||
sub your-choice($p is copy) {
|
||||
loop (my @seq; @seq != 3; $p = "{Bozo.pick}! Please pick exactly 3: ") {
|
||||
@seq = prompt($p).uc.comb(/ H | T /).map: {
|
||||
when 'H' { Heads }
|
||||
when 'T' { Tails }
|
||||
}
|
||||
}
|
||||
@seq;
|
||||
}
|
||||
|
||||
repeat until prompt("Wanna play again? ").lc ~~ /^n/ {
|
||||
my $mefirst = Coin.roll;
|
||||
print tc "$mefirst I start, {Coin(+!$mefirst).lc} you start, flipping...\n\t";
|
||||
flipping;
|
||||
say my $flip = Coin.roll;
|
||||
|
||||
my @yours;
|
||||
my @mine;
|
||||
|
||||
if $flip == $mefirst {
|
||||
print "{Yay.pick}! I get to choose first, and I choose: "; sleep 2; say @mine = |Coin.roll(3);
|
||||
@yours = your-choice("Now you gotta choose: ");
|
||||
while @yours eqv @mine {
|
||||
say "{Bozo.pick}! We'd both win at the same time if you pick that!";
|
||||
@yours = your-choice("Pick something different from me: ");
|
||||
}
|
||||
say "So, you'll win if we see: ", @yours;
|
||||
}
|
||||
else {
|
||||
@yours = your-choice("{Boo.pick}! First you choose: ");
|
||||
say "OK, you'll win if we see: ", @yours;
|
||||
print "In that case, I'll just randomly choose: "; sleep 2; say @mine = Coin(+!@yours[1]), |@yours[0,1];
|
||||
}
|
||||
|
||||
sub check($a,$b,$c) {
|
||||
given [$a,$b,$c] {
|
||||
when @mine { say "\n{Yay.pick}, I win, and you lose!"; Nil }
|
||||
when @yours { say "\n{Boo.pick}, you win, but I'll beat you next time!"; Nil }
|
||||
default { Coin.roll }
|
||||
}
|
||||
}
|
||||
|
||||
sleep 1;
|
||||
say < OK! Ready? Right... So... Yo!>.pick;
|
||||
sleep .5;
|
||||
say ("Pay attention now!",
|
||||
"Watch closely!",
|
||||
"Let's do it...",
|
||||
"You feeling lucky?",
|
||||
"No way you gonna win this...",
|
||||
"Can I borrow that coin again?").pick;
|
||||
sleep 1;
|
||||
print "Here we go!\n\t";
|
||||
for |Coin.roll(3), &check ...^ :!defined {
|
||||
flipping;
|
||||
print "$_ ";
|
||||
}
|
||||
}
|
||||
35
Task/Penneys-game/Ruby/penneys-game.rb
Normal file
35
Task/Penneys-game/Ruby/penneys-game.rb
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
Toss = [:Heads, :Tails]
|
||||
|
||||
def yourChoice
|
||||
puts "Enter your choice (H/T)"
|
||||
choice = []
|
||||
3.times do
|
||||
until (c = $stdin.getc.upcase) == "H" or c == "T"
|
||||
end
|
||||
choice << (c=="H" ? Toss[0] : Toss[1])
|
||||
end
|
||||
puts "You chose #{choice.join(' ')}"
|
||||
choice
|
||||
end
|
||||
|
||||
loop do
|
||||
puts "\n%s I start, %s you start ..... %s" % [*Toss, coin = Toss.sample]
|
||||
if coin == Toss[0]
|
||||
myC = Toss.shuffle << Toss.sample
|
||||
puts "I chose #{myC.join(' ')}"
|
||||
yC = yourChoice
|
||||
else
|
||||
yC = yourChoice
|
||||
myC = Toss - [yC[1]] + yC.first(2)
|
||||
puts "I chose #{myC.join(' ')}"
|
||||
end
|
||||
|
||||
seq = Array.new(3){Toss.sample}
|
||||
print seq.join(' ')
|
||||
loop do
|
||||
puts "\n I win!" or break if seq == myC
|
||||
puts "\n You win!" or break if seq == yC
|
||||
seq.push(Toss.sample).shift
|
||||
print " #{seq[-1]}"
|
||||
end
|
||||
end
|
||||
105
Task/Penneys-game/Rust/penneys-game.rust
Normal file
105
Task/Penneys-game/Rust/penneys-game.rust
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
extern crate rand;
|
||||
|
||||
use std::io::{stdin, stdout, Write};
|
||||
use std::thread;
|
||||
use std::time::Duration;
|
||||
|
||||
use rand::Rng;
|
||||
|
||||
fn toss_coin<R: Rng>(rng: &mut R, print: bool) -> char {
|
||||
let c = if rng.gen() { 'H' } else { 'T' };
|
||||
if print {
|
||||
print!("{}", c);
|
||||
stdout().flush().expect("Could not flush stdout");
|
||||
}
|
||||
c
|
||||
}
|
||||
|
||||
fn gen_sequence<R: Rng>(rng: &mut R, seed: Option<&str>) -> String {
|
||||
let mut seq = String::new();
|
||||
match seed {
|
||||
Some(s) => {
|
||||
let mut iter = s.chars();
|
||||
let c0 = iter.next().unwrap();
|
||||
let next = if c0 == 'H' { 'T' } else { 'H' };
|
||||
seq.push(next);
|
||||
seq.push(c0);
|
||||
seq.push(iter.next().unwrap());
|
||||
}
|
||||
None => {
|
||||
for _ in 0..3 {
|
||||
seq.push(toss_coin(rng, false))
|
||||
}
|
||||
}
|
||||
}
|
||||
seq
|
||||
}
|
||||
|
||||
fn read_sequence(used_seq: Option<&str>) -> String {
|
||||
let mut seq = String::new();
|
||||
loop {
|
||||
seq.clear();
|
||||
println!("Please, enter sequence of 3 coins: H (heads) or T (tails): ");
|
||||
stdin().read_line(&mut seq).expect("failed to read line");
|
||||
seq = seq.trim().to_uppercase();
|
||||
// do the cheapest test first
|
||||
if seq.len() == 3
|
||||
&& seq.chars().all(|c| c == 'H' || c == 'T')
|
||||
&& seq != used_seq.unwrap_or("")
|
||||
{
|
||||
return seq;
|
||||
}
|
||||
|
||||
println!("Please enter correct sequence!");
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut rng = rand::thread_rng();
|
||||
|
||||
println!("--Penney's game--");
|
||||
loop {
|
||||
let useq: String;
|
||||
let aiseq: String;
|
||||
if rng.gen::<bool>() {
|
||||
println!("You choose first!");
|
||||
useq = read_sequence(None);
|
||||
println!("Your sequence: {}", useq);
|
||||
aiseq = gen_sequence(&mut rng, Some(&useq));
|
||||
println!("My sequence: {}", aiseq);
|
||||
} else {
|
||||
println!("I choose first!");
|
||||
aiseq = gen_sequence(&mut rng, None);
|
||||
println!("My sequence: {}", aiseq);
|
||||
useq = read_sequence(Some(&aiseq));
|
||||
println!("Your sequence: {}", useq);
|
||||
}
|
||||
println!("Tossing coins...");
|
||||
let mut coins = String::new();
|
||||
for _ in 0..2 {
|
||||
// toss first 2 coins
|
||||
coins.push(toss_coin(&mut rng, true));
|
||||
thread::sleep(Duration::from_millis(500));
|
||||
}
|
||||
loop {
|
||||
coins.push(toss_coin(&mut rng, true));
|
||||
thread::sleep(Duration::from_millis(500));
|
||||
if coins.contains(&useq) {
|
||||
println!("\nYou win!");
|
||||
break;
|
||||
}
|
||||
if coins.contains(&aiseq) {
|
||||
println!("\nI win!");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
println!(" Play again? 'Y' to play, 'Q' to exit.");
|
||||
let mut input = String::new();
|
||||
stdin().read_line(&mut input).expect("failed to read line");
|
||||
match input.trim_start().chars().next().unwrap() {
|
||||
'Y' | 'y' => continue,
|
||||
_ => break,
|
||||
}
|
||||
}
|
||||
}
|
||||
31
Task/Penneys-game/Sinclair-ZX81-BASIC/penneys-game.basic
Normal file
31
Task/Penneys-game/Sinclair-ZX81-BASIC/penneys-game.basic
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
10 IF RND>=.5 THEN GOTO 100
|
||||
20 PRINT "YOU PICK FIRST."
|
||||
30 INPUT P$
|
||||
40 PRINT "YOU CHOSE ";P$
|
||||
50 LET C$="H"
|
||||
60 IF P$(2)="H" THEN LET C$="T"
|
||||
70 LET C$=C$+P$( TO 2)
|
||||
80 PRINT "I CHOOSE ";C$
|
||||
90 GOTO 190
|
||||
100 PRINT "I PICK FIRST."
|
||||
110 LET C$=""
|
||||
120 FOR I=1 TO 3
|
||||
130 LET C$=C$+"H"
|
||||
140 IF RND>=.5 THEN LET C$(I)="T"
|
||||
150 NEXT I
|
||||
160 PRINT "I CHOOSE ";C$
|
||||
170 INPUT P$
|
||||
180 PRINT "YOU CHOSE ";P$
|
||||
190 LET G$=""
|
||||
200 IF RND>=.5 THEN GOTO 230
|
||||
210 LET G$=G$+"H"
|
||||
220 GOTO 240
|
||||
230 LET G$=G$+"T"
|
||||
240 PRINT AT 5,0;G$
|
||||
250 IF LEN G$<3 THEN GOTO 200
|
||||
260 IF G$(LEN G$-2 TO )=P$ THEN GOTO 290
|
||||
270 IF G$(LEN G$-2 TO )=C$ THEN GOTO 310
|
||||
280 GOTO 200
|
||||
290 PRINT "YOU WIN"
|
||||
300 STOP
|
||||
310 PRINT "I WIN"
|
||||
98
Task/Penneys-game/Tcl/penneys-game.tcl
Normal file
98
Task/Penneys-game/Tcl/penneys-game.tcl
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
package require Tcl 8.6
|
||||
|
||||
oo::class create Player {
|
||||
variable who seq seen idx
|
||||
|
||||
constructor {name sequence} {
|
||||
set who $name
|
||||
set seq $sequence
|
||||
set seen {}
|
||||
set idx end-[expr {[string length $seq] - 1}]
|
||||
}
|
||||
|
||||
method pick {} {
|
||||
return $seq
|
||||
}
|
||||
|
||||
method name {} {
|
||||
return $who
|
||||
}
|
||||
|
||||
method match {digit} {
|
||||
append seen $digit
|
||||
return [expr {[string range $seen $idx end] eq $seq}]
|
||||
}
|
||||
}
|
||||
|
||||
oo::class create HumanPlayer {
|
||||
superclass Player
|
||||
constructor {length {otherPlayersSelection ""}} {
|
||||
fconfigure stdout -buffering none
|
||||
while true {
|
||||
puts -nonewline "What do you pick? (length $length): "
|
||||
if {[gets stdin pick] < 0} exit
|
||||
set pick [regsub -all {[^HT]} [string map {0 H 1 T h H t T} $pick] ""]
|
||||
if {[string length $pick] eq $length} break
|
||||
puts "That's not a legal pick!"
|
||||
}
|
||||
set name "Human"
|
||||
if {[incr ::humans] > 1} {append name " #$::humans"}
|
||||
next $name $pick
|
||||
}
|
||||
}
|
||||
|
||||
oo::class create RobotPlayer {
|
||||
superclass Player
|
||||
constructor {length {otherPlayersSelection ""}} {
|
||||
if {$otherPlayersSelection eq ""} {
|
||||
set pick ""
|
||||
for {set i 0} {$i < $length} {incr i} {
|
||||
append pick [lindex {H T} [expr {int(rand()*2)}]]
|
||||
}
|
||||
} else {
|
||||
if {$length != 3} {
|
||||
error "lengths other than 3 not implemented"
|
||||
}
|
||||
lassign [split $otherPlayersSelection ""] a b c
|
||||
set pick [string cat [string map {H T T H} $b] $a $b]
|
||||
}
|
||||
set name "Robot"
|
||||
if {[incr ::robots] > 1} {append name " #$::robots"}
|
||||
puts "$name picks $pick"
|
||||
next $name $pick
|
||||
}
|
||||
}
|
||||
|
||||
proc game {length args} {
|
||||
puts "Let's play Penney's Game!"
|
||||
|
||||
# instantiate the players
|
||||
set picks {}
|
||||
set players {}
|
||||
while {[llength $args]} {
|
||||
set idx [expr {int(rand()*[llength $args])}]
|
||||
set p [[lindex $args $idx] new $length {*}$picks]
|
||||
set args [lreplace $args $idx $idx]
|
||||
lappend players $p
|
||||
lappend picks [$p pick]
|
||||
}
|
||||
|
||||
# sanity check
|
||||
if {[llength $picks] != [llength [lsort -unique $picks]]} {
|
||||
puts "Two players picked the same thing; that's illegal"
|
||||
}
|
||||
|
||||
# do the game loop
|
||||
while 1 {
|
||||
set coin [lindex {H T} [expr {int(rand()*2)}]]
|
||||
puts "Coin flip [incr counter] is $coin"
|
||||
foreach p $players {
|
||||
if {[$p match $coin]} {
|
||||
puts "[$p name] has won!"
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
game 3 HumanPlayer RobotPlayer
|
||||
66
Task/Penneys-game/UNIX-Shell/penneys-game.sh
Normal file
66
Task/Penneys-game/UNIX-Shell/penneys-game.sh
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
#!/bin/bash
|
||||
main() {
|
||||
printf $'Penney\'s Game\n\n'
|
||||
printf 'Flipping to see who goes first ... '
|
||||
|
||||
if [[ $(flip) == H ]]; then
|
||||
printf 'I do.\n'
|
||||
p2=$(choose_sequence)
|
||||
printf 'I choose: %s\n' "$p2"
|
||||
else
|
||||
printf 'You do.\n'
|
||||
fi
|
||||
|
||||
while true; do
|
||||
read -p 'Enter your three-flip sequence: ' p1
|
||||
p1=$(tr a-z A-Z <<<"$p1")
|
||||
case "$p1" in
|
||||
"$p2") printf 'Sequence must be different from mine\n';;
|
||||
[HT][HT][HT]) break;;
|
||||
*) printf $'Sequence must be three H\'s or T\'s\n';;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ -z "$p2" ]; then
|
||||
p2=$(choose_sequence "$p1")
|
||||
printf 'I choose: %s\n' "$p2"
|
||||
fi
|
||||
|
||||
printf '\nHere we go. %s, you win; %s, I win.\n' "$p1" "$p2"
|
||||
printf 'Flips:'
|
||||
|
||||
flips=
|
||||
while true; do
|
||||
flip=$(flip)
|
||||
printf ' %s' "$flip"
|
||||
flips+=$flip
|
||||
case "$flips" in
|
||||
*$p1) printf $'\nYou win!\n'; exit 0;;
|
||||
*$p2) printf $'\nI win!\n'; exit 1;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
choose_sequence() {
|
||||
local result
|
||||
if (( $# )); then
|
||||
case "$1" in
|
||||
?[Hh]?) result=T;;
|
||||
*) result=H;;
|
||||
esac
|
||||
result+="${1%?}"
|
||||
else
|
||||
result=$(flip)$(flip)$(flip)
|
||||
fi
|
||||
printf '%s\n' "$result"
|
||||
}
|
||||
|
||||
flip() {
|
||||
if (( RANDOM % 2 )); then
|
||||
printf '%s\n' H
|
||||
else
|
||||
printf '%s\n' T
|
||||
fi
|
||||
}
|
||||
|
||||
main "$@"
|
||||
75
Task/Penneys-game/V-(Vlang)/penneys-game.v
Normal file
75
Task/Penneys-game/V-(Vlang)/penneys-game.v
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
import rand
|
||||
import os
|
||||
import time
|
||||
|
||||
const optimum = {
|
||||
"HHH": "THH", "HHT": "THH", "HTH": "HHT", "HTT": "HHT",
|
||||
"THH": "TTH", "THT": "TTH", "TTH": "HTT", "TTT": "HTT"
|
||||
}
|
||||
|
||||
fn main() {
|
||||
r := rand.intn(2) or {exit(1)}
|
||||
mut user_seq :=''
|
||||
mut comp_seq :=''
|
||||
mut coin :=''
|
||||
mut coins :=''
|
||||
mut len := 0
|
||||
mut seq :=''
|
||||
|
||||
if r == 0 {
|
||||
println("You go first")
|
||||
user_seq = user_sequence()
|
||||
println('\n')
|
||||
comp_seq = computer_sequence(user_seq)
|
||||
}
|
||||
else {
|
||||
println("Computer goes first")
|
||||
comp_seq = computer_sequence(user_seq)
|
||||
println('\n')
|
||||
user_seq = user_sequence()
|
||||
}
|
||||
println('\n')
|
||||
for true {
|
||||
if (rand.intn(2) or {exit(1)}) == 0 {coin = 'H'} else {coin = 'T'}
|
||||
coins += coin
|
||||
println("Coins flipped: $coins")
|
||||
len = coins.len
|
||||
if len >= 3 {
|
||||
seq = coins.substr(len - 3, len)
|
||||
if seq == user_seq {
|
||||
println("\nYou win!")
|
||||
exit(0)
|
||||
}
|
||||
if seq == comp_seq {
|
||||
println("\nComputer wins!")
|
||||
exit(0)
|
||||
}
|
||||
}
|
||||
time.sleep(1 * time.second) // extraneous
|
||||
}
|
||||
}
|
||||
|
||||
fn user_sequence() string {
|
||||
mut user_seq :=''
|
||||
println("A sequence of three H or T should be entered")
|
||||
for (user_seq.len != 3) || (user_seq.to_upper().split('').any(it != 'H' && it != 'T') == true) {
|
||||
user_seq = os.input('Enter your sequence: ').str().to_upper()
|
||||
}
|
||||
return user_seq
|
||||
}
|
||||
|
||||
fn computer_sequence(user_seq string) string {
|
||||
mut char_array := []string{len:3}
|
||||
mut comp_seq :=''
|
||||
if user_seq == '' {
|
||||
for _ in 0..2 {
|
||||
if (rand.intn(2) or {exit(1)}) == 0 {char_array << 'T'} else {char_array << 'H'}
|
||||
comp_seq = char_array.join('')
|
||||
}
|
||||
}
|
||||
else {
|
||||
comp_seq = optimum[user_seq]
|
||||
}
|
||||
println("Computer's sequence: $comp_seq")
|
||||
return comp_seq
|
||||
}
|
||||
81
Task/Penneys-game/VBA/penneys-game.vba
Normal file
81
Task/Penneys-game/VBA/penneys-game.vba
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
Option Explicit
|
||||
|
||||
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
|
||||
Private Const HT As String = "H T"
|
||||
|
||||
Public Sub PenneysGame()
|
||||
Dim S$, YourSeq$, ComputeSeq$, i&, Seq$, WhoWin$, flag As Boolean
|
||||
|
||||
Do
|
||||
S = WhoWillBeFirst(Choice("Who will be first"))
|
||||
If S = "ABORT" Then Exit Do
|
||||
Debug.Print S; " start"
|
||||
YourSeq = Choice("Your sequence", 3)
|
||||
If YourSeq Like "*ABORT*" Then Exit Do
|
||||
Debug.Print "Your sequence : " & YourSeq
|
||||
ComputeSeq = vbNullString
|
||||
For i = 1 To 3
|
||||
ComputeSeq = ComputeSeq & Random
|
||||
Next i
|
||||
Debug.Print "Computer sequence : " & ComputeSeq
|
||||
Seq = vbNullString
|
||||
Do
|
||||
Seq = Seq & Random
|
||||
Debug.Print Seq
|
||||
Sleep 1000
|
||||
Loop While Not Winner(ComputeSeq, YourSeq, Seq, WhoWin)
|
||||
Debug.Print WhoWin; " win"
|
||||
If MsgBox(WhoWin & " win" & vbCrLf & "Play again?", vbYesNo) = vbNo Then flag = True
|
||||
Debug.Print ""
|
||||
Loop While Not flag
|
||||
Debug.Print "Game over"
|
||||
End Sub
|
||||
|
||||
Private Function WhoWillBeFirst(YourChoice As String) As String
|
||||
Dim S$
|
||||
S = Random
|
||||
Select Case YourChoice
|
||||
Case "ABORT": WhoWillBeFirst = YourChoice
|
||||
Case Else:
|
||||
WhoWillBeFirst = IIf(S = YourChoice, "You", "Computer")
|
||||
End Select
|
||||
End Function
|
||||
|
||||
Private Function Choice(Title As String, Optional Seq As Integer) As String
|
||||
Dim S$, i&, t$
|
||||
If Seq = 0 Then Seq = 1
|
||||
t = Title
|
||||
For i = 1 To Seq
|
||||
S = vbNullString
|
||||
Do
|
||||
S = InputBox("Choose between H or T : ", t)
|
||||
If StrPtr(S) = 0 Then S = "Abort"
|
||||
S = UCase(S)
|
||||
Loop While S <> "H" And S <> "T" And S <> "ABORT"
|
||||
Choice = Choice & S
|
||||
t = Title & " " & Choice
|
||||
If Choice Like "*ABORT*" Then Exit For
|
||||
Next i
|
||||
End Function
|
||||
|
||||
Private Function Random() As String
|
||||
Randomize Timer
|
||||
Random = Split(HT, " ")(CInt(Rnd))
|
||||
End Function
|
||||
|
||||
Private Function Winner(Cs$, Ys$, S$, W$) As Boolean
|
||||
If Len(S) < 3 Then
|
||||
Winner = False
|
||||
Else
|
||||
If Right(S, 3) = Cs And Right(S, 3) = Ys Then
|
||||
Winner = True
|
||||
W = "Computer & you"
|
||||
ElseIf Right(S, 3) = Cs And Right(S, 3) <> Ys Then
|
||||
Winner = True
|
||||
W = "Computer"
|
||||
ElseIf Right(S, 3) = Ys And Right(S, 3) <> Cs Then
|
||||
Winner = True
|
||||
W = "You"
|
||||
End If
|
||||
End If
|
||||
End Function
|
||||
70
Task/Penneys-game/Wren/penneys-game.wren
Normal file
70
Task/Penneys-game/Wren/penneys-game.wren
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
import "random" for Random
|
||||
import "io" for Stdin, Stdout
|
||||
import "timer" for Timer
|
||||
import "/str" for Str
|
||||
|
||||
var rand = Random.new()
|
||||
|
||||
var optimum = {
|
||||
"HHH": "THH", "HHT": "THH", "HTH": "HHT", "HTT": "HHT",
|
||||
"THH": "TTH", "THT": "TTH", "TTH": "HTT", "TTT": "HTT"
|
||||
}
|
||||
|
||||
var getUserSequence = Fn.new {
|
||||
System.print("A sequence of three H or T should be entered")
|
||||
var userSeq
|
||||
while (true) {
|
||||
System.write("Enter your sequence: ")
|
||||
Stdout.flush()
|
||||
userSeq = Str.upper(Stdin.readLine())
|
||||
if (userSeq.count == 3 && userSeq.all { |c| c == "H" || c == "T" }) break
|
||||
}
|
||||
return userSeq
|
||||
}
|
||||
|
||||
var getComputerSequence = Fn.new { |userSeq|
|
||||
var compSeq
|
||||
if (userSeq == "") {
|
||||
var chars = List.filled(3, null)
|
||||
for (i in 0..2) chars[i] = (rand.int(2) == 0) ? "T" : "H"
|
||||
compSeq = chars.join()
|
||||
} else {
|
||||
compSeq = optimum[userSeq]
|
||||
}
|
||||
System.print("Computer's sequence: %(compSeq)")
|
||||
return compSeq
|
||||
}
|
||||
|
||||
var userSeq
|
||||
var compSeq
|
||||
var r = rand.int(2)
|
||||
if (r == 0) {
|
||||
System.print("You go first")
|
||||
userSeq = getUserSequence.call()
|
||||
System.print()
|
||||
compSeq = getComputerSequence.call(userSeq)
|
||||
} else {
|
||||
System.print("Computer goes first")
|
||||
compSeq = getComputerSequence.call("")
|
||||
System.print()
|
||||
userSeq = getUserSequence.call()
|
||||
}
|
||||
System.print()
|
||||
var coins = ""
|
||||
while (true) {
|
||||
var coin = (rand.int(2) == 0) ? "H" : "T"
|
||||
coins = coins + coin
|
||||
System.print("Coins flipped: %(coins)")
|
||||
var len = coins.count
|
||||
if (len >= 3) {
|
||||
var seq = coins[len-3...len]
|
||||
if (seq == userSeq) {
|
||||
System.print("\nYou win!")
|
||||
return
|
||||
} else if (seq == compSeq) {
|
||||
System.print("\nCompter wins!")
|
||||
return
|
||||
}
|
||||
}
|
||||
Timer.sleep(2000) // wait two seconds for next flip
|
||||
}
|
||||
18
Task/Penneys-game/Zkl/penneys-game.zkl
Normal file
18
Task/Penneys-game/Zkl/penneys-game.zkl
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
fcn coinToss{ (0).random(2) and "H" or "T" } // (0).random(2) --> 0<=r<2
|
||||
reg myBet, yourBet;
|
||||
if(coinToss()=="H"){ // The toss says I go first
|
||||
myBet=(3).pump(String,coinToss);
|
||||
println("I bet ",myBet);
|
||||
yourBet=ask("Your bet of three (H/T): ")[0,3].toUpper();
|
||||
}else{
|
||||
yourBet=ask("Your bet of three (H/T): ")[0,3].toUpper();
|
||||
myBet=((yourBet[1]=="H") and "T" or "H") + yourBet[0,2];
|
||||
println("I bet ",myBet);
|
||||
}
|
||||
print("Flipping: "); coins:="";
|
||||
while(1){
|
||||
print(toss:=coinToss()); coins=coins + toss;
|
||||
if(Void!=coins.find(yourBet)){ println(" You win!"); break; }
|
||||
if(Void!=coins.find(myBet)) { println(" I win!"); break; }
|
||||
// ignore we both won
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue