Сегодня мы напишем интерпретатор ещё одного эзотерического языка программирования, под названием hq9+.

До этого я уже писал интерпретатор brainfuck, поэтому эзотерические языки уже не так нам страшны.

Итак, что же из себя представляет язык hq9+ ?

Это всего лишь 4 команды:

  • H - выводит "Hello, world!".
  • Q - выводит текст исполняемой программы.
  • 9 - выводит текст песни "99 Bottles of Beer".
  • + - увеличивает никому не нужный счётчик.

Зная это, мы можем написать свой интерпретатор hq9+.

Ввод мы будем осуществлять из файла, вывод на консоль. Для простоты, любые другие символы мы будем просто игнорировать.

f = open(input('Enter file name: '))
s = f.read()
f.close()

И, собственно, сам интерпретатор:

template = '''{} bottles of beer on the wall.
Take one down and pass it around, {} bottles of beer on the wall.'''
count = 0 # Никому не нужный счётчик

for i in s.upper(): # Игнорируем регистр
 if i == 'H':
 print('Hello, world!') # Выводим 'Hello, world!'
 elif i == 'Q':
 print(s) # Выводим саму программу
 elif i == '9':
 for i in range(99, 1, -1):
 print(template.format(i, i-1)) # Выводим текст песни
 print('1 bottle of beer on the wall.\nTake one down and pass it around, no more bottles of beer on the wall.')
 print('No more bottles of beer on the wall.\nGo to the store and buy some more, 99 bottles of beer on the wall.')
 elif i == '+':
 count += 1

Самое "сложное" здесь - вывод текста песни "99 Bottles of Beer". Можно было запихнуть весь текст, но тогда файл получился бы довольно объёмный. Поэтому вместо этого я использую форматирование строк, и вывожу песню с помощью цикла.

У меня на этом всё, и в конце - онлайн-интерпретатор hq9+.

Просмотров: 608 | Добавил: ghost_mod | Дата: 08.04.2016 | Комментарии (0)

Сегодня я разберу одну из олимпиадных задач, довольно простую.

Суть задачи в том, чтобы из англо-латинского словаря сделать латино-английский.

Примеры тестов

Входные данные

3
apple - malum, pomum, popula
fruit - baca, bacca, popum
punishment - malum, multa
Выходные данные

7
baca - fruit
bacca - fruit
malum - apple, punishment
multa - punishment
pomum - apple
popula - apple
popum - fruit

Входные данные черпаются из input.txt, вывод сбрасывается в output.txt. Довольно стандартное требование, про работу с файлами в python я недавно писал. Входные данные лексикографически отсортированы, и выходные данные тоже требуются отсортированными.

Вначале я покажу своё решение, потом начну объяснять. Итак, моё решение:

f = open('input.txt')
N = f.readline()
d = {}
for line in f:
 words = line.strip().split(' - ')
 en = words[0]
 lat = words[1].split(', ')
 for key in lat:
 if key in d:
 d[key].append(en)
 else:
 d[key] = [en]
f.close()

for key in d:
 d[key].sort()


g = open('output.txt', 'w')
g.write(str(len(d)) + '\n')
for lat in sorted(d):
 g.write(lat + ' - ' + ', '.join(d[lat]) + '\n')

g.close()

А теперь объяснение. Приготовились... :)

Открываем файл, читаем число N (оно нам не понадобится); создаём пустой  ... Читать дальше »

Просмотров: 722 | Добавил: ghost_mod | Дата: 08.04.2016 | Комментарии (0)

Сегодня я решил что-нибудь написать на python. Что-нибудь простенькое, но не очень. Решил остановиться на интерпретаторе brainfuck.

Для тех, кто не знает, о чем это я говорю, поясняю: язык brainfuck для хранения данных использует ячейки (по-хорошему бесконечное число ячеек) и состоит всего из восьми команд, поэтому выучить его будет легко.

Вот эти команды:

Команда Brainfuck Описание команды
> перейти к следующей ячейке
< перейти к предыдущей ячейке
+ увеличить значение в текущей ячейке на 1
- уменьшить значение в текущей ячейке на 1
. напечатать значение из текущей ячейки
, ввести извне значение и сохранить в текущей ячейке
[ если значение текущей ячейки 0, перейти вперёд по тексту программы на ячейку, следующую за соответствующей ] (с учётом вложенности)
] если значение текущей ячейки не 0, перейти назад по тексту программы на символ [ (с учётом вложенности)

Итак, вернемся к интерпретатору. Программный код будем считывать со стандартного ввода (если кто захочет, может переделать на считывание из файла).

Итак, будем считать, что прочитали (с помощью встроенной функции input()), затем обработаем строки, удалив все нежелательные символы.

def parse(code):
 new = ''
 for c in code:
 if c in '><+-.,[]':
 new += c
 return new

Или проще:

def parse(code):
 return ''
		... 
		
			Читать дальше »
		
	
Просмотров: 744 | Добавил: ghost_mod | Дата: 08.04.2016 | Комментарии (0)

Ну, точнее, не блэкджек, а его мини-вариант под названием очко.

Для реализации нам понадобится колода карт, из которой каждый раз мы будем вынимать по карте и прибавлять к результату.

Далее, сами "карты": шестерка, семерка, восьмерка, девятка, десятка, валет (достоинством 2), дама (3), король (4), и туз (11).

koloda = [6,7,8,9,10,2,3,4,11] * 4

Случайным образом перемешаем карты, используя функцию shuffle из модуля random.

import random
random.shuffle(koloda)

И, собственно, начинаем играть:

print('Поиграем в очко?')
count = 0

while True:
 choice = input('Будете брать карту? y/n\n')
 if choice == 'y':
 current = koloda.pop()
 print('Вам попалась карта достоинством %d' %current)
 count += current
 if count > 21:
 print('Извините, но вы проиграли')
 break
 elif count == 21:
 print('Поздравляю, вы набрали 21!')
 break
 else:
 print('У вас %d очков.' %count)
 elif choice == 'n':
 print('У вас %d очков и вы закончили игру.' %count)
 break

print('До новых встреч!')

Изначально у пользователя 0 очков. Мы его спрашиваем, будет ли он брать карту, на что он должен ответить y или n. Если пользователь ответил n, то мы говорим ему, сколько очков он набрал, и завершаем программу. Если он изъявил желание взять карту (ух, какой нехороший пользователь :)), то мы снимаем ему карту из списка (с помощьюметода pop). Мы снимаем последнюю карту, хотя вообще без разницы, какую снимать, ведь они перемешаны.

... Читать дальше »

Просмотров: 773 | Добавил: ghost_mod | Дата: 08.04.2016 | Комментарии (0)

Всем привет обьявляется конкурс самый активный пользователь сайта

Призы 

  1. VDS/VPS
  2. Dedicated server Windows 2008
  3. Остальное в процессе дела решим)
Просмотров: 483 | Добавил: ghost_mod | Дата: 06.04.2016 | Комментарии (0)