Guess the number

From Rosetta Code
Jump to: navigation, search
Task
Guess the number
You are encouraged to solve this task according to the task description, using any language you may know.

The task is to write a program where the program chooses a number between 1 and 10. A player is then prompted to enter a guess. If the player guess wrong then the prompt appears again until the guess is correct. When the player has made a successful guess the computer will give a "Well guessed!" message, and the program will exit.

A conditional loop may be used to repeat the guessing until the user is correct.

Cf. Guess the number/With Feedback, Bulls and cows

Contents

[edit] Ada

with Ada.Numerics.Discrete_Random;
with Ada.Text_IO;
procedure Guess_Number is
subtype Number is Integer range 1 .. 10;
package Number_IO is new Ada.Text_IO.Integer_IO (Number);
package Number_RNG is new Ada.Numerics.Discrete_Random (Number);
Generator  : Number_RNG.Generator;
My_Number  : Number;
Your_Guess : Number;
begin
Number_RNG.Reset (Generator);
My_Number := Number_RNG.Random (Generator);
Ada.Text_IO.Put_Line ("Guess my number!");
loop
Ada.Text_IO.Put ("Your guess: ");
Number_IO.Get (Your_Guess);
exit when Your_Guess = My_Number;
Ada.Text_IO.Put_Line ("Wrong, try again!");
end loop;
Ada.Text_IO.Put_Line ("Well guessed!");
end Guess_Number;

[edit] Aime

file f;
integer n;
text s;
 
f_affix(f, "/dev/stdin");
 
n = irand(1, 10);
o_text("I'm thinking of a number between 1 and 10.\n");
o_text("Try to guess it!\n");
while (1) {
f_look(f, "0123456789");
f_near(f, "0123456789", s);
if (atoi(s) != n) {
o_text("That's not my number.\n");
o_text("Try another guess!\n");
} else {
break;
}
}
 
o_text("You have won!\n");

[edit] ALGOL 68

Translation of: C
Note: This specimen retains the original C coding style. diff
Works with: ALGOL 68 version Revision 1 - no extensions to language used.
Works with: ALGOL 68G version Any - tested with release 1.18.0-9h.tiny.
main:
(
INT n;
INT g;
n := ENTIER (random*10+1);
PROC puts = (STRING string)VOID: putf(standout, ($gl$,string));
puts("I'm thinking of a number between 1 and 10.");
puts("Try to guess it! ");
DO
readf(($g$, g));
IF g = n THEN break
ELSE
puts("That's not my number. ");
puts("Try another guess!")
FI
OD;
break:
puts("You have won! ")
)

Sample output:

I'm thinking of a number between 1 and 10.
Try to guess it! 
1
That's not my number. 
Try another guess!
2
That's not my number. 
Try another guess!
3
You have won! 

[edit] AutoHotkey

Random, rand, 1, 10  ; This stores a number between 1 and 10 in the var rand using the Mersenne Twister
msgbox I am thinking of a number between 1 and 10.
 
loop
{
InputBox, guess, Guess the number, Type in a number from 1 to 10
If (guess = rand)
{
msgbox Well Guessed!
Break ; exits loop
}
Else
Msgbox Try again.
}
 

[edit] AutoIt

 
$irnd = Random(1, 10, 1)
$iinput = -1
While $input <> $irnd
$iinput = InputBox("Choose a number", "Please chosse a Number between 1 and 10")
WEnd
MsgBox(0, "Success", "Well guessed!")
 

[edit] AWK

 
# syntax: GAWK -f GUESS_THE_NUMBER.AWK
BEGIN {
srand()
n = int(rand() * 10) + 1
print("I am thinking of a number between 1 and 10. Try to guess it.")
while (1) {
getline ans
if (ans !~ /^[0-9]+$/) {
print("Your input was not a number. Try again.")
continue
}
if (n == ans) {
print("Well done you.")
break
}
print("Incorrect. Try again.")
}
exit(0)
}
 

[edit] BASIC

[edit] Applesoft BASIC

10 N% = RND(1) * 10 + 1
20 PRINT "A NUMBER FROM 1 ";
30 PRINT "TO 10 HAS BEEN ";
40 PRINT "RANDOMLY CHOSEN."
50 FOR Q = 0 TO 1 STEP 0
60 INPUT "ENTER A GUESS. "; G%
70 Q = G% = N%
80 NEXT
90 PRINT "WELL GUESSED!"

[edit] QBasic

supervisor:
GOSUB initialize
GOSUB guessing
GOTO continue
 
initialize:
RANDOMIZE TIMER
n = 0: r = INT(RND * 100 + 1): g = 0: c$ = ""
RETURN
 
guessing:
WHILE g <> r
INPUT "Pick a number between 1 and 100"; g
IF g = r THEN
PRINT "You got it!"
n = n + 1
PRINT "It took "; n; "tries to pick the right number."
ELSEIF g < r THEN
PRINT "Try a larger number."
n = n + 1
ELSE
PRINT "Try a smaller number."
n = n + 1
END IF
WEND
RETURN
 
continue:
WHILE c$ <> "YES" AND c$ <> "NO"
INPUT "Do you want to continue? (YES/NO)"; c$
c$ = UCASE$(c$)
IF c$ = "YES" THEN
GOTO supervisor
ELSEIF c$ = "NO" THEN
STOP
END IF
WEND

[edit] ZX Spectrum Basic

The ZX Spectrum does not have conditional loop constructs. We emulate that here using IF and GO TO

10 LET n=INT (RND*10)+1
20 PRINT "I have thought of a number."
30 PRINT "Try to guess it!"
40 INPUT "Enter your guess: ";g
50 IF g=n THEN GO TO 100
60 PRINT "Your guess was wrong. Try again!"
70 GO TO 40
 
