Skip to content

Instantly share code, notes, and snippets.

Created April 10, 2011 20:00
Show Gist options
  • Select an option

  • Save anonymous/912674 to your computer and use it in GitHub Desktop.

Select an option

Save anonymous/912674 to your computer and use it in GitHub Desktop.
Yiff-oriented programming
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
Действующие морды: Джон, Лиза.
Когда Лиза раздевается:
Джон возбуждается.
Когда Джон возбуждается:
Джон говорит: "Ты красавица!" и теперь йиффает Лизу.
Когда Джон йиффает Лизу и Лиза не возбуждена и еще не испытала оргазм:
Лиза кричит: "Ооо дааа!" и теперь возбуждена.
Когда Лиза возбуждена и Джон йиффает Лизу:
Лиза испытывает оргазм;
Лиза больше не возбуждена.
Когда Джон йиффает Лизу и Лиза испытала оргазм:
Джон испытывает оргазм.
Действующие морды: Джон - молодой лев, Лиза - изящная львица.
Сначала: Джон входит в комнату.
Когда Джон получает команду " ":
.
Когда Лиза получает команду "Ложись!" и еще не лежит:
Лиза ложится и теперь лежит.
Когда Лиза получает команду "Ложись!" и уже лежит:
Лиза говорит: "Я уже лежу.".
Когда Джон получает команду "Йиффай ее!" и Лиза еще не лежит:
Джон говорит: "Не могу!".
Когда Джон получает команду "Йиффай ее!" и Лиза уже лежит:
Джон теперь йиффает Лизу.
Когда Джон йиффает Лизу и получает команду "Доведи ее до оргазма!" и Лиза еще не готова кончить: Джон говорит: "Уф... Уф... Не получается!..".
Когда Джон йиффает Лизу и получает команду "Кончай!" и еще не готов кончить: Джон говорит: "Уф... Уф... Не могу!..".
Когда Джон йиффает Лизу и получает команду "Сильнее!": Джон теперь готов кончить; Лиза кричит: "Ах! Ах! АХ! ДА!" и теперь готова кончить.
Когда Джон йиффает Лизу и получает команду "Доведи ее до оргазма!" и Лиза готова кончить: Лиза кричит: "Аааааа-ДААААА!" и кончает.
Когда Джон йиффает Лизу и получает команду "Кончай!" и готов кончить: Джон кричит: "Ооооооооо!", кончает, больше не готов кончить и не йиффает Лизу.
Действующие морды: Десяточник - Десяточник, Единичка - студентка.
Сначала:
Десяточник теперь имеет цифру 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