File : poetry.bush
pragma ada_95;
procedure poetry is
-- Ken's Business Shell Poetry Generator
-- created for PegaSoft Summer Programming Challenge
nouns : string;
verbs : string;
adverbs : string;
adjectives : string;
prepositions : string;
conjunctions : string;
separator : constant character := ASCII.NUL;
noun_count : natural := 1;
verb_count : natural := 1;
adverb_count : natural := 1;
adjective_count : natural := 1;
preposition_count : natural := 1;
conjunction_count : natural := 1;
poem : string;
begin
put_line( "Creating word lists and counting items..." );
nouns := "apple" & separator &
"albatross" & separator &
"bed" & separator &
"brow" & separator &
"butterfly" & separator &
"castle" & separator &
"chocolate" & separator &
"cottage" & separator &
"dragonfly" & separator &
"dawn" & separator &
"day" & separator &
"evening" & separator &
"eye" & separator &
"ear" & separator &
"fire" & separator &
"frost" & separator &
"ghost" & separator &
"glare" & separator &
"house" & separator &
"horse" & separator &
"island" & separator &
"jewel" & separator &
"jaguar" & separator &
"king" & separator &
"kitten" & separator &
"knight" & separator &
"light" & separator &
"lip" & separator &
"moon" & separator &
"morn" & separator &
"night" & separator &
"nibble" & separator &
"nose" & separator &
"ode" & separator &
"orchard" & separator &
"petunia" & separator &
"pond" & separator &
"princess" & separator &
"quest" & separator &
"quandry" & separator &
"room" & separator &
"rabbit" & separator &
"rose" & separator &
"stream" & separator &
"stick" & separator &
"thicket" & separator &
"tree" & separator &
"turret" & separator &
"umbrella" & separator &
"unicorn" & separator &
"violin" & separator &
"vinyard" & separator &
"waterlily" & separator &
"waterfall" & separator &
"yarn" & separator &
"zebra";
verbs := "arrived" & separator &
"began" & separator &
"broke" & separator &
"called" & separator &
"chastened" & separator &
"danced" & separator &
"dove" & separator &
"drank" & separator &
"dug" & separator &
"elevated" & separator &
"evicted" & separator &
"foiled" & separator &
"frisked" & separator &
"galloped" & separator &
"glared" & separator &
"harnessed" & separator &
"harassed" & separator &
"ignored" & separator &
"jumped" & separator &
"kissed" & separator &
"lapped" & separator &
"left" & separator &
"made" & separator &
"mangled" & separator &
"named" & separator &
"nudged" & separator &
"oogled" & separator &
"ousted" & separator &
"pooled" & separator &
"practiced" & separator &
"quieted" & separator &
"recalled" & separator &
"sang" & separator &
"swam" & separator &
"tapped" & separator &
"urged" & separator &
"visited" & separator &
"weeped" & separator &
"wanted" & separator &
"yielded" & separator &
"yodelled";
adverbs := "very" & separator &
"quite" & separator &
"almost" & separator &
"somewhat" & separator &
"hardly" & separator &
"mostly" & separator &
"completely" & separator &
"seldom" & separator &
"ever" & separator &
"never";
adjectives := "white" & separator &
"black" & separator &
"blue" & separator &
"brown" & separator &
"red" & separator &
"green" & separator &
"orange" & separator &
"yellow" & separator &
"pink" & separator &
"glistening" & separator &
"smouldering" & separator &
"bright" & separator &
"dark" & separator &
"loud" & separator &
"soft" & separator &
"hard" & separator &
"quiet" & separator &
"bouncing" & separator &
"boasting" & separator &
"angry" & separator &
"sad" & separator &
"happy" & separator &
"still" & separator &
"rapid" & separator &
"snarky" & separator &
"snooty" & separator &
"naughty" & separator &
"pleasant" & separator &
"proud" & separator &
"pretty" & separator &
"proper" & separator &
"boring" & separator &
"chatty" & separator &
"slow";
prepositions := "through" & separator &
"in" & separator &
"over" & separator &
"under" & separator &
"behind" & separator &
"before" & separator &
"beyond" & separator &
"beneath" & separator &
"above" & separator &
"beside" & separator &
"since" & separator &
"ere" & separator &
"out" & separator &
"within" & separator &
"despite";
conjunctions := "and" & separator &
"or" & separator &
"but" & separator &
"though" & separator &
"thus";
-- Count Items Lists
-- Variables start as "1" to count the final item (no separator)
for i in 1..strings.length( nouns ) loop
if strings.element( nouns, i ) = separator then
noun_count := noun_count + 1;
end if;
end loop;
for i in 1..strings.length( verbs ) loop
if strings.element( verbs, i ) = separator then
verb_count := verb_count + 1;
end if;
end loop;
for i in 1..strings.length( adjectives ) loop
if strings.element( adjectives, i ) = separator then
adjective_count := adjective_count + 1;
end if;
end loop;
for i in 1..strings.length( adverbs ) loop
if strings.element( adverbs, i ) = separator then
adverb_count := adverb_count + 1;
end if;
end loop;
for i in 1..strings.length( prepositions ) loop
if strings.element( prepositions, i ) = separator then
preposition_count := preposition_count + 1;
end if;
end loop;
for i in 1..strings.length( conjunctions ) loop
if strings.element( conjunctions, i ) = separator then
conjunction_count := conjunction_count + 1;
end if;
end loop;
--- Main Title
new_line;
put_line( "Poetry Generator" );
new_line;
put_line( "This script takes an outline of a story or a poem" );
put_line( "and inserts random words for numbers." );
new_line;
put_line( "Type in a story or poem. End with a blank line." );
put_line( "Mark words to substitute with a number:" );
put_line( " 1 = noun (" & strings.image( noun_count ) & ")" );
put_line( " 2 = verb (" & strings.image( verb_count ) & ")" );
put_line( " 3 = adverb (" & strings.image( adverb_count ) & ")" );
put_line( " 4 = adjective (" & strings.image( adjective_count ) & ")" );
put_line( " 5 = preposition (" & strings.image( preposition_count ) & ")" );
put_line( " 6 = conjunction (" & strings.image( conjunction_count ) & ")" );
new_line;
-- read the poem
declare
line : string;
begin
loop
line := get_line;
exit when strings.length( line ) = 0;
poem := poem & line & ASCII.LF;
end loop;
end;
if strings.length( poem ) = 0 then
put_line( "Not today? Bye" );
return;
end if;
-- Generate New Poems
declare
new_poem : string;
ch : character;
reply : string;
begin
loop
new_poem := "";
for poem_pos in 1..strings.length( poem ) loop
ch := strings.element( poem, poem_pos );
case ch is
when '1' =>
new_poem := new_poem & strings.field( nouns,
numerics.truncation( float( noun_count ) * numerics.random ) + 1,
separator );
when '2' =>
new_poem := new_poem & strings.field( verbs,
numerics.truncation( float( verb_count ) * numerics.random ) + 1,
separator );
when '3' =>
new_poem := new_poem & strings.field( adverbs,
numerics.truncation( float( adverb_count ) * numerics.random ) + 1,
separator );
when '4' =>
new_poem := new_poem & strings.field( adjectives,
numerics.truncation( float( adjective_count ) * numerics.random ) + 1,
separator );
when '5' =>
new_poem := new_poem & strings.field( prepositions,
numerics.truncation( float( preposition_count ) * numerics.random ) + 1,
separator );
when '6' =>
new_poem := new_poem & strings.field( conjunctions,
numerics.truncation( float( conjunction_count ) * numerics.random ) + 1,
separator );
when others =>
new_poem := new_poem & ch;
end case;
end loop;
new_line;
put_line( new_poem );
put_line( "Another poem? (y/n)" );
reply := get_line;
exit when reply = "n" or reply = "N";
end loop;
end;
put_line( "Bye" );
end poetry;