Created
April 10, 2011 20:00
-
-
Save anonymous/912674 to your computer and use it in GitHub Desktop.
Yiff-oriented programming
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| gem 'facets' | |
| require 'facets' | |
| require 'set' | |
| require 'ostruct' | |
| require 'stringio' | |
| require 'strscan' | |
| class String | |
| # Char code. | |
| def code | |
| self[0] | |
| end | |
| end | |
| class IOScanner | |
| def initialize(io, buffer_size) | |
| @io = io | |
| @buffer = "" | |
| @pos = 0 | |
| @max_buffer_size = buffer_size | |
| @next_word = nil | |
| end | |
| def is_next_word?(word) | |
| # Fill buffer. | |
| if @buffer.size < @max_buffer_size then | |
| @buffer << (@io.read(@max_buffer_size - @buffer.size) || "") | |
| end | |
| # | |
| result = | |
| if @buffer.starts_with? word then word | |
| else nil; end | |
| @next_word ||= result; | |
| return result | |
| end | |
| def consume_next_word!() | |
| (@buffer.lchomp!(@next_word); @next_word = nil) if @next_word | |
| end | |
| def eof? | |
| @io.eof? | |
| end | |
| end | |
| STDIN_SCANNER = IOScanner.new(STDIN, 1024) | |
| class Furry | |
| def initialize(names) | |
| @names = names | |
| @states = Set.new | |
| @one_time_states = [] | |
| @come = false | |
| end | |
| def names | |
| @names | |
| end | |
| def names=(value) | |
| @names = value | |
| end | |
| def has_name?(name) | |
| @names.include? name | |
| end | |
| def name | |
| @names[0] | |
| end | |
| def in?(state) | |
| @states.include? state | |
| end | |
| def not_in?(state) | |
| not in?(state) | |
| end | |
| def in!(*states) | |
| for state in states | |
| @states << state | |
| end | |
| end | |
| def not_in!(*states) | |
| for state in states | |
| @states.delete state | |
| @one_time_states.delete state | |
| end | |
| end | |
| def one_time_in!(*states) | |
| for state in states | |
| self.in! state | |
| @one_time_states << state | |
| end | |
| end | |
| def delete_one_time_states! | |
| @states.subtract(@one_time_states) | |
| @one_time_states.clear | |
| end | |
| def come! | |
| @come = true | |
| end | |
| def come? | |
| @come | |
| end | |
| def to_s | |
| name.to_s | |
| end | |
| def states | |
| @states | |
| end | |
| end | |
| def log(msg) | |
| STDERR.puts msg | |
| end | |
| class Array | |
| def split(separators, max_returned_arrays_count = nil) | |
| raise %Q{Array expected: #{separators.inspect}} unless separators.is_a? Array | |
| # | |
| result = [] | |
| for item in self | |
| if result.empty? then result << []; end | |
| if item.in?(separators) and | |
| not (max_returned_arrays_count and result.size >= max_returned_arrays_count) | |
| then result << [] | |
| else result.last << item; end | |
| end | |
| return result | |
| end | |
| alias old_shift shift | |
| def shift(expected_first_items_or_n = nil) | |
| expected_first_items = n = expected_first_items_or_n | |
| # Old method. | |
| return old_shift(n) if expected_first_items_or_n.is_a?(Numeric) | |
| return old_shift if expected_first_items_or_n == nil | |
| # | |
| if self[0...expected_first_items.size] == expected_first_items then | |
| return shift(expected_first_items.size) | |
| end | |
| end | |
| end | |
| def help! | |
| puts <<-'HELP' | |
| Usage: run.rb source_code_file [2>/dev/null] | |
| Лексика языка source_code_file: | |
| Слово ::= | |
| Строка | |
| '.' | ';' | ':' | ',' | '-' | '"' | |
| (пробельный символ)+ { пропускается } | |
| (любой символ кроме вышеуказанных и '"')+ | |
| Строка ::= '"' (Escape | (любой символ кроме '"' и '\') )* '"' | |
| Escape ::= | |
| '\n' -- переводится в перенос строки. | |
| '\\' -- переводится в '\'. | |
| '\' HexCode -- переводится в символ, соответствующий HexCode. | |
| HexCode ::= ('0'..'9' | 'a'..'f' | 'A'..'F'){2} | |
| Грамматика языка source_code_file: | |
| Предложения ::= Предложение* | |
| Предложение ::= Предложение0 '.' | |
| -- ВНИМАНИЕ! Предложение всегда оканчивается точкой, даже если по-русски | |
| -- это неправильно! Например: | |
| -- | |
| -- Сначала: Джон говорит: "Я здесь.". | |
| -- | |
| Предложение0 ::= | |
| 'Действующие морды:' Фурри? | |
| 'Сначала:' Действия? | |
| 'Когда' Условия? ':' Действия? -- Действия выполняются только тогда, когда | |
| -- все условия верны. Отсутствие условий | |
| -- воспринимается как "ложь". | |
| Фурри ::= Фурь ( (',' | ';') Фурь )* | |
| Фурь ::= Имена | |
| Имена ::= ИмяФуря ( ('AKA' | '-') ИмяФуря )* | |
| ИмяФуря ::= любая строка | |
| Условия ::= Условие ( ( ',' | ';' | 'и' ) Условие )* | |
| Условие ::= | |
| ИмяФуря? 'получает команду:' Строка | |
| -- "Если в стандартном потоке ввода содержится указанная строка..." | |
| ИмяФуря? 'уже'? Признак | |
| -- "Если фурь с указанным именем имеет указанный признак..." | |
| ИмяФуря? ('не' | 'еще не' | 'больше не') Признак | |
| -- "Если фурь с указанным именем лишен указанного признака..." | |
| Действия ::= Действие ( ( ',' | ';' | 'и' ) Действие )* | |
| Действие ::= | |
| ИмяФуря? 'говорит:' Строка | |
| -- Фурь выводит в стандартный поток вывода указанную фразу. | |
| ИмяФуря? Признак | |
| -- Фурь с указанным именем однократно приобретает указанный признак. | |
| ИмяФуря? 'теперь' Признак | |
| -- Фурь с указанным именем теперь перманентно имеет указанный признак. | |
| ИмяФуря? ('не' | 'больше не') Признак | |
| -- Фурь с указанным именем лишается указанного признака. | |
| Признак ::= любая строка | |
| При запуске программы всегда выполняются действия в самом первом предложении | |
| (не являющимся объявлением фурей) независимо от истинности или ложности условий | |
| (если они есть). | |
| ВНИМАНИЕ! Настоятельно рекомендуется работать только с текстом в кодировке UTF-8 | |
| и запускать только с ключом -Ku! | |
| HELP | |
| exit | |
| end | |
| # Read arguments. | |
| if ARGV[0] == '-h' or ARGV[0] == '--help' then help!; end | |
| source_code_file = ARGV.shift or abort("ОШИБКА: Не задан файл с исходным кодом") | |
| abort %Q{ОШИБКА: Лишние аргументы: #{ARGV.join(' ')}} unless ARGV.empty? | |
| # Read source code. | |
| source_code = File.read(source_code_file) | |
| # Parse source code. | |
| furries = []; hooks = []; begin | |
| # Lexify. | |
| lexemes = []; begin | |
| scanner = StringScanner.new(source_code) | |
| until scanner.eos? | |
| lexeme = | |
| scanner.scan(/\s+/mu) || | |
| scanner.scan(/[^\s\"\.\;\:\,\-]+/mu) || | |
| # string literal | |
| if scanner.scan(/"/mu) | |
| result = "" | |
| until scanner.eos? | |
| if scanner.scan(/\\"/mu) then result << '"' | |
| elsif scanner.scan(/\\n/mu) then result << "\n" | |
| elsif scanner.scan(/\\[0-9a-fA-F]{2}/) then result << scanner.matched[1..2].to_i(16) | |
| elsif scanner.scan(/"/mu) then break | |
| else result << scanner.scan(/./mu); end | |
| end | |
| def result.blank?; false; end | |
| result | |
| end || | |
| scanner.scan(/[\.\;\:\,\-]/mu); | |
| abort %Q{ОШИБКА: Лексическая ошибка: #{scanner.rest[0..50]}...} unless lexeme | |
| next if lexeme.blank? # Skip whitespace. | |
| lexemes << lexeme | |
| end | |
| end | |
| # Parse! | |
| sentences = lexemes.split %W{ . } | |
| sentences.each do |sentence| | |
| # | |
| if sentence.shift %W{ Действующие морды : } then | |
| furry_declarations = sentence.split %W{ , ; } | |
| for furry_declaration in furry_declarations | |
| furries << Furry.new( furry_declaration.split(%W{ AKA - }) ) | |
| end | |
| # | |
| elsif sentence.shift([ "Когда" ]) or sentence.shift([ "Сначала" ]) then | |
| # | |
| conditions_code, actions_code = sentence.split(%W{ : }, 2) | |
| # Parse conditions. | |
| last_furry = nil | |
| conditions = conditions_code. | |
| # Split into separate conditions. | |
| split(%W{ ; , и }). | |
| # Parse the conditions! | |
| map do |condition_code| | |
| # Get the furry the condition refers to. | |
| furry = furries.find do |candidate| | |
| candidate.names.any? { |name| condition_code.shift(name) } | |
| end | |
| if furry == nil then furry = last_furry; end | |
| if furry == nil then abort %Q{ОШИБКА: "#{conditions_code.join(' ')}": "#{condition_code.join(' ')}": кто?}; end | |
| last_furry = furry | |
| # Parse the condition. | |
| if condition_code.shift %W{ получает команду } then | |
| command = condition_code.shift or abort %Q{ОШИБКА: "#{condition_code.join(' ')}": какую команду?} | |
| proc { | |
| STDIN_SCANNER.is_next_word? command | |
| } | |
| elsif condition_code.shift %W{ уже } then | |
| state = condition_code.join(' ') | |
| proc { | |
| furry.in? state | |
| } | |
| elsif [%W{ больше не }, %W{ не }, %W{ еще не }].any? { |x| condition_code.shift(x) } then | |
| state = condition_code.join(' ') | |
| proc { | |
| furry.not_in? state | |
| } | |
| else | |
| state = condition_code.join(' ') | |
| proc { | |
| furry.in? state | |
| } | |
| end | |
| end | |
| # Parse actions. | |
| last_furry = nil | |
| actions = actions_code. | |
| # Split into separate actions. | |
| split(%W{ , ; и }). | |
| # Parse the actions! | |
| map do |action_code| | |
| # Get the furry the action refers to. | |
| furry = furries.find do |candidate| | |
| candidate.names.any? { |name| action_code.shift(name) } | |
| end | |
| if furry == nil then furry = last_furry; end | |
| if furry == nil then abort %Q{ОШИБКА: "#{actions_code.join(' ')}": "#{action_code.join(' ')}": кто?}; end | |
| last_furry = furry | |
| # Parse action. | |
| if action_code.shift(%W{ говорит : }) or action_code.shift(%W{ кричит : }) then | |
| speech = action_code.shift or abort %Q{ОШИБКА: "#{action_code.join(' ')}": что кричит/говорит?} | |
| proc { | |
| STDOUT.print speech | |
| log %Q{#{furry}: "#{speech}".} | |
| } | |
| elsif action_code.shift(%W{ теперь }) then | |
| new_state = action_code.join(' ') | |
| proc { | |
| furry.in! new_state | |
| log %Q{#{furry} теперь #{new_state}.} | |
| } | |
| elsif action_code.shift(%W{ больше не }) or action_code.shift(%W{ не }) then | |
| removed_state = action_code.join(' ') | |
| proc { | |
| furry.not_in! removed_state | |
| log %Q{#{furry} больше не #{removed_state}.} | |
| } | |
| elsif | |
| begin | |
| orgasming = [ | |
| %W{ кончает }, | |
| %W{ оргазмирует }, | |
| %W{ испытывает оргазм } | |
| ] | |
| got_orgasm = [ | |
| %W{ кончил }, %W{ кончила }, | |
| %W{ испытал оргазм }, %W{ испытала оргазм }, | |
| %W{ оргазмировал }, %W{ оргазмировала } | |
| ] | |
| (orgasming + got_orgasm).any? { |x| action_code.shift(x) } | |
| end | |
| then | |
| one_time_states = orgasming.every.join(' ') | |
| permanent_states = got_orgasm.every.join(' ') | |
| proc { | |
| furry.one_time_in!(*one_time_states) | |
| furry.in!(*permanent_states) | |
| furry.come! | |
| log %Q{#{furry} кончает!} | |
| } | |
| else | |
| new_state = action_code.join(' ') | |
| proc { | |
| furry.one_time_in! new_state | |
| log %Q{#{furry} #{new_state}.} | |
| } | |
| end | |
| end | |
| # Form hook. | |
| hooks << OpenStruct.new( | |
| :condition => | |
| if conditions.empty? | |
| proc { false } | |
| else | |
| proc { conditions.all? { |c| c.call() } } | |
| end, | |
| :action => proc { actions.each { |a| a.call() } } | |
| ) | |
| end | |
| end | |
| # Names of furries are arrays of lexemes after the parsing. Normalize them. | |
| for furry in furries | |
| furry.names = furry.names.every.join(' ') | |
| end | |
| end | |
| if hooks.empty? then abort %Q{ОШИБКА: Не задано ни одного действия}; end | |
| # Execute! | |
| begin | |
| # Perform initial action. | |
| hooks[0].action.call() | |
| # Until cum... | |
| loop do | |
| log "---" | |
| actions = hooks.select { |hook| hook.condition[] }.accumulate.action | |
| STDIN_SCANNER.consume_next_word! | |
| if actions.empty? then abort "ОШИБКА: Фуррики не знают, что делать дальше"; end | |
| furries.each { |furry| furry.delete_one_time_states! } | |
| actions.every.call() | |
| if furries.all? { |furry| furry.come? } then | |
| log "" | |
| log "Йифф удался на славу!" | |
| exit | |
| end | |
| end | |
| end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Действующие морды: Джон, Лиза. | |
| Когда Лиза раздевается: | |
| Джон возбуждается. | |
| Когда Джон возбуждается: | |
| Джон говорит: "Ты красавица!" и теперь йиффает Лизу. | |
| Когда Джон йиффает Лизу и Лиза не возбуждена и еще не испытала оргазм: | |
| Лиза кричит: "Ооо дааа!" и теперь возбуждена. | |
| Когда Лиза возбуждена и Джон йиффает Лизу: | |
| Лиза испытывает оргазм; | |
| Лиза больше не возбуждена. | |
| Когда Джон йиффает Лизу и Лиза испытала оргазм: | |
| Джон испытывает оргазм. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Действующие морды: Джон - молодой лев, Лиза - изящная львица. | |
| Сначала: Джон входит в комнату. | |
| Когда Джон получает команду " ": | |
| . | |
| Когда Лиза получает команду "Ложись!" и еще не лежит: | |
| Лиза ложится и теперь лежит. | |
| Когда Лиза получает команду "Ложись!" и уже лежит: | |
| Лиза говорит: "Я уже лежу.". | |
| Когда Джон получает команду "Йиффай ее!" и Лиза еще не лежит: | |
| Джон говорит: "Не могу!". | |
| Когда Джон получает команду "Йиффай ее!" и Лиза уже лежит: | |
| Джон теперь йиффает Лизу. | |
| Когда Джон йиффает Лизу и получает команду "Доведи ее до оргазма!" и Лиза еще не готова кончить: Джон говорит: "Уф... Уф... Не получается!..". | |
| Когда Джон йиффает Лизу и получает команду "Кончай!" и еще не готов кончить: Джон говорит: "Уф... Уф... Не могу!..". | |
| Когда Джон йиффает Лизу и получает команду "Сильнее!": Джон теперь готов кончить; Лиза кричит: "Ах! Ах! АХ! ДА!" и теперь готова кончить. | |
| Когда Джон йиффает Лизу и получает команду "Доведи ее до оргазма!" и Лиза готова кончить: Лиза кричит: "Аааааа-ДААААА!" и кончает. | |
| Когда Джон йиффает Лизу и получает команду "Кончай!" и готов кончить: Джон кричит: "Ооооооооо!", кончает, больше не готов кончить и не йиффает Лизу. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Действующие морды: Десяточник - Десяточник, Единичка - студентка. | |
| Сначала: | |
| Десяточник теперь имеет цифру 9, Единичка теперь имеет цифру 9; | |
| Единичка теперь говорит первую строку (десятки). | |
| Когда Единичка просит Десяточника сказать десятки и Десяточник имеет цифру 9: Десяточник говорит: "9". | |
| Когда Единичка просит Десяточника сказать десятки и Десяточник имеет цифру 8: Десяточник говорит: "8". | |
| Когда Единичка просит Десяточника сказать десятки и Десяточник имеет цифру 7: Десяточник говорит: "7". | |
| Когда Единичка просит Десяточника сказать десятки и Десяточник имеет цифру 6: Десяточник говорит: "6". | |
| Когда Единичка просит Десяточника сказать десятки и Десяточник имеет цифру 5: Десяточник говорит: "5". | |
| Когда Единичка просит Десяточника сказать десятки и Десяточник имеет цифру 4: Десяточник говорит: "4". | |
| Когда Единичка просит Десяточника сказать десятки и Десяточник имеет цифру 3: Десяточник говорит: "3". | |
| Когда Единичка просит Десяточника сказать десятки и Десяточник имеет цифру 2: Десяточник говорит: "2". | |
| Когда Единичка просит Десяточника сказать десятки и Десяточник имеет цифру 1: Десяточник говорит: "1". | |
| Когда Единичка просит Десяточника сказать десятки и Десяточник кончил:. | |
| Когда Единичка говорит первую строку (десятки) и имеет цифру 9: Единичка просит Десяточника сказать десятки, больше не говорит первую строку (десятки) и теперь говорит первую строку (полностью). | |
| Когда Единичка говорит первую строку (полностью) и имеет цифру 9: Единичка говорит: "9 бутылок пива на стене!\nВозьми одну, выпей всю,\nБудет ", больше не говорит первую строку (полностью) и теперь говорит вторую строку (десятки). | |
| Когда Единичка говорит вторую строку (десятки) и имеет цифру 9: Единичка просит Десяточника сказать десятки, больше не говорит вторую строку (десятки) и теперь говорит вторую строку (полностью); Единичка больше не имеет цифру 9, теперь имеет цифру 8. | |
| Когда Единичка говорит вторую строку (полностью) и имеет цифру 9: Единичка говорит: "9 бутылок пива на стене!\n", больше не говорит вторую строку (полностью) и теперь говорит первую строку (десятки). | |
| Когда Единичка говорит первую строку (десятки) и имеет цифру 8: Единичка просит Десяточника сказать десятки, больше не говорит первую строку (десятки) и теперь говорит первую строку (полностью). | |
| Когда Единичка говорит первую строку (полностью) и имеет цифру 8: Единичка говорит: "8 бутылок пива на стене!\nВозьми одну, выпей всю,\nБудет ", больше не говорит первую строку (полностью) и теперь говорит вторую строку (десятки). | |
| Когда Единичка говорит вторую строку (десятки) и имеет цифру 8: Единичка просит Десяточника сказать десятки, больше не говорит вторую строку (десятки) и теперь говорит вторую строку (полностью); Единичка больше не имеет цифру 8, теперь имеет цифру 7. | |
| Когда Единичка говорит вторую строку (полностью) и имеет цифру 8: Единичка говорит: "8 бутылок пива на стене!\n", больше не говорит вторую строку (полностью) и теперь говорит первую строку (десятки). | |
| Когда Единичка говорит первую строку (десятки) и имеет цифру 7: Единичка просит Десяточника сказать десятки, больше не говорит первую строку (десятки) и теперь говорит первую строку (полностью). | |
| Когда Единичка говорит первую строку (полностью) и имеет цифру 7: Единичка говорит: "7 бутылок пива на стене!\nВозьми одну, выпей всю,\nБудет ", больше не говорит первую строку (полностью) и теперь говорит вторую строку (десятки). | |
| Когда Единичка говорит вторую строку (десятки) и имеет цифру 7: Единичка просит Десяточника сказать десятки, больше не говорит вторую строку (десятки) и теперь говорит вторую строку (полностью); Единичка больше не имеет цифру 7, теперь имеет цифру 6. | |
| Когда Единичка говорит вторую строку (полностью) и имеет цифру 7: Единичка говорит: "7 бутылок пива на стене!\n", больше не говорит вторую строку (полностью) и теперь говорит первую строку (десятки). | |
| Когда Единичка говорит первую строку (десятки) и имеет цифру 6: Единичка просит Десяточника сказать десятки, больше не говорит первую строку (десятки) и теперь говорит первую строку (полностью). | |
| Когда Единичка говорит первую строку (полностью) и имеет цифру 6: Единичка говорит: "6 бутылок пива на стене!\nВозьми одну, выпей всю,\nБудет ", больше не говорит первую строку (полностью) и теперь говорит вторую строку (десятки). | |
| Когда Единичка говорит вторую строку (десятки) и имеет цифру 6: Единичка просит Десяточника сказать десятки, больше не говорит вторую строку (десятки) и теперь говорит вторую строку (полностью); Единичка больше не имеет цифру 6, теперь имеет цифру 5. | |
| Когда Единичка говорит вторую строку (полностью) и имеет цифру 6: Единичка говорит: "6 бутылок пива на стене!\n", больше не говорит вторую строку (полностью) и теперь говорит первую строку (десятки). | |
| Когда Единичка говорит первую строку (десятки) и имеет цифру 5: Единичка просит Десяточника сказать десятки, больше не говорит первую строку (десятки) и теперь говорит первую строку (полностью). | |
| Когда Единичка говорит первую строку (полностью) и имеет цифру 5: Единичка говорит: "5 бутылок пива на стене!\nВозьми одну, выпей всю,\nБудет ", больше не говорит первую строку (полностью) и теперь говорит вторую строку (десятки). | |
| Когда Единичка говорит вторую строку (десятки) и имеет цифру 5: Единичка просит Десяточника сказать десятки, больше не говорит вторую строку (десятки) и теперь говорит вторую строку (полностью); Единичка больше не имеет цифру 5, теперь имеет цифру 4. | |
| Когда Единичка говорит вторую строку (полностью) и имеет цифру 5: Единичка говорит: "5 бутылок пива на стене!\n", больше не говорит вторую строку (полностью) и теперь говорит первую строку (десятки). | |
| Когда Единичка говорит первую строку (десятки) и имеет цифру 4: Единичка просит Десяточника сказать десятки, больше не говорит первую строку (десятки) и теперь говорит первую строку (полностью). | |
| Когда Единичка говорит первую строку (полностью) и имеет цифру 4: Единичка говорит: "4 бутылок пива на стене!\nВозьми одну, выпей всю,\nБудет ", больше не говорит первую строку (полностью) и теперь говорит вторую строку (десятки). | |
| Когда Единичка говорит вторую строку (десятки) и имеет цифру 4: Единичка просит Десяточника сказать десятки, больше не говорит вторую строку (десятки) и теперь говорит вторую строку (полностью); Единичка больше не имеет цифру 4, теперь имеет цифру 3. | |
| Когда Единичка говорит вторую строку (полностью) и имеет цифру 4: Единичка говорит: "4 бутылок пива на стене!\n", больше не говорит вторую строку (полностью) и теперь говорит первую строку (десятки). | |
| Когда Единичка говорит первую строку (десятки) и имеет цифру 3: Единичка просит Десяточника сказать десятки, больше не говорит первую строку (десятки) и теперь говорит первую строку (полностью). | |
| Когда Единичка говорит первую строку (полностью) и имеет цифру 3: Единичка говорит: "3 бутылок пива на стене!\nВозьми одну, выпей всю,\nБудет ", больше не говорит первую строку (полностью) и теперь говорит вторую строку (десятки). | |
| Когда Единичка говорит вторую строку (десятки) и имеет цифру 3: Единичка просит Десяточника сказать десятки, больше не говорит вторую строку (десятки) и теперь говорит вторую строку (полностью); Единичка больше не имеет цифру 3, теперь имеет цифру 2. | |
| Когда Единичка говорит вторую строку (полностью) и имеет цифру 3: Единичка говорит: "3 бутылок пива на стене!\n", больше не говорит вторую строку (полностью) и теперь говорит первую строку (десятки). | |
| Когда Единичка говорит первую строку (десятки) и имеет цифру 2: Единичка просит Десяточника сказать десятки, больше не говорит первую строку (десятки) и теперь говорит первую строку (полностью). | |
| Когда Единичка говорит первую строку (полностью) и имеет цифру 2: Единичка говорит: "2 бутылок пива на стене!\nВозьми одну, выпей всю,\nБудет ", больше не говорит первую строку (полностью) и теперь говорит вторую строку (десятки). | |
| Когда Единичка говорит вторую строку (десятки) и имеет цифру 2: Единичка просит Десяточника сказать десятки, больше не говорит вторую строку (десятки) и теперь говорит вторую строку (полностью); Единичка больше не имеет цифру 2, теперь имеет цифру 1. | |
| Когда Единичка говорит вторую строку (полностью) и имеет цифру 2: Единичка говорит: "2 бутылок пива на стене!\n", больше не говорит вторую строку (полностью) и теперь говорит первую строку (десятки). | |
| Когда Единичка говорит первую строку (десятки) и имеет цифру 1: Единичка просит Десяточника сказать десятки, больше не говорит первую строку (десятки) и теперь говорит первую строку (полностью). | |
| Когда Единичка говорит первую строку (полностью) и имеет цифру 1: Единичка говорит: "1 бутылок пива на стене!\nВозьми одну, выпей всю,\nБудет ", больше не говорит первую строку (полностью) и теперь говорит вторую строку (десятки). | |
| Когда Единичка говорит вторую строку (десятки) и имеет цифру 1: Единичка просит Десяточника сказать десятки, больше не говорит вторую строку (десятки) и теперь говорит вторую строку (полностью); Единичка больше не имеет цифру 1 и теперь имеет цифру 0. | |
| Когда Единичка говорит вторую строку (полностью) и имеет цифру 1: Единичка говорит: "1 бутылок пива на стене!\n", больше не говорит вторую строку (полностью) и теперь говорит первую строку (десятки). | |
| Когда Единичка говорит первую строку (десятки) и имеет цифру 0: Единичка просит Десяточника сказать десятки, больше не говорит первую строку (десятки) и теперь говорит первую строку (полностью). | |
| Когда Единичка говорит первую строку (полностью), имеет цифру 0 и Десяточник кончил: Единичка говорит: "Больше нет бутылок пива на стене!\n" и кончает. | |
| Когда Единичка говорит первую строку (полностью), имеет цифру 0 и Десяточник не кончил: Единичка говорит: "0 бутылок пива на стене!\nВозьми одну, выпей всю,\nБудет " и больше не говорит первую строку (полностью); Единичка больше не имеет цифру 0; Единичка - в стадии SWAP1. | |
| Когда Единичка - в стадии SWAP1: Единичка просит Десяточника поменять десятки; Единичка - в стадии SWAP2. | |
| Когда Единичка - в стадии SWAP2: Единичка просит Десяточника сказать десятки; Единичка - в стадии SWAP3. | |
| Когда Единичка - в стадии SWAP3: Единичка говорит: "9 бутылок пива на стене!\n"; Единичка - в стадии SWAP4. | |
| Когда Единичка - в стадии SWAP4: Единичка теперь имеет цифру 9; Единичка теперь говорит первую строку (десятки). | |
| Когда Единичка говорит вторую строку (полностью) и имеет цифру 0: Единичка говорит: "0 бутылок пива на стене!\n", больше не говорит вторую строку (полностью) и теперь говорит первую строку (десятки). | |
| Когда Единичка просит Десяточника поменять десятки и Десяточник имеет цифру 9: Десяточник больше не имеет цифру 9 и теперь имеет цифру 8. | |
| Когда Единичка просит Десяточника поменять десятки и Десяточник имеет цифру 8: Десяточник больше не имеет цифру 8 и теперь имеет цифру 7. | |
| Когда Единичка просит Десяточника поменять десятки и Десяточник имеет цифру 7: Десяточник больше не имеет цифру 7 и теперь имеет цифру 6. | |
| Когда Единичка просит Десяточника поменять десятки и Десяточник имеет цифру 6: Десяточник больше не имеет цифру 6 и теперь имеет цифру 5. | |
| Когда Единичка просит Десяточника поменять десятки и Десяточник имеет цифру 5: Десяточник больше не имеет цифру 5 и теперь имеет цифру 4. | |
| Когда Единичка просит Десяточника поменять десятки и Десяточник имеет цифру 4: Десяточник больше не имеет цифру 4 и теперь имеет цифру 3. | |
| Когда Единичка просит Десяточника поменять десятки и Десяточник имеет цифру 3: Десяточник больше не имеет цифру 3 и теперь имеет цифру 2. | |
| Когда Единичка просит Десяточника поменять десятки и Десяточник имеет цифру 2: Десяточник больше не имеет цифру 2 и теперь имеет цифру 1. | |
| Когда Единичка просит Десяточника поменять десятки и Десяточник имеет цифру 1: Десяточник больше не имеет цифру 1 и кончает. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment