Sandbox: Difference between revisions

From Rosetta Code
Content added Content deleted
m (* Removed old stuff from sandbox)
(Added Swift task for SplitMix64)
 
(95 intermediate revisions by 18 users not shown)
Line 1: Line 1:
=={{header|Swift}}==
{|class="wikitable sortable"
{{works with|swift|5.9}}
! [[Programming Language|Language]]
<syntaxhighlight lang="Swift">
! Paradigm(s)
struct SplitMix64: RandomNumberGenerator {
! Standarized
var state: UInt64
! [[Type strength]]
init(seed: UInt64) {
! [[Type safety]]
state = seed
! Expression of types
}
! Type Compatability
mutating func next() -> UInt64 {
! Type checking
state &+= 0x9e3779b97f4a7c15
! Intended use
var z = state
! Design goals
z = (z ^ (z >> 30)) &* 0xbf58476d1ce4e5b9
|-
z = (z ^ (z >> 27)) &* 0x94d049bb133111eb
! [[ActionScript]]
return z ^ (z >> 31)
| [[imperative programming]], [[object-oriented]], [[event-driven programming]]
}
| {{yes}}, [[ECMA]]
mutating func nextFloat() -> Float64 {
| strong
Float64(next() >> 11) * 0x1.0p-53
| safe
}
|
}
|

| static
do {
| Web design
var split = SplitMix64(seed: 1234567)
|
print(split)
|-
for _ in 0..<5 {
! [[Ada]]
print(split.next())
| [[concurrent programming|concurrent]], distributed programming, [[generic programming]], [[imperative programming]], [[object-oriented]]
}
| {{yes}}, [[ANSI]], [[ISO]]
split = .init(seed: 987654321)
| strong
print("\n\(split)")
| safe
var counts = [0, 0, 0, 0, 0]
| explicit
for _ in 0..<100_000 {
| nominative
let i = Int(split.nextFloat() * 5.0)
| static
counts[i] += 1
| Embedded, Realtime applications
}
| Reliability
for (i, count) in zip(0..., counts) {
|-
print("\(i): \(count)")
! [[ALGOL 68]]
}
| [[concurrent programming|concurrent]], [[imperative programming]]
}
| {{no}}
</syntaxhighlight>
| strong
{{out}}
| safe
<pre>
|
SplitMix64(state: 1234567)
| structural
6457827717110365317
| static or dynamic
3203168211198807973
| Application
9817491932198370423
| Readability, Structure
4593380528125082431
|-
16408922859458223821
! [[BASIC]]

| [[procedural programming]]
SplitMix64(state: 987654321)
| {{yes}}, [[ANSI]], [[ISO]]
0: 20027
| varies by dialect
1: 19892
|
2: 20073
|
3: 19978
|
4: 20030
|
</pre>
| Education

| Simplicity
=={{header|Java}}==
|-

! [[C]]
This is a direct translation of [[Tamagotchi emulator#Go|the Go version]]. As such, the output will be similar if not identical.
| [[imperative programming]]

| {{yes}}, [[ANSI]] [[C89]], [[ISO]] [[C90]]/[[C99]]
The code does not use any Java 8+ features so it may function on lower versions.
| weak
<syntaxhighlight lang="Java">
| unsafe
package com.mt;
| explicit

| nominative
import java.util.ArrayList;
| static
import java.util.List;
| System
import java.util.Random;
| Low level access, Minimal constraint
import java.util.Scanner;
|-

! [[C sharp|C#]]
class Tamagotchi {
| [[imperative programming]], [[object-oriented]], [[generic programming]], [[reflective programming]]
public String name;
| {{yes}}, [[ECMA]], [[ISO]]
public int age,bored,food,poop;
| strong
| safe (but unsafe allowed)
}
| implicit

| nominative
public class TamagotchiGame {
| static
Tamagotchi tama;//current Tamagotchi
| Application
Random random = new Random(); // pseudo random number generator
| Rapid application development
|-
String[] verbs = {
! [[C++]]
"Ask", "Ban", "Bash", "Bite", "Break", "Build",
| [[imperative programming]], [[object-oriented]], [[generic programming]]
"Cut", "Dig", "Drag", "Drop", "Drink", "Enjoy",
| {{yes}}, [[ISO]]
"Eat", "End", "Feed", "Fill", "Force", "Grasp",
| strong
"Gas", "Get", "Grab", "Grip", "Hoist", "House",
| safe (but unsafe allowed)
"Ice", "Ink", "Join", "Kick", "Leave", "Marry",
| explicit, partially implicit
"Mix", "Nab", "Nail", "Open", "Press", "Quash",
| nominative, structural
"Rub", "Run", "Save", "Snap", "Taste", "Touch",
| static, dynamic
"Use", "Vet", "View", "Wash", "Xerox", "Yield",
| Application, System
};
| Abstraction, Efficiency, Compatibility
|-
String[] nouns = {
! [[Clean]]
"arms", "bugs", "boots", "bowls", "cabins", "cigars",
| [[functional programming]], [[generic programming]]
"dogs", "eggs", "fakes", "flags", "greens", "guests",
| {{no}}
"hens", "hogs", "items", "jowls", "jewels", "juices",
| strong
"kits", "logs", "lamps", "lions", "levers", "lemons",
|
"maps", "mugs", "names", "nests", "nights", "nurses",
| implicit
"orbs", "owls", "pages", "posts", "quests", "quotas",
|
"rats", "ribs", "roots", "rules", "salads", "sauces",
| static
"toys", "urns", "vines", "words", "waters", "zebras",
| General
};
| Correctness, Modularity
|-
String[] boredIc ons = {"💤", "💭", "❓"};
! [[COBOL]]
String[] foodIcons = {"🍼", "🍔", "🍟", "🍰", "🍜"};
| [[imperative programming]], [[object-oriented]]
String[] poopIcons = {"💩"};
| {{yes}}
String[] sickIcons1 = {"😄", "😃", "😀", "😊", "😎", "👍"};//ok
| strong
String[] sickIcons2 = {"😪", "😥", "😰", "😓"};//ailing
|
String[] sickIco ns3 = {"😩", "😫"};//bad
|
String[] sickIcons4 = {"😡", "😱"};//very bad
|
String[] sickIcons5 = {"❌", "💀", "👽", "😇"};//dead
| static
| Business and Financial Applications
String brace(String string) {
| Readability
return String.format("{ %s }", string);
|-
}
! [[ColdFusion]]
| [[procedural programming]], [[object-oriented]]
void create(String name) {
| {{no}}
tama = new Tamagotchi();
| weak
tama.name = name;
|
tama.age = 0;
| implicit
tama.bored = 0;
|
tama.food = 2;
| dynamic
tama.poop = 0;
| Web Development
}
| Rapid Application Development, Ease of use
|-
boolean alive() { // alive if sickness <= 10
! [[Common Lisp]]
return sickness() <= 10;
| [[imperative programming]], [[functional programming]], [[object-oriented]]
}
| {{yes}}
| strong
void feed() {
| safe
tama.food++;
|
}
|
| dynamic
void play() {//may or may not help with boredom
| General
tama.bored = Math.max(0, tama.bored - random.nextInt(2));
| Standardize [[Lisp]]
}
|-
! [[D]]
void talk() {
| [[imperative programming]], [[object-oriented]], [[generic programming]]
String verb = verbs[random.nextInt(verbs.length)];
| {{no}}
String noun = nouns[random.nextInt(nouns.length)];
| strong
System.out.printf("😮 : %s the %s.%n", verb, noun);
| safe
tama.bored = Math.max(0, tama.bored - 1);
| explicit
}
|
| static
void clean() {
| Application, System
tama.poop = Math.max(0, tama.poop - 1);
| Compilability, Correctness, Efficiency
}
|-
! [[Eiffel]]
void idle() {//renamed from wait() due to wait being an existing method from the Object class
| [[imperative programming]], [[object-oriented]], [[generic programming]]
tama.age++;
| {{yes}}, [http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA-367], [http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=42924 ISO/IEC 25436:2006]
tama.bored += random.nextInt(2);
| strong
tama.food = Math.max(0, tama.food - 2);
| safe
tama.poop += random.nextInt(2);
|
}
| nominative
| static
String status() {// get boredom/food/poop icons
| Application
if(alive()) {
| Correctness, Efficiency, Design by contract
StringBuilder b = new StringBuilder(),
|-
f = new StringBuilder(),
! [[Erlang]]
p = new StringBuilder();
| [[functional programming]], [[concurrent programming|concurrent]], distributed programming
for(int i = 0; i < tama.bored; i++) {
| {{no}}
b.append(boredIcons[random.nextInt(boredIcons.length)]);
| strong
}
|
for(int i = 0; i < tama.food; i++) {
|
f.append(foodIcons[random.nextInt(foodIcons.length)]);
|
}
| dynamic
for(int i = 0; i < tama.poop; i++) {
| Telecom and distributed applications
p.append(poopIcons[random.nextInt(poopIcons.length)]);
| Fault tolerance, Scalability
}
|-
! [[Forth]]
return String.format("%s %s %s", brace(b.toString()), brace(f.toString()), brace(p.toString()));
| [[imperative programming]], [[stack]]-oriented
}
| {{yes}}, [[ANSI]]
| none
return " R.I.P";
| n/a
}
| n/a
| n/a
//too much boredom/food/poop
| n/a
int sickness() {
| Application, Embedded systems
//dies at age 42 at the latest
| Compact implementations
return tama.poop + tama.bored + Math.max(0, tama.age - 32) + Math.abs(tama.food - 2);
|-
}
! [[Fortran]]
| [[imperative programming]], [[procedural programming]], [[object-oriented]]
//get health status from sickness level
| {{yes}}
void health() {
| strong
int s = sickness();
| safe
String icon;
|
switch(s) {
| nominative
case 0:
| static
case 1:
| Scientific and numeric applications
case 2:
| Runtime efficiency, Simple syntax
icon = sickIcons1[random.nextInt(sickIcons1.length)];
|-
break;
! [[Groovy]]
case 3:
| [[imperative programming]], [[object-oriented]], [[aspect-oriented programming]]
case 4:
| {{no}}
icon = sickIcons2[random.nextInt(sickIcons2.length)];
| strong
break;
| safe
case 5:
| implicit
case 6:
|
icon = sickIcons3[random.nextInt(sickIcons3.length)];
| dynamic
break;
| Application
case 7:
| [[JVM]] compatibility
case 8:
|-
case 9:
! [[Haskell]]
case 10:
| [[functional programming]], [[generic programming]], [[lazy evaluation]]
icon = sickIcons4[random.nextInt(sickIcons4.length)];
| {{no}}
break;
| strong
default:
|
icon = sickIcons5[random.nextInt(sickIcons5.length)];
| implicit
break;
| structural
}
| static
| Application
System.out.printf("%s (🎂 %d) %s %d %s%n%n", tama.name, tama.age, icon, s, status());
| [[lazy evaluation]], Explicit side-effect
}
|-
! [[J]]
void blurb() {
| [[array]] programming, function-level programming, [[tacit programming]]
System.out.println("When the '?' prompt appears, enter an action optionally");
| {{no}}
System.out.println("followed by the number of repetitions from 1 to 9.");
| strong
System.out.println("If no repetitions are specified, one will be assumed.");
| safe
System.out.println("The available options are: feed, play, talk, clean or wait.\n");
|
}
|
| dynamic
public static void main(String[] args) {
| Data processing
TamagotchiGame game = new TamagotchiGame();
| Terseness, Expressiveness, Powerful Data Manipulation
game.random.setSeed(System.nanoTime());
|-
! [[Java]]
System.out.println(" TAMAGOTCHI EMULATOR");
| [[imperative programming]], [[object-oriented]], [[generic programming]], [[reflective programming]]
System.out.println(" ===================\n");
| {{no}}
| strong
Scanner scanner = new Scanner(System.in);
| safe
System.out.print("Enter the name of your tamagotchi : ");
| explicit
String name = scanner.nextLine().toLowerCase().trim();
| nominative
| static
game.create(name);
| Application
System.out.printf("%n%s (age) health {bored} {food} {poop}%n%n", "name");
| Write once run anywhere
game.health();
|-
game.blurb();
! [[JavaScript]]
| [[imperative programming]], [[object-oriented]], [[functional programming]], [[reflective programming]]
ArrayList<String> commands = new ArrayList<>(List.of("feed", "play", "talk", "clean", "wait"));
| {{yes}}
| weak
int count = 0;
|
while(game.alive()) {
|
System.out.print("? ");
|
String input = scanner.nextLine().toLowerCase().trim();
| dynamic
String[] items = input.split(" ");
| Client side web scripting
if(items.length > 2) continue;
|
|-
String action = items[0];
! [[Joy]]
if(!commands.contains(action)) {
| [[functional programming]], [[stack]]-oriented
continue;
| {{no}}
}
| strong
| safe
int reps = 1;
|
if(items.length == 2) {
|
reps = Integer.parseInt(items[1]);
| dynamic
} else {
| [[functional programming]] research
reps = 1;
| [[concatenative]]
}
|-
! [[Lisp]]
for(int i = 0; i < reps; i++) {
| [[functional programming]], reflective; others vary by dialect
switch(action) {
| {{no}}
case "feed":
| strong
game.feed();
|
break;
|
case "play":
|
game.play();
| dynamic
break;
| General
case "talk":
| Simple notation for Lambda calculus, Homoiconicity
game.talk();
|-
break;
! [[Lua]]
case "wait":
| [[procedural programming]], [[imperative programming]], [[reflective programming|reflective]]
game.idle();
| {{no}}
break;
| strong
}
| safe
| implicit
//simulate a wait on every third (non-wait) action
|
if(!action.equals("wait")) {
| dynamic
count++;
| Host-driven Scripting
if(count%3==0) {
| Small, embedded, configuration.
game.idle();
|-
}
! [[Mathematica]]
}
| [[functional programming]], [[procedural programming]]
}
| {{no}}
game.health();
| strong
}
|
|
scanner.close();
|
}
| dynamic
}
| Numeric computation and visualization

|

|-
</syntaxhighlight>
! [[Object Pascal]] ([[Delphi]])
{{out}}
| [[imperative programming]], [[object-oriented]], [[generic programming]]
<pre>
| {{no}}
TAMAGOTCHI EMULATOR
| strong
===================
| safe (but unsafe allowed)

| explicit
Enter the name of your tamagotchi : jeremy
| nominative

| static
name (age) health {bored} {food} {poop}
| Application, System

| Readability, Rapid application development, Modularity
jeremy (🎂 0) 😀 0 { } { 🍜🍜 } { }
|-

! [[Objective-C]]
When the '?' prompt appears, enter an action optionally
| [[imperative programming]], [[object-oriented]], [[reflective programming]]
followed by the number of repetitions from 1 to 9.
| {{yes}}
If no repetitions are specified, one will be assumed.
| weak
The available options are: feed, play, talk, clean or wait.
|

| explicit
? feed 4
|
jeremy (🎂 1) 😥 3 { } { 🍟🍜🍟🍜 } { 💩 }
| static

| Application
? wait 4
| Smalltalk like, Component based code reuse, C compatibility
jeremy (🎂 5) 😫 5 { 💭💤 } { } { 💩 }
|-

! [[Ocaml]]
? clean 2
| [[object-oriented]], [[functional programming]], [[imperative programming]], generic programming
jeremy (🎂 6) 😫 6 { 💭💭💭 } { } { 💩 }
| {{no}}

| strong
| safe
? talk 4
😮 : Grasp the names.
| implicit
😮 : Vet the greens.
| structural
😮 : Grasp the urns.
| static
😮 : Dig the zebras.
| Application
jeremy (🎂 7) 😰 3 { } { } { 💩 }
| Efficiency, Robustness, Correctness

|-
? feed 6
! [[Oz]]
jeremy (🎂 9) 😊 2 { } { 🍼🍟 } { 💩💩 }
| logic programming, [[functional programming]], [[imperative programming]], [[object-oriented]], [[concurrent programming]] - multi paradigm

| {{no}}
? play 2
|
jeremy (🎂 10) 😩 5 { } { } { 💩💩💩 }
|

|
? talk
|
😮 : Touch the eggs.
| dynamic
jeremy (🎂 10) 😫 5 { } { } { 💩💩💩 }
| Education

|
</pre>
|-
! [[Pascal]]
| [[imperative programming]], [[procedural programming]]
| {{yes}}
| strong
| safe
| explicit
|
| static
| Education
| Readability, Discipline, Modularity
|-
! [[Perl]]
| [[imperative programming]], [[procedural programming]], [[reflective programming]], [[functional programming]], [[object-oriented]], [[generic programming]]
| {{no}}
| weak
|
| implicit
|
| dynamic
| Text processing, Scripting
| Terseness, Expressiveness
|-
! [[PHP]]
| [[imperative programming]], [[object-oriented]], [[reflective programming]]
| {{no}}
| weak
|
|
|
| dynamic
| Web Application, CLI
| Robustness and Simplicity
|-
! [[Prolog]]
| logic programming
| {{yes}}, [[ISO]]
| strong
|
|
|
| dynamic
| Problem solving, Artificial intelligence
| [[declarative programming]]
|-
! [[Python]]
| [[imperative programming]], [[object-oriented]], [[functional programming]], [[aspect-oriented programming]], [[reflective programming]]
| {{no}}
| strong
| safe
| implicit
|
| dynamic
| Application, Education, Scripting
| Simplicity, Readability, Expressiveness, Modularity
|-
! [[Ruby]]
| [[imperative programming]], [[object-oriented]], [[aspect-oriented programming]], [[reflective programming]]
| {{no}}
| strong
|
| implicit
|
| dynamic
| Application, Scripting
| Expressiveness, Readability
|-
! [[Scala]]
| [[object-oriented]], [[functional programming]], [[generic programming]]
| {{no}}
| strong
|
| partially implicit
|
| static
| Education
|
|-
! [[Scheme]]
| [[functional programming]]
| {{yes}}
| strong
|
|
|
| dynamic (latent)
| General, Education
| Minimalistic, Lexical Scoping
|-
! [[Smalltalk]]
| [[object-oriented]], [[concurrent programming]], [[event-driven programming]], [[imperative programming]], [[declarative programming]]
| {{yes}}, [[ANSI]]
| strong
| safe
| implicit
|
| dynamic
| Application, Education
| Uniformity, Pure object oriented
|-
! [[Tcl]]
| [[imperative programming]], [[procedural programming]], [[event-driven programming]]
| {{no}}
|
|
|
|
| dynamic
| Application, Scripting
|
|-
! [[Visual Basic]]
| component-oriented programming, [[event-driven programming]]
| {{no}}
| strong
| safe
|
| nominative
| static
| Application
| Rapid application development, Simplicity
|-
! [[Visual Basic .NET]]
| [[object-oriented]], [[event-driven programming]]
| {{no}}
| strong
|
|
|
| static
| Application
| Rapid application development, Simplicity
|-
! [[Windows PowerShell]]
| [[imperative programming]], [[object-oriented]], [[functional programming]], [[pipeline programming]], [[reflective programming]]
| {{no}}
| strong
| safe
| implicit
|
| dynamic
|
|
|-class="sortbottom"
! [[Programming Language|Language]]
! Paradigm(s)
! Standarized
! [[Type strength]]
! [[Type safety]]
! Expression of types
! Type Compatability
! Type checking
! Intended use
! Design goals
|}

Latest revision as of 02:14, 9 May 2024

Swift

Works with: swift version 5.9
struct SplitMix64: RandomNumberGenerator {
    var state: UInt64
    init(seed: UInt64) {
        state = seed
    }
    mutating func next() -> UInt64 {
        state &+= 0x9e3779b97f4a7c15
        var z = state
        z = (z ^ (z >> 30)) &* 0xbf58476d1ce4e5b9
        z = (z ^ (z >> 27)) &* 0x94d049bb133111eb
        return z ^ (z >> 31)
    }
    mutating func nextFloat() -> Float64 {
        Float64(next() >> 11) * 0x1.0p-53
    }
}

do {
    var split = SplitMix64(seed: 1234567)
    print(split)
    for _ in 0..<5 {
        print(split.next())
    }
    split = .init(seed: 987654321)
    print("\n\(split)")
    var counts = [0, 0, 0, 0, 0]
    for _ in 0..<100_000 {
        let i = Int(split.nextFloat() * 5.0)
        counts[i] += 1
    }
    for (i, count) in zip(0..., counts) {
        print("\(i): \(count)")
    }
}
Output:
SplitMix64(state: 1234567)
6457827717110365317
3203168211198807973
9817491932198370423
4593380528125082431
16408922859458223821

SplitMix64(state: 987654321)
0: 20027
1: 19892
2: 20073
3: 19978
4: 20030

Java

This is a direct translation of the Go version. As such, the output will be similar if not identical.

The code does not use any Java 8+ features so it may function on lower versions.

package com.mt;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

class Tamagotchi {
	public String name;
	public int age,bored,food,poop;
	
}

public class TamagotchiGame {
	Tamagotchi tama;//current Tamagotchi
	Random random = new Random(); // pseudo random number generator
	
	String[] verbs = {
			"Ask", "Ban", "Bash", "Bite", "Break", "Build",
		    "Cut", "Dig", "Drag", "Drop", "Drink", "Enjoy",
		    "Eat", "End", "Feed", "Fill", "Force", "Grasp",
		    "Gas", "Get", "Grab", "Grip", "Hoist", "House",
		    "Ice", "Ink", "Join", "Kick", "Leave", "Marry",
		    "Mix", "Nab", "Nail", "Open", "Press", "Quash",
		    "Rub", "Run", "Save", "Snap", "Taste", "Touch",
		    "Use", "Vet", "View", "Wash", "Xerox", "Yield",
	};
	
	String[] nouns = {
			"arms", "bugs", "boots", "bowls", "cabins", "cigars",
		    "dogs", "eggs", "fakes", "flags", "greens", "guests",
		    "hens", "hogs", "items", "jowls", "jewels", "juices",
		    "kits", "logs", "lamps", "lions", "levers", "lemons",
		    "maps", "mugs", "names", "nests", "nights", "nurses",
		    "orbs", "owls", "pages", "posts", "quests", "quotas",
		    "rats", "ribs", "roots", "rules", "salads", "sauces",
		    "toys", "urns", "vines", "words", "waters", "zebras",
	};
	
	String[] boredIc ons = {"💤", "💭", "❓"};
	String[] foodIcons = {"🍼", "🍔", "🍟", "🍰", "🍜"};
	String[] poopIcons = {"💩"};
	String[] sickIcons1 = {"😄", "😃", "😀", "😊", "😎", "👍"};//ok
	String[] sickIcons2 = {"😪", "😥", "😰", "😓"};//ailing
	String[] sickIco ns3 = {"😩", "😫"};//bad
	String[] sickIcons4 = {"😡", "😱"};//very bad
	String[] sickIcons5 = {"❌", "💀", "👽", "😇"};//dead
	
	String brace(String string) {
		return String.format("{ %s }", string);
	}
	
	void create(String name) {
		tama = new Tamagotchi();
		tama.name = name;
		tama.age = 0;
		tama.bored = 0;
		tama.food = 2;
		tama.poop = 0;
	}
	
	boolean alive() { // alive if sickness <= 10
		return sickness() <= 10;
	}
	
	void feed() {
		tama.food++;
	}
	
	void play() {//may or may not help with boredom
		tama.bored = Math.max(0, tama.bored - random.nextInt(2));
	}
	
	void talk() {
		String verb = verbs[random.nextInt(verbs.length)];
		String noun = nouns[random.nextInt(nouns.length)];
		System.out.printf("😮 : %s the %s.%n", verb, noun);
		tama.bored = Math.max(0, tama.bored - 1);
	}
	
	void clean() {
		tama.poop = Math.max(0, tama.poop - 1);
	}
	
	void idle() {//renamed from wait() due to wait being an existing method from the Object class
		tama.age++;
		tama.bored += random.nextInt(2);
		tama.food = Math.max(0, tama.food - 2);
		tama.poop += random.nextInt(2);
	}
	
	String status() {// get boredom/food/poop icons
		if(alive()) {
			StringBuilder b = new StringBuilder(),
					f = new StringBuilder(),
					p = new StringBuilder();
			for(int i = 0; i < tama.bored; i++) {
				b.append(boredIcons[random.nextInt(boredIcons.length)]);
			}
			for(int i = 0; i < tama.food; i++) {
				f.append(foodIcons[random.nextInt(foodIcons.length)]);
			}
			for(int i = 0; i < tama.poop; i++) {
				p.append(poopIcons[random.nextInt(poopIcons.length)]);
			}
			
			return String.format("%s  %s  %s", brace(b.toString()), brace(f.toString()), brace(p.toString()));
		}
		
		return " R.I.P";
	}
	
	//too much boredom/food/poop
	int sickness() {
		//dies at age 42 at the latest
		return tama.poop + tama.bored + Math.max(0, tama.age - 32) + Math.abs(tama.food - 2);
	}
	
	//get health status from sickness level
	void health() {
		int s = sickness();
		String icon;
		switch(s) {
		case 0:
		case 1:
		case 2:
			icon = sickIcons1[random.nextInt(sickIcons1.length)];
			break;
		case 3:
		case 4:
			icon = sickIcons2[random.nextInt(sickIcons2.length)];
			break;
		case 5:
		case 6:
			icon = sickIcons3[random.nextInt(sickIcons3.length)];
			break;
		case 7:
		case 8:
		case 9:
		case 10:
			icon = sickIcons4[random.nextInt(sickIcons4.length)];
			break;
		default:
			icon = sickIcons5[random.nextInt(sickIcons5.length)];
			break;
		}
		
		System.out.printf("%s (🎂 %d)  %s %d  %s%n%n", tama.name, tama.age, icon, s, status());
	}
	
	void blurb() {
		System.out.println("When the '?' prompt appears, enter an action optionally");
		System.out.println("followed by the number of repetitions from 1 to 9.");
		System.out.println("If no repetitions are specified, one will be assumed.");
		System.out.println("The available options are: feed, play, talk, clean or wait.\n");
	}
	
	public static void main(String[] args) {
		TamagotchiGame game = new TamagotchiGame();
		game.random.setSeed(System.nanoTime());
		
		System.out.println("         TAMAGOTCHI EMULATOR");
		System.out.println("         ===================\n");
		
		Scanner scanner = new Scanner(System.in);
		System.out.print("Enter the name of your tamagotchi : ");
		String name = scanner.nextLine().toLowerCase().trim();
		
		game.create(name);
		System.out.printf("%n%s (age) health {bored} {food}    {poop}%n%n", "name");
		game.health();
		game.blurb();
		
		ArrayList<String> commands = new ArrayList<>(List.of("feed", "play", "talk", "clean", "wait"));
		
		int count = 0;
		while(game.alive()) {
			System.out.print("? ");
			String input = scanner.nextLine().toLowerCase().trim();
			String[] items = input.split(" ");
			if(items.length > 2) continue;
			
			String action = items[0];
			if(!commands.contains(action)) {
				continue;
			}
			
			int reps = 1;
			if(items.length == 2) {
				reps = Integer.parseInt(items[1]);
			} else {
				reps = 1;
			}
			
			for(int i = 0; i < reps; i++) {
				switch(action) {
				case "feed":
					game.feed();
					break;
				case "play":
					game.play();
					break;
				case "talk":
					game.talk();
					break;
				case "wait":
					game.idle();
					break;
				}
				
				//simulate a wait on every third (non-wait) action
				if(!action.equals("wait")) {
					count++;
					if(count%3==0) {
						game.idle();
					}
				}
			}
			game.health();
		}
		
		scanner.close();
	}
}
Output:
         TAMAGOTCHI EMULATOR
         ===================

Enter the name of your tamagotchi : jeremy

name (age) health {bored} {food}    {poop}

jeremy (🎂 0)  😀 0  {  }  { 🍜🍜 }  {  }

When the '?' prompt appears, enter an action optionally
followed by the number of repetitions from 1 to 9.
If no repetitions are specified, one will be assumed.
The available options are: feed, play, talk, clean or wait.

? feed 4
jeremy (🎂 1)  😥 3  {  }  { 🍟🍜🍟🍜 }  { 💩 }

? wait 4
jeremy (🎂 5)  😫 5  { 💭💤 }  {  }  { 💩 }

? clean 2
jeremy (🎂 6)  😫 6  { 💭💭💭 }  {  }  { 💩 }

? talk 4
😮 : Grasp the names.
😮 : Vet the greens.
😮 : Grasp the urns.
😮 : Dig the zebras.
jeremy (🎂 7)  😰 3  {  }  {  }  { 💩 }

? feed 6
jeremy (🎂 9)  😊 2  {  }  { 🍼🍟 }  { 💩💩 }

? play 2
jeremy (🎂 10)  😩 5  {  }  {  }  { 💩💩💩 }

? talk
😮 : Touch the eggs.
jeremy (🎂 10)  😫 5  {  }  {  }  { 💩💩💩 }