Sandbox: Difference between revisions
Content added Content deleted
(Memoization; killed the TT section) |
BodkinsOdds (talk | contribs) (Added Swift task for SplitMix64) |
||
(43 intermediate revisions by 9 users not shown) | |||
Line 1: | Line 1: | ||
=={{header|Swift}}== |
|||
<div class="infobox" style="width: 2in"> |
|||
{{works with|swift|5.9}} |
|||
<big>'''Programming Task'''</big><br /> |
|||
<syntaxhighlight lang="Swift"> |
|||
This is a programming task. It lays out a problem which Rosetta Code users are encouraged to solve, using languages they know. |
|||
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 { |
|||
Code examples should be formatted along the lines of one of the existing [[Help:Example_Programming_Example|prototypes]].{{proggit}} |
|||
var split = SplitMix64(seed: 1234567) |
|||
</div> |
|||
print(split) |
|||
<div class="infobox" style="width: 2in"> |
|||
for _ in 0..<5 { |
|||
<big>'''Programming Task'''</big><br /> |
|||
print(split.next()) |
|||
This is a programming task. It lays out a problem which Rosetta Code users are encouraged to solve, using languages they know. |
|||
} |
|||
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)") |
|||
} |
|||
} |
|||
</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
SplitMix64(state: 1234567) |
|||
6457827717110365317 |
|||
3203168211198807973 |
|||
9817491932198370423 |
|||
4593380528125082431 |
|||
16408922859458223821 |
|||
SplitMix64(state: 987654321) |
|||
Code examples should be formatted along the lines of one of the existing [[Help:Example_Programming_Example|prototypes]].{{proggit}} |
|||
0: 20027 |
|||
</div> |
|||
1: 19892 |
|||
<div class="infobox" style="width: 2in"> |
|||
2: 20073 |
|||
<big>'''Programming Task'''</big><br /> |
|||
3: 19978 |
|||
This is a programming task. It lays out a problem which Rosetta Code users are encouraged to solve, using languages they know. |
|||
4: 20030 |
|||
Code examples should be formatted along the lines of one of the existing [[Help:Example_Programming_Example|prototypes]].{{proggit}} |
|||
</div> |
|||
== Can you use a data URL? == |
|||
[data:text/html,Hello%20World No.] |
|||
== What if you transclude a category? == |
|||
{{Category:Maintenance}} |
|||
-- Okay, the member list doesn't show up. No good. |
|||
<div class="infobox" style="width: 2in"> |
|||
<big>'''Programming Task'''</big><br /> |
|||
This is a programming task. It lays out a problem which Rosetta Code users are encouraged to solve, using languages they know. |
|||
Code examples should be formatted along the lines of one of the existing [[Help:Example_Programming_Example|prototypes]].{{proggit}} |
|||
</div> |
|||
==TITLE== |
|||
code |
|||
---- |
|||
== pre test == |
|||
<div class="infobox" style="width: 2in"> |
|||
<big>'''Programming Task'''</big><br /> |
|||
This is a programming task. It lays out a problem which Rosetta Code users are encouraged to solve, using languages they know. |
|||
Code examples should be formatted along the lines of one of the existing [[Help:Example_Programming_Example|prototypes]].{{proggit}} |
|||
</div> |
|||
<pre style="height:30ex;overflow:scroll"> |
|||
Test |
|||
Another line |
|||
Yet another line, this time one which clearly is much longer than the width of the browser window, at least assuming normal screen dimensions and font settings, and assuming the browser window is not wider than the screen (which would be impractical anyway). |
|||
1 |
|||
2 |
|||
3 |
|||
4 |
|||
5 |
|||
6 |
|||
7 |
|||
8 |
|||
9 |
|||
10 |
|||
11 |
|||
12 |
|||
13 |
|||
14 |
|||
15 |
|||
16 |
|||
17 |
|||
18 |
|||
19 |
|||
20 |
|||
21 |
|||
</pre> |
</pre> |
||
==Testing new language tags== |
|||
===Z80=== |
|||
<lang z80> |
|||
; some random instructions |
|||
ld a, 80h |
|||
ld b, 9Ah |
|||
add a, b |
|||
adc a, a |
|||
rst 0 ; reboot :-) |
|||
</lang> |
|||
== |
=={{header|Java}}== |
||
<lang whitespace> |
|||
This may not be a meaningful whitespace |
|||
program, |
|||
but it's |
|||
just a highlighting test |
|||
anyway. |
|||
</lang> |
|||
This is a direct translation of [[Tamagotchi emulator#Go|the Go version]]. As such, the output will be similar if not identical. |
|||
===AviSynth=== |
|||
<lang avisynth> |
|||
AviSource("D:\clip.avi") |
|||
ConvertToYUY2() |
|||
PixieDust(5) |
|||
</lang> |
|||
The code does not use any Java 8+ features so it may function on lower versions. |
|||
===POV-Ray=== |
|||
<syntaxhighlight lang="Java"> |
|||
<lang povray> |
|||
package com.mt; |
|||
#declare factorial = function(C) { prod(i, 1, C, i) } |
|||
#declare A = factorial(5); |
|||
sphere{0,A} // a sphere |
|||
</lang> |
|||
import java.util.ArrayList; |
|||
===Text=== |
|||
import java.util.List; |
|||
<lang text> |
|||
import java.util.Random; |
|||
Is this actually a programming language, or really just plain text? |
|||
import java.util.Scanner; |
|||
</lang> |
|||
class Tamagotchi { |
|||
===What happens if a language doesn't exist?=== |
|||
public String name; |
|||
<lang somelanguagethatdoesnotexist> |
|||
public int age,bored,food,poop; |
|||
some code |
|||
more code; |
|||
} |
|||
* a b -> c /// &a1 ->>> 778 |
|||
(Probably this is an obfuscated language :-)) |
|||
</lang> |
|||
public class TamagotchiGame { |
|||
==Whitespace test with unicode ZERO WIDTH NO-BREAK SPACE character (U+FEFF)== |
|||
Tamagotchi tama;//current Tamagotchi |
|||
<lang whitespace> |
|||
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 = { |
|||
</lang> |
|||
"arms", "bugs", "boots", "bowls", "cabins", "cigars", |
|||
testing |
|||
"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(); |
|||
} |
|||
} |
|||
== Impl needed == |
|||
Tcl pages: {{PAGESINCAT:Tcl}} |
|||
</syntaxhighlight> |
|||
Tcl/Omit pages: {{PAGESINCAT:Tcl/Omit}} |
|||
{{out}} |
|||
<pre> |
|||
TAMAGOTCHI EMULATOR |
|||
=================== |
|||
Enter the name of your tamagotchi : jeremy |
|||
Programming tasks: {{PAGESINCAT:Programming Tasks}} |
|||
name (age) health {bored} {food} {poop} |
|||
== Property query test == |
|||
If I understand the ask syntax correctly, this should turn up a list of all programming languages: |
|||
{{#ask: [[Subcategory of::Programming Languages]] | default=Apparently I don't understand it correctly.}} |
|||
jeremy (🎂 0) 😀 0 { } { 🍜🍜 } { } |
|||
Or maybe it works this way: |
|||
{{#ask: [[Subcategory of::Category:Programming Languages]] | default=Doesn't work either.}} |
|||
When the '?' prompt appears, enter an action optionally |
|||
Maybe this way: |
|||
followed by the number of repetitions from 1 to 9. |
|||
{{#ask: [[Subcategory of:Programming Languages]] | default=Nor does this.}} |
|||
If no repetitions are specified, one will be assumed. |
|||
The available options are: feed, play, talk, clean or wait. |
|||
? feed 4 |
|||
Maybe this way: |
|||
jeremy (🎂 1) 😥 3 { } { 🍟🍜🍟🍜 } { 💩 } |
|||
{{#ask: [[Category:Programming Languages]] | default=Doesn't work either.}} |
|||
? wait 4 |
|||
This gives a lot of stuff I ''don''t want, but not what I want. Maybe the following works: |
|||
jeremy (🎂 5) 😫 5 { 💭💤 } { } { 💩 } |
|||
{{#ask: [[Subcategory::Programming Languages]] | default=No.}} |
|||
? clean 2 |
|||
Maybe this: |
|||
jeremy (🎂 6) 😫 6 { 💭💭💭 } { } { 💩 } |
|||
{{#ask: [[Subcategory of:Category:Programming Languages]] | default=Again nothing.}} |
|||
? talk 4 |
|||
This should turn up all languages and libraries which provide Graphics: |
|||
😮 : Grasp the names. |
|||
{{#ask: [[provides::Capability:Graphics]] | default=Or not.}} |
|||
😮 : Vet the greens. |
|||
😮 : Grasp the urns. |
|||
😮 : Dig the zebras. |
|||
jeremy (🎂 7) 😰 3 { } { } { 💩 } |
|||
? feed 6 |
|||
This should turn up anything which does ''not'' provide Graphics: |
|||
jeremy (🎂 9) 😊 2 { } { 🍼🍟 } { 💩💩 } |
|||
{{#ask: [[provides::!Capability:Graphics]] | default=Unless it doesn't.}} |
|||
: as I learned now, it instead turns up anything which provides something other than Graphics. |
|||
? play 2 |
|||
This should turn up anything which provides first class functions: |
|||
jeremy (🎂 10) 😩 5 { } { } { 💩💩💩 } |
|||
{{#ask: [[provides::Capability:First class functions]] | default=I would have hoped.}} |
|||
? talk |
|||
And this should be the intersection of the previous two sets: |
|||
😮 : Touch the eggs. |
|||
{{#ask: [[provides::!Capability:Graphics]] [[provides::Capability:First class functions]] | default=Which shouldn't be empty.}} |
|||
jeremy (🎂 10) 😫 5 { } { } { 💩💩💩 } |
|||
</pre> |
|||
This should turn up anything that provides ''or'' allows Graphics: |
|||
{{#ask: [[provides::Capability:Graphics]] OR [[allows::Capability:Graphics]] | default=There should be something here.}} |
|||
This should turn up anything implemented in a language that provides graphics: |
|||
{{#ask: [[Implemented in language.provides::Capability:Graphics]] | default=Nothing!?}} |
|||
Does "implemented in language" work? Let's see everything implemented in Unlambda: |
|||
{{#ask: [[Implemented in language::Unlambda]] | default=Empty!}} |
|||
This should turn up anything implemented in a language that allows graphics: |
|||
{{#ask: [[Implemented in language.allows::Capability:Graphics]] | default=Nothing!?}} |
|||
This might turn up anything which has a "provides" property: |
|||
{{#ask: [[provides::Capability:+]] | default=Or it might not. :-)}} |
|||
What about this: |
|||
{{#ask: [[provides::+]] | default=No.}} |
|||
Is [[Classes]] implemented in C++? |
|||
{{#ask: [[Classes]] [[Implemented in language::C++]] | format=count}} (1 = yes, 0 = no). |
|||
Is [[Classes]] implemented in Unlambda? |
|||
{{#ask: [[Classes]] [[Implemented in language::Unlambda]] | format=count}} (1 = yes, 0 = no). |
|||
The following assumes a (currently non-existent) template "ignore" which takes an argument and ignores it. With that template, if the task [[Mutex]] is implemented in C++, nothing would be printed, otherwise a nested ask is executed, which just lists all requirements of Mutex (assuming I've got everything right): |
|||
{{#ask: [[Mutex]] [[Implemented in language::C++]] | format=template | template=ignore | default={{#ask: [[Mutex]] | ?requires}}}} |
|||
And now the same with Unlambda instead of C++ (there's of course no Unlambda implementation): |
|||
{{#ask: [[Mutex]] [[Implemented in language::Unlambda]] | format=template | template=ignore | default={{#ask: [[Mutex]] | ?requires}}}} |
|||
The same without the "Requires" text: |
|||
{{#ask: [[Mutex]] [[Implemented in language::Unlambda]] | format=template | template=ignore | default={{#ask: [[Mutex]] | ?requires =}}}} |
|||
---- |
|||
=Memoization= |
|||
Memoization is a method used to reduce function calls in recursive functions or other functions that are called very frequently. The basic idea behind memoizing is to store results for new sets of inputs (typically in a key-value style) so that the function will not have to re-compute those results later. |
|||
Functions which can be memoized are ones that give the same answer for a set of inputs each time those inputs are used. [[Fibonacci sequence|Fibonacci number functions]] are often memoized to reduce their call trees and calculation times over time. The basic operation of a memoized function would look something like this: |
|||
function a with inputs |
|||
if inputs have been seen before |
|||
return a stored answer from when they were seen |
|||
else |
|||
compute the answer for inputs |
|||
store that (inputs, answer) pair |
|||
return that answer |
|||
end function |
|||
Some programs may negate the condition in the "if" and swap the operations. |
|||
The overall benefit is that a function frequently called with the same set of inputs can save time by remembering the answer after computing it once -- sacrificing memory for computation time. In systems where memory (or storage depending on the implementation of storing old results) comes at a premium, memoization is not a good option. As long as memory is available and input sets are used repeatedly, memoization can save lots of computation time. |
|||
For tasks that use/can benefit from/(whatever) memoization, see [[:Category:Memoization]] |
|||
<nowiki>[[Encyclopedia]][[Category:Memoization]]</nowiki> |
Revision as of 02:14, 9 May 2024
Swift
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 { } { } { 💩💩💩 }