100 PRINT "Well done! You guessed it."

[edit] BASIC256

n = int(rand * 10) + 1
print "I am thinking of a number from 1 to 10"
do
input "Guess it > ",g
if g <> n then
print "No luck, Try again."
endif
until g = n
print "Yea! You guessed my number."

[edit] Batch File

@ECHO OFF
setlocal EnableDelayedExpansion
SET max=10
SET min=1
 
:begin
SET /A rand=%random% %% (max - min + 1)+ min
SET guess=
SET /P guess=Pick a number between 1 and 10:
 
:loop
IF "!guess!" == "" (
GOTO end
)
SET /A guess=!guess!
IF !guess! equ !rand! (
ECHO Well guessed^^!
GOTO end
)
SET guess=
SET /P guess=Nope, guess again:
GOTO loop
 
:end
 
ENDLOCAL

[edit] BBC BASIC

      choose% = RND(10)
REPEAT
INPUT "Guess a number between 1 and 10: " guess%
IF guess% = choose% THEN
PRINT "Well guessed!"
END
ELSE
PRINT "Sorry, try again"
ENDIF
UNTIL FALSE

[edit] Brat

number = random 10
 
p "Guess a number between 1 and 10."
 
until {
true? ask("Guess: ").to_i == number
{ p "Well guessed!"; true }
{ p "Guess again!" }
}

[edit] C

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
 
int main(void)
{
int n;
int g;
char c;
 
srand(time(NULL));
n = 1 + (rand() % 10);
 
puts("I'm thinking of a number between 1 and 10.");
puts("Try to guess it:");
 
while (1) {
if (scanf("%d", &g) != 1) {
/* ignore one char, in case user gave a non-number */
scanf("%c", &c);
continue;
}
 
if (g == n) {
puts("Correct!");
return 0;
}
puts("That's not my number. Try another guess:");
}
}

[edit] C++

#include <iostream>
#include <cstdlib>
#include <ctime>
 
int main()
{
srand(time(0));
int n = 1 + (rand() % 10);
int g;
std::cout << "I'm thinking of a number between 1 and 10.\nTry to guess it! ";
while(true)
{
std::cin >> g;
if (g == n)
break;
else
std::cout << "That's not my number.\nTry another guess! ";
}
std::cout << "You've guessed my number!";
return 0;
}
 
 

[edit] C#

using System;
 
class GuessTheNumberGame
{
static void Main()
{
bool numberCorrect = false;
Random randomNumberGenerator = new Random();
int randomNumber = randomNumberGenerator.Next(1, 10+1);
 
Console.WriteLine("I'm thinking of a number between 1 and 10. Can you guess it?");
do
{
Console.Write("Guess: ");
int userGuess = int.Parse(Console.ReadLine());
 
if (userGuess == randomNumber)
{
numberCorrect = true;
Console.WriteLine("Congrats!! You guessed right!");
}
else
Console.WriteLine("That's not it. Guess again.");
} while (!numberCorrect);
}
};

[edit] Clojure

 
(def target (inc (rand-int 10))
 
(loop [n 0]
(println "Guess a number between 1 and 10 until you get it right:")
(let [guess (read)]
(if (= guess target)
(printf "Correct on the %d guess.\n" n)
(do
(println "Try again")
(recur (inc n))))))
 

[edit] COBOL

       IDENTIFICATION DIVISION.
PROGRAM-ID. Guess-The-Number.
 
DATA DIVISION.
WORKING-STORAGE SECTION.
01 Random-Num PIC 99.
01 Guess PIC 99.
 
PROCEDURE DIVISION.
COMPUTE Random-Num = 1 + (FUNCTION RANDOM * 10)
DISPLAY "Guess a number between 1 and 10:"
 
PERFORM FOREVER
ACCEPT Guess
 
IF Guess = Random-Num
DISPLAY "Well guessed!"
EXIT PERFORM
ELSE
DISPLAY "That isn't it. Try again."
END-IF
END-PERFORM
 
GOBACK
.

[edit] CoffeeScript

num = Math.ceil(Math.random() * 10)
guess = prompt "Guess the number. (1-10)"
while parseInt(guess) isnt num
guess = prompt "YOU LOSE! Guess again. (1-10)"
alert "Well guessed!"
Works with: node.js
 
# This shows how to do simple REPL-like I/O in node.js.
readline = require "readline"
 
do ->
number = Math.ceil(10 * Math.random())
interface = readline.createInterface process.stdin, process.stdout
 
guess = ->
interface.question "Guess the number between 1 and 10: ", (answer) ->
if parseInt(answer) == number
# These lines allow the program to terminate.
console.log "GOT IT!"
interface.close()
process.stdin.destroy()
else
console.log "Sorry, guess again"
guess()
 
guess()
 

[edit] Common Lisp

(defun guess-the-number ()
(let ((num-guesses 0)
(num (1+ (random 9)))
(guess nil))
(format t "Try to guess a number from 1 to 10!~%")
(loop do (format t "Guess? ")
(incf num-guesses)
(setf guess (read))
(cond ((not (numberp guess))
(format t "Your guess is not a number!~%"))
((not (= guess num))
(format t "Your guess was wrong. Try again.~%")))
until (and (numberp guess)
(= guess num)))
(format t "You guessed correctly on the ~:r try!~%" num-guesses)))
 

Output:

CL-USER> (guess-the-number)
Try to guess a number from 1 to 10!
Guess? a
Your guess is  not a number!
Guess? 1
Your guess was wrong.  Try again.
Guess? 2
Your guess was wrong.  Try again.
Guess? 3
You guessed correctly on the fourth try!

[edit] D

 
void main() {
immutable num = uniform(1, 10).text;
 
do write("What's next guess (1 - 9)? ");
while (readln.strip != num);
 
writeln("Yep, you guessed my ", num);
}
Output:
What's next guess (1 - 9)? 1
What's next guess (1 - 9)? 2
What's next guess (1 - 9)? 3
Yep, you guessed my 3!

[edit] Delphi

program GuessTheNumber;
 
{$APPTYPE CONSOLE}
 
uses SysUtils;
 
var
theDigit : String ;
theAnswer : String ;
 
begin
Randomize ;
theDigit := IntToStr(Random(9)+1) ;
while ( theAnswer <> theDigit ) do Begin
Writeln('Please enter a digit between 1 and 10' ) ;
Readln(theAnswer);
End ;
Writeln('Congratulations' ) ;
end.
 

[edit] Déjà Vu

local :number random-range 1 11
 
while true:
if = number to-num !prompt "Guess my number: ":
!print "Congratulations, you've guessed it!"
return
else:
!print "Nope, try again."

[edit] Elixir

This solution calls Erlang functions to obtain random numbers.

 
defmodule GuessingGame do
def init() do
 :random.seed(:erlang.now())
end
def play() do
play(:random.uniform(10))
end
defp play(number) do
guess = Integer.parse(IO.gets "Guess a number (1-10): ")
case guess do
{n, _} when n == number ->
IO.puts "Well guessed!"
{n, _} when 1 <= n and n <= 10 ->
IO.puts "That's not it."
play(number)
_ ->
IO.puts "Guess not in valid range."
play(number)
end
end
end
 
GuessingGame.init()
GuessingGame.play()
 

[edit] Erlang

% Implemented by Arjun Sunel
-module(guess_the_number).
-export([main/0]).
 
main() ->
io:format("Guess my number between 1 and 10 until you get it right:\n"),
N = random:uniform(10),
guess(N).
 
guess(N) ->
{ok, [K]} = io:fread("Guess number : ","~d"),
 
if
K=:=N ->
io:format("Well guessed!!\n");
true ->
guess(N)
end.
 

[edit] Euphoria

Translation of: ZX_Spectrum_Basic
include get.e
 
integer n,g
n = rand(10)
 
puts(1,"I have thought of a number from 1 to 10.\n")
puts(1,"Try to guess it!\n")
 
while 1 do
g = prompt_number("Enter your guess: ",{1,10})
if n = g then
exit
end if
puts(1,"Your guess was wrong. Try again!\n")
end while
 
puts(1,"Well done! You guessed it.")

[edit] Factor

 
USING: io random math math.parser kernel formatting ;
IN: guess-the-number
 
<PRIVATE
 
: gen-number ( -- n )
10 random 1 + ;
 
: make-guess ( n -- n ? )
dup readln string>number = ;
 
: play-game ( n -- n )
[ make-guess ]
[ "Guess a number between 1 and 10:" print flush ] do until ;
 
PRIVATE>
 
: guess-the-number ( -- )
gen-number play-game
"Yes, the number was %d!\n" printf ;
 

[edit] Fantom

 
class Main
{
public static Void main ()
{
Str target := (1..10).random.toStr
Str guess := ""
while (guess != target)
{
echo ("Enter a guess: ")
guess = Env.cur.in.readLine
if (guess.trim == target) // 'trim' to remove any spaces/newline
{
echo ("Well guessed!")
break
}
else
echo ("Failed - try again")
}
}
}
 

[edit] Fortran

program guess_the_number
implicit none
 
integer :: guess
real :: r
integer :: i, clock, count, n
integer,dimension(:),allocatable :: seed
 
real,parameter :: rmax = 10
 
!initialize random number generator:
call random_seed(size=n)
allocate(seed(n))
call system_clock(count)
seed = count
call random_seed(put=seed)
deallocate(seed)
 
!pick a random number between 1 and rmax:
call random_number(r) !r between 0.0 and 1.0
i = int((rmax-1.0)*r + 1.0) !i between 1 and rmax
 
!get user guess:
write(*,'(A)') 'I''m thinking of a number between 1 and 10.'
do !loop until guess is correct
write(*,'(A)',advance='NO') 'Enter Guess: '
read(*,'(I5)') guess
if (guess==i) exit
write(*,*) 'Sorry, try again.'
end do
 
write(*,*) 'You''ve guessed my number!'
 
end program guess_the_number
 

[edit] GML

var n, g;
n = irandom_range(1,10);
show_message("I'm thinking of a number from 1 to 10");
g = get_integer("Please enter guess", 1);
while(g != n)
{
g = get_integer("I'
m sorry "+g+" is not my number, try again. Please enter guess", 1);
}
show_message("Well guessed!");

[edit] Go

package main
 
import (
"fmt"
"math/rand"
"time"
)
 
func main() {
fmt.Print("Guess number from 1 to 10: ")
rand.Seed(time.Now().Unix())
n := rand.Intn(10) + 1
for guess := n; ; fmt.Print("No. Try again: ") {
switch _, err := fmt.Scan(&guess); {
case err != nil:
fmt.Println("\n", err, "\nSo, bye.")
return
case guess == n:
fmt.Println("Well guessed!")
return
}
}
}

[edit] Groovy

 
def random = new Random()
def keyboard = new Scanner(System.in)
def number = random.nextInt(10) + 1
println "Guess the number which is between 1 and 10: "
def guess = keyboard.nextInt()
while (number != guess) {
println "Guess again: "
guess = keyboard.nextInt()
}
println "Hurray! You guessed correctly!"
 

[edit] GW-BASIC

10 RANDOMIZE TIMER:N=INT(RND*10+1):G=0
20 PRINT "Guess the number between 1 and 10."
30 WHILE N<>G
40 INPUT "Your guess? ",G
50 WEND
60 PRINT "That's correct!"

[edit] Haskell

 
import Control.Monad
import System.Random
 
-- Repeat the action until the predicate is true.
until_ act pred = act >>= pred >>= flip unless (until_ act pred)
 
answerIs ans guess
| ans == guess = putStrLn "You got it!" >> return True
| otherwise = putStrLn "Nope. Guess again." >> return False
 
ask = liftM read getLine
 
main = do
ans <- randomRIO (1,10) :: IO Int
putStrLn "Try to guess my secret number between 1 and 10."
ask `until_` answerIs ans
 

Simple version:

 
import System.Random
 
main = randomRIO (1,10) >>= gameloop
 
gameloop :: Int -> IO ()
gameloop r = do
i <- fmap read getLine
if i == r
then putStrLn "You got it!"
else putStrLn "Nope. Guess again." >> gameloop r
 

[edit] Icon and Unicon

This solution works in both languages.

procedure main()
n := ?10
repeat {
writes("Pick a number from 1 through 10: ")
if n = numeric(read()) then break
}
write("Well guessed!")
end

[edit] J

require 'misc'
game=: verb define
n=: 1 + ?10
smoutput 'Guess my integer, which is bounded by 1 and 10'
whilst. -. guess -: n do.
guess=. {. 0 ". prompt 'Guess: '
if. 0 -: guess do. 'Giving up.' return. end.
smoutput (guess=n){::'no.';'Well guessed!'
end.
)

Example session:

   game''
Guess my integer, which is bounded by 1 and 10
Guess: 1
no.
Guess: 2
Well guessed!

[edit] Java

Works with: Java version 6+
public class Guessing {
public static void main(String[] args) throws NumberFormatException{
int n = (int)(Math.random() * 10 + 1);
System.out.print("Guess the number between 1 and 10: ");
while(Integer.parseInt(System.console().readLine()) != n){
System.out.print("Wrong! Guess again: ");
}
System.out.println("Well guessed!");
}
}

For pre-Java 6, use a Scanner or BufferedReader for input instead of System.console() (see Input loop#Java).

[edit] JavaScript

 
function guessNumber() {
// Get a random integer from 1 to 10 inclusive
var num = Math.ceil(Math.random() * 10);
var guess;
 
while (guess != num) {
guess = prompt('Guess the number between 1 and 10 inclusive');
}
alert('Congratulations!\nThe number was ' + num);
}
 
guessNumber();

Requires a host environment that supports prompt and alert such as a browser.

[edit] Julia

function guess()
number = rand(1:10)
print("Guess my number! ")
while(chomp(readline(STDIN)) != string(number))
print("Nope, try again! ")
end
println("Well guessed!")
end
Output:
julia> guess()
Guess my number! 6
Nope, try again! 9
Nope, try again! 45
Nope, try again! grr
Nope, try again! 3
Well guessed!

[edit] LabVIEW

This image is a VI Snippet, an executable image of LabVIEW code. The LabVIEW version is shown on the top-right hand corner. You can download it, then drag-and-drop it onto the LabVIEW block diagram from a file browser, and it will appear as runnable, editable code.
LabVIEW Guess the number.png

[edit] Lasso

[edit] Command Line

The following example works when Lasso is called from a command line

local(
number = integer_random(10, 1),
status = false,
guess
)
 
// prompt for a number
stdout('Guess a number between 1 and 10: ')
 
while(not #status) => {
#guess = null
 
// the following bits wait until the terminal gives you back a line of input
while(not #guess or #guess -> size == 0) => {
#guess = file_stdin -> readSomeBytes(1024, 1000)
}
#guess = integer(#guess)
 
if(not (range(#guess, 1, 10) == #guess)) => {
stdout('Input not of correct type or range. Guess a number between 1 and 10: ')
else(#guess == #number)
stdout('Well guessed!')
#status = true
else
stdout('You guessed wrong number. Guess a number between 1 and 10: ')
}
 
}

[edit] Web form

The following example is a web page form

<?LassoScript
 
local(
number = integer(web_request -> param('number') or integer_random(10, 1)),
status = false,
guess = web_request -> param('guess'),
_guess = integer(#guess),
message = 'Guess a number between 1 and 10'
)
 
 
 
if(#guess) => {
if(not (range(#_guess, 1, 10) == #_guess)) => {
#Message = 'Input not of correct type or range. Guess a number between 1 and 10'
else(#_guess == #number)
#Message = 'Well guessed!'
#status = true
else
#Message = 'You guessed wrong number. Guess a number between 1 and 10'
}
}
 
 
?><!DOCTYPE html>
<html lang="en">
<head>
<title>Guess the number - Rosetta Code</title>
</head>
<body>
<h3>[#message]</h3>
[if(not #status)]
<form method="post">
<label for="guess">Guess:</label><br/ >
<input type="number" name="guess" />
<input name="number" type="hidden" value="[#number]" />
<input name="submit" type="submit" />
</form>
[/if]
</body>
</html>

[edit] LFE

 
(defmodule guessing-game
(export (main 0)))
 
(defun get-player-guess ()
(let (((tuple 'ok (list guessed)) (: io fread '"Guess number: " '"~d")))
guessed))
 
(defun check-guess (answer guessed)
(cond
((== answer guessed)
(: io format '"Well-guessed!!~n"))
((/= answer guessed)
(check-guess answer (get-player-guess)))))
 
(defun main ()
(: io format '"Guess the number I have chosen, between 1 and 10.~n")
(check-guess
(: random uniform 10)
(get-player-guess)))
 

From the LFE REPL (assuming the above code was saved in the file "guessing-game.lfe"):

 
> (slurp '"guessing-game.lfe")
#(ok guessing-game)
> (main)
Guess the number I have chosen, between 1 and 10.
Guess number: 10
Guess number: 5
Well-guessed!!
ok
 

[edit] Liberty BASIC

number = int(rnd(0) * 10) + 1
input "Guess the number I'm thinking of between 1 and 10. "; guess
while guess <> number
input "Incorrect! Try again! "; guess
wend
print "Congratulations, well guessed! The number was "; number;"."


[edit] Locomotive Basic

10 RANDOMIZE TIME:num=INT(RND*10+1):guess=0
20 PRINT "Guess the number between 1 and 10."
30 WHILE num<>guess
40 INPUT "Your guess? ", guess
50 WEND
60 PRINT "That's correct!"

[edit] LOLCODE

There is no native support for random numbers. This solution uses a simple linear congruential generator to simulate them, with the lamentable restriction that the user must first be prompted for a seed.

HAI 1.3
 
VISIBLE "SEED ME, FEMUR! "!
I HAS A seed, GIMMEH seed
 
HOW IZ I randomizin
seed R MOD OF SUM OF 1 AN PRODUKT OF 69069 AN seed AN 10
IF U SAY SO
 
I IZ randomizin MKAY
I HAS A answer ITZ SUM OF seed AN 1
I HAS A guess
 
IM IN YR guesser
VISIBLE "WUTS MY NUMBR? "!
GIMMEH guess, guess IS NOW A NUMBR
 
BOTH SAEM guess AN answer, O RLY?
YA RLY, VISIBLE "U WIN!", GTFO
OIC
IM OUTTA YR guesser
 
KTHXBYE

[edit] Lua

math.randomseed( os.time() )
n = math.random( 1, 10 )
 
print( "I'm thinking of a number between 1 and 10. Try to guess it: " )
 
repeat
x = tonumber( io.read() )
 
if x == n then
print "Well guessed!"
else
print "Guess again: "
end
until x == n

[edit] Mathematica / Wolfram Language

number = RandomInteger[{1, 10}];
While[guess =!= number, guess = Input["Guess my number"]];
Print["Well guessed!"]

[edit] MATLAB

number = ceil(10*rand(1));
[guess, status] = str2num(input('Guess a number between 1 and 10: ','s'));
 
while (~status || guess ~= number)
[guess, status] = str2num(input('Guess again: ','s'));
end
disp('Well guessed!')

[edit] MAXScript

 
rand = random 1 10
clearListener()
while true do
(
userval = getKBValue prompt:"Enter an integer between 1 and 10: "
if userval == rand do (format "\nWell guessed!\n"; exit)
format "\nChoose another value\n"
)
 

[edit] Mercury

Mercury does have a 'time' module in its standard library, but it offers an abstract type instead of the seconds-since-the-epoch we want to seed the RNG with. So this is also an example of how easy it is to call out to C. (It's just as easy to call out to C#, Java, and Erlang.) Also, rather than parse the input, this solution prepares the random number to match the typed input. This isn't a weakness of Mercury, just the author's desire to cheat a bit.

:- module guess.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
:- import_module random, string.
 
main(!IO) :-
time(Time, !IO),
random.init(Time, Rand),
random.random(1, 10, N, Rand, _),
main(from_int(N) ++ "\n", !IO).
 
:- pred main(string::in, io::di, io::uo) is det.
main(N, !IO) :-
io.write_string("Guess the number: ", !IO),
io.read_line_as_string(Res, !IO),
(
Res = ok(S),
( if S = N then io.write_string("Well guessed!\n", !IO)
else main(N, !IO) )
 ;
Res = error(E)
 ;
Res = eof
).
 
:- pred time(int::out, io::di, io::uo) is det.
 
:- pragma foreign_decl("C", "#include <time.h>").
:- pragma foreign_proc("C", time(Int::out, _IO0::di, _IO1::uo),
[will_not_call_mercury, promise_pure],
"Int = time(NULL);").

[edit] Nemerle

using System;
using System.Console;
 
module Guess
{
Main() : void
{
def rand = Random();
def x = rand.Next(1, 11); // returns 1 <= x < 11
mutable guess = 0;
 
do
{
WriteLine("Guess a nnumber between 1 and 10:");
guess = Int32.Parse(ReadLine());
} while (guess != x);
 
WriteLine("Well guessed!");
}
}

[edit] NetRexx

/* NetRexx */
 
options replace format comments java crossref savelog symbols nobinary
 
guessThis = (Math.random * 10 + 1) % 1
guess = -1
prompt = [ -
'Try guessing a number between 1 and 10', -
'Wrong; try again...' -
]
promptIdx = int 0
 
loop label g_ until guess = guessThis
say prompt[promptIdx]
promptIdx = 1
parse ask guess .
if guess = guessThis then do
say 'Well guessed!' guess 'is the correct number.'
leave g_
end
end g_
 
return
 

[edit] NewLISP

; guess-number.lsp
; oofoe 2012-01-19
; http://rosettacode.org/wiki/Guess_the_number
 
(seed (time-of-day)) ; Initialize random number generator from clock.
(setq number (+ 1 (rand 10)))
 
(println "I'm thinking of a number between 1 and 10. Can you guess it?")
(print "Type in your guess and hit [enter]: ")
(while (!= number (int (read-line))) (print "Nope! Try again: "))
(println "Well guessed! Congratulations!")
 
(exit)

Sample output:

I'm thinking of a number between 1 and 10. Can you guess it?
Type in your guess and hit [enter]: 5
Nope! Try again: 3
Nope! Try again: 10
Nope! Try again: 1
Nope! Try again: 4
Well guessed! Congratulations!

[edit] Nimrod

 
import strutils, math
 
randomize()
var chosen = 1 + random(10)
echo "I have thought of a number. Try to guess it!"
 
var guess = parseInt(readLine(stdin))
 
while guess != chosen:
echo "Your guess was wrong. Try again!"
guess = parseInt(readLine(stdin))
 
echo "Well guessed!"
 

[edit] Objeck

 
use IO;
 
bundle Default {
class GuessNumber {
function : Main(args : String[]) ~ Nil {
done := false;
"Guess the number which is between 1 and 10 or 'q' to quite: "->PrintLine();
rand_num := (Float->Random() * 10.0)->As(Int) + 1;
while(done = false) {
guess := Console->ReadString();
number := guess->ToInt();
if(number <> 0) {
if(number <> rand_num) {
"Guess again: "->PrintLine();
}
else {
"Hurray! You guessed correctly!"->PrintLine();
done := true;
};
}
else {
if(guess->StartsWith("q") | guess->StartsWith("Q")) {
done := true;
};
};
};
}
}
}
 

[edit] Objective-C

 
#import <Foundation/Foundation.h>
 
int main(int argc, const char * argv[])
{
 
@autoreleasepool {
 
NSLog(@"I'm thinking of a number between 1 - 10. Can you guess what it is?\n");
 
int rndNumber = arc4random_uniform(10) + 1;
 
// Debug (Show rndNumber in console)
//NSLog(@"Random number is %i", rndNumber);
 
int userInput;
 
do {
 
NSLog(@"Input the number below\n");
scanf("%i", &userInput);
 
if (userInput > 10) {
 
NSLog(@"Please enter a number less than 10\n");
}
 
if (userInput > 10 || userInput != rndNumber) {
 
NSLog(@"Your guess %i is incorrect, please try again", userInput);
 
} else {
 
NSLog(@"Your guess %i is correct!", userInput);
}
 
} while (userInput > 10 || userInput != rndNumber);
}
return 0;
}
 

[edit] OCaml

#!/usr/bin/env ocaml
 
let () =
Random.self_init();
let n =
if Random.bool () then
let n = 2 + Random.int 8 in
print_endline "Please guess a number between 1 and 10 excluded";
(n)
else
let n = 1 + Random.int 10 in
print_endline "Please guess a number between 1 and 10 included";
(n)
in
while read_int () <> n do
print_endline "The guess was wrong! Please try again!"
done;
print_endline "Well guessed!"

[edit] PARI/GP

guess()=my(r=random(10)+1);while(input()!=r,); "Well guessed!";

[edit] Pascal

Program GuessTheNumber(input, output);
 
var
number, guess: integer;
 
begin
randomize;
number := random(10) + 1;
writeln ('I''m thinking of a number between 1 and 10, which you should guess.');
write ('Enter your guess: ');
readln (guess);
while guess <> number do
begin
writeln ('Sorry, but your guess is wrong. Please try again.');
write ('Enter your new guess: ');
readln (guess);
end;
writeln ('You made an excellent guess. Thank you and have a nice day.');
end.
 

[edit] Perl

my $number = 1 + int rand 10;
do { print "Guess a number between 1 and 10: " } until <> == $number;
print "You got it!\n";

[edit] Perl 6

my $number = (1..10).pick;
repeat {} until prompt("Guess a number: ") == $number;
say "Guessed right!";

[edit] PHP

 
<?php
 
session_start();
 
if(isset($_SESSION['number']))
{
$number = $_SESSION['number'];
}
else
{
$_SESSION['number'] = rand(1,10);
}
 
 
if($_POST["guess"]){
$guess = htmlspecialchars($_POST['guess']);
 
echo $guess . "<br />";
if ($guess != $number)
{
echo "Your guess is not correct";
}
elseif($guess == $number)
{
echo "You got the correct number!";
}
 
}
?>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Guess A Number</title>
</head>
 
<body>
<form action="<?=$_SERVER['PHP_SELF'] ?>" method="post" name="guess-a-number">
<label for="guess">Guess number:</label><br/ >
<input type="text" name="guess" />
<input name="number" type="hidden" value="<?= $number ?>" />
<input name="submit" type="submit" />
</form>
</body>
</html>
 


[edit] PicoLisp

(de guessTheNumber ()
(let Number (rand 1 9)
(loop
(prin "Guess the number: ")
(T (= Number (read))
(prinl "Well guessed!") )
(prinl "Sorry, this was wrong") ) ) )

[edit] PowerShell

Provides a function that analyzes the provided number by its call. The second script block is important and needed inside the script so the function will be called.

Function GuessNumber($Guess)
{
$Number = Get-Random -min 1 -max 11
Write-Host "What number between 1 and 10 am I thinking of?"
Do
{
Write-Warning "Try again!"
$Guess = Read-Host "What's the number?"
}
While ($Number -ne $Guess)
Write-Host "Well done! You successfully guessed the number $Guess."
}
$myNumber = Read-Host "What's the number?"
GuessNumber $myNumber

[edit] ProDOS

Uses math module:

:a
editvar /modify /value=-random-= <10
editvar /newvar /value=-random- /title=a
editvar /newvar /value=b /userinput=1 /title=Guess a number:
if -b- /hasvalue=-a- printline You guessed correctly! else printline Your guess was wrong & goto :a

[edit] Prolog

Works with: SWI-Prolog version 6
main :-
random_between(1, 10, N),
repeat,
prompt1('Guess the number: '),
read(N),
writeln('Well guessed!'),
!.

Example:

?- main.
Guess the number: 1.
Guess the number: 2.
Guess the number: 3.
Well guessed!
true.

[edit] PureBasic

TheNumber=Random(9)+1
 
Repeat
Print("Guess the number: ")
Until TheNumber=Val(Input())
 
PrintN("Well guessed!")

[edit] Python

'Simple number guessing game'
 
import random
 
target, guess = random.randint(1, 10), 0
while target != guess:
guess = int(input('Guess my number between 1 and 10 until you get it right: '))
print('Thats right!')

[edit] R

f <- function() {
print("Guess a number between 1 and 10 until you get it right.")
n <- 1 + floor(10*runif(1))
while (as.numeric(readline()) != n) {
print("Try again.")
}
print("You got it!")
}

[edit] Racket

#lang racket
(define (guess-number (number (add1 (random 10))))
(define guess (read))
(if (= guess number)
(display "Well guessed!\n")
(guess-number number)))

[edit] Rascal

import vis::Render;
import vis::Figure;
import util::Math;
 
public void Guess(){
random = arbInt(10);
entered = "";
guess = false;
figure = box(vcat([
text("Try to guess the number from 0 to 9."),
textfield("Put your guess here", void(str s){guess = (toInt(s)==random); entered = s; }, fillColor("white")),
text(str(){return guess ? "Correct answer!" : "This is false, the number is not <entered>.";}),
button("Start over", void(){random = arbInt(10);}) ]));
render(figure);
}

Output:

Guess.png

[edit] Retro

: checkGuess ( gn-gf || f )
over = [ drop 0 ] [ "Sorry, try again!\n" puts -1 ] if ;
 
: think ( -n )
random abs 10 mod 1+ ;
 
: guess ( - )
"I'm thinking of a number between 1 and 10.\n" puts
"Try to guess it!\n" puts
think [ getToken toNumber checkGuess ] while
"You got it!\n" puts ;
 

[edit] REXX

[edit] version 1

(Note: most REXXes won't accept that first statement, the shebang/sha-bang/hashbang/pound-bang/hash-exclam/hash-pling.)

#!/usr/bin/rexx
/*REXX program to play: Guess the number */
 
number = random(1,10)
say "I have thought of a number. Try to guess it!"
 
guess=0 /* We don't want a valid guess, before we start */
 
do while guess \= number
pull guess
if guess \= number then
say "Sorry, the guess was wrong. Try again!"
/* endif - There is no endif in rexx. */
end
 
say "Well done! You guessed it!"
 

[edit] version 2

/*REXX program to (interactively) play  "guess my number".              */
?=random(1,10)
say 'Try to guess my number between 1 ──► 10 (inclusive).'
 
do j=1 while g\=?
if j\==1 then say 'Try again.'
pull g
end /*j*/
say 'Well guessed!'
/*stick a fork in it, we're done.*/

[edit] RPL

 
DIR
INITIALIZE
<< { C G R } PURGE RAND 10 * 1 + IP 'R' STO GUESSING
>>
GUESSING
<< "Pick a number between 1 and 10." "" INPUT OBJ-> 'G' STO
IF
G R ==
THEN
CLLCD "You got it!" 1 DISP 7 FREEZE 0 WAIT CLLCD CONTINUE
ELSE
IF
G R <
THEN
CLLCD "Try a larger number." 1 DISP 7 FREEZE 0 WAIT GUESSING
ELSE
CLLCD "Try a smaller number." 1 DISP 7 FREEZE 0 WAIT GUESSING
END
END
>>
CONTINUE
<< "Do you want to continue? (0/1)" "" INPUT OBJ-> 'C' STO
IF
C 1 ==
THEN
INITIALIZE
ELSE
CLEAR
END
>>
END

[edit] Ruby

 
n = rand(1..10)
puts 'Guess the number: '
puts 'Wrong! Guess again: ' until gets.to_i == n
puts 'Well guessed!'
 

[edit] Run BASIC

while 1
choose = int(RND(0) * 9) + 1
while guess <> choose
print "Guess a number between 1 and 10: ";: input guess
if guess = choose THEN
print "You guessed!"
else
print "Sorry, try again"
end if
wend
wend

[edit] Rust

use std::num;
use std::rand::random;
use std::io::stdio::stdin;
 
fn main() {
println!("Type in an integer between 1 and 10 and press enter.");
 
let n = num::abs(random::<int>()) % 10 + 1;
loop {
let line = stdin().read_line().unwrap();
let option: Option<int> = from_str(line.as_slice().trim());
match option {
Some(guess) => {
if guess < 1 || guess > 10 {
println!("Guess is out of bounds; try again.");
} else if guess == n {
println!("Well guessed!");
break;
} else {
println!("Wrong! Try again.");
}
},
None => println!("Invalid input; try again.")
}
}
}
 

[edit] Scala

 
val n = (math.random * 10 + 1).toInt
print("Guess the number: ")
while(readInt != n) print("Wrong! Guess again: ")
println("Well guessed!")
 

[edit] Scheme

Works with: Chicken Scheme
Works with: Guile
(define (guess) 
(define number (random 11))
(display "Pick a number from 1 through 10.\n> ")
(do ((guess (read) (read)))
((= guess number) (display "Well guessed!\n"))
(display "Guess again.\n")))
Output:
scheme> (guess)
Pick a number from 1 through 10.
1
Guess again.
2
Guess again.
3
Guess again.
4
Guess again.
5
Well guessed!

[edit] Seed7

$ include "seed7_05.s7i";
 
const proc: main is func
local
var integer: number is 0;
var integer: guess is 0;
begin
number := rand(1, 10);
writeln("I'm thinking of a number between 1 and 10.");
writeln("Try to guess it!");
readln(guess);
while guess <> number do
writeln("That's not my number.");
writeln("Try another guess!");
readln(guess);
end while;
writeln("You have won!");
end func;

[edit] Tcl

set target [expr {int(rand()*10 + 1)}]
puts "I have thought of a number."
puts "Try to guess it!"
while 1 {
puts -nonewline "Enter your guess: "
flush stdout
gets stdin guess
if {$guess == $target} {
break
}
puts "Your guess was wrong. Try again!"
}
puts "Well done! You guessed it."

Sample output:

I have thought of a number.
Try to guess it!
Enter your guess: 1
Your guess was wrong. Try again!
Enter your guess: 2
Your guess was wrong. Try again!
Enter your guess: 3
Your guess was wrong. Try again!
Enter your guess: 8
Well done! You guessed it.

[edit] TUSCRIPT

 
$$ MODE TUSCRIPT
PRINT "Find the luckynumber (7 tries)!"
luckynumber=RANDOM_NUMBERS (1,10,1)
COMPILE
LOOP round=1,7
message=CONCAT ("[",round,"] Please insert a number")
ASK $message: n=""
IF (n!='digits') THEN
PRINT "wrong insert: ",n," Please insert a digit"
ELSEIF (n>10.or.n<1) THEN
PRINT "wrong insert: ",n," Please insert a number between 1-10"
ELSEIF (n==#luckynumber) THEN
PRINT "BINGO"
EXIT
ENDIF
IF (round==7) PRINT/ERROR "You've lost: luckynumber was: ",luckynumber
ENDLOOP
ENDCOMPILE
 

Output:

Find the luckynumber (7 tries)!
[1] Please insert a number >a
wrong insert: a Please insert a digit
[2] Please insert a number >10
[3] Please insert a number >1
[4] Please insert a number >2
[5] Please insert a number >9
[6] Please insert a number >8
BINGO 

[edit] UNIX Shell

Works with: Bourne Shell
#!/bin/sh
# Guess the number
# This simplified program does not check the input is valid
 
# Use awk(1) to get a random number. If awk(1) not found, exit now.
number=`awk 'BEGIN{print int(rand()*10+1)}'` || exit
 
echo 'I have thought of a number. Try to guess it!'
echo 'Enter an integer from 1 to 10.'
until read guess; [ "$guess" -eq "$number" ]
do
echo 'Sorry, the guess was wrong! Try again!'
done
echo 'Well done! You guessed it.'

An older version used while [ "$guess" -ne "$number" ]. With pdksh, input like '+' or '4x' would force the test to fail, end that while loop, and act like a correct guess. With until [ "$guess" -eq "$number" ], input like '+' or '4x' now continues this until loop, and acts like a wrong guess. With Heirloom's Bourne Shell, '+' acts like '0' (always a wrong guess), and '4x' acts like '4' (perhaps correct).

[edit] C Shell

Library: jot
#!/bin/csh -f
# Guess the number
 
# jot(1) a random number. If jot(1) not found, exit now.
@ number = `jot -r 1 1 10` || exit
 
echo 'I have thought of a number. Try to guess it!'
echo 'Enter an integer from 1 to 10.'
@ guess = "$<"
while ( $guess != $number )
echo 'Sorry, the guess was wrong! Try again!'
@ guess = "$<"
end
echo 'Well done! You guessed it.'

[edit] Vala

int main() {
int x = Random.int_range(1, 10);
stdout.printf("Make a guess (1-10): ");
while(int.parse(stdin.read_line()) != x)
stdout.printf("Wrong! Try again: ");
stdout.printf("Got it!\n");
return 0;
}

[edit] VBScript

randomize
MyNum=Int(rnd*10)+1
Do
x=x+1
YourGuess=InputBox("Enter A number from 1 to 10")
If not Isnumeric(YourGuess) then
msgbox YourGuess &" is not numeric. Try again."
ElseIf CInt(YourGuess)>10 or CInt(YourGuess)<1 then
msgbox YourGuess &" is not between 1 and 10. Try Again."
ElseIf CInt(YourGuess)=CInt(MyNum) then
MsgBox "Well Guessed!"
wscript.quit
ElseIf Cint(YourGuess)<>CInt(Mynum) then
MsgBox "Nope. Try again."
end If
 
if x > 20 then
msgbox "I take pity on you"
wscript.quit
end if
loop

[edit] Wortel

Translation of: JavaScript
@let {
num 10Wc
guess 0
[
@while != guess num
 :guess !prompt "Guess the number between 1 and 10 inclusive"
 !alert "Congratulations!\nThe number was {num}."
]
}

[edit] XPL0

code Ran=1, IntIn=10, Text=12;
int N, G;
[N:= Ran(10)+1;
Text(0, "I'm thinking of a number between 1 and 10.^M^J");
loop [Text(0, "Can you guess it? ");
G:= IntIn(0);
if G=N then quit;
Text(0, "Nope, that's not it.^M^J");
];
Text(0, "Well guessed!^M^J");
]

[edit] Befunge

Works with: Fungus version 0.28
Works with: CCBI version 2.1
v     RNG anthouse
> v ,,,,,,<
v?v ,
vvvvv ,
v?????v ,
vvvvvvvvv ,
>?????????v ,
>vvvvvvvvvv< ,
>??????????< ,
>vvvvvvvvvv< ,
>??????????< ,
>vvvvvvvvvv< ^"Well guessed!"<
>??????????< >"oN",,91v actual game unit
1234567899 ^_91+"!" ^
1 ^-g22<&<>+,v
+>,,,,,,,,,,,,,,,,^
>>>>>>>>>v^"guessthenumber!"+19<
RNG unit > 22p ^

[edit] zkl

Strings are used to avoid dealing with error handling

r:=((0).random(10)+1).toString();
while(1){
n:=ask("Num between 1 & 10: ");
if(n==r){ println("Well guessed!"); break; }
println("Nope")
}
Personal tools
Namespaces

Variants
Actions
Community
Explore
Misc
Toolbox