Я начинаю программист, который очень заинтересован в Common Lisp, но не знает его вообще. Я был бы очень благодарен всем, кто может реализовать следующую проблему в Common Lisp, поэтому я вижу, как Common Lisp обрабатывает основные вещи, такие как обработка строк, ввод-вывод файлов и т. Д.Как реализовать эту проблему в Common Lisp?
В этом случае:
Пример входных данных, чтение из файла "problem.in":
3 5
XHXSS
XSHSX
XXHSS
Вам предоставляется час по ж таблицы символов. Первое число - это количество строк, второе число - количество столбцов.
Для каждого столбца символов, которые вы должны сделать следующее:
Begin просматривал символов сверху вниз.
Если найдено «X», выведите стоимость столбца (стоимость равна нулю по умолчанию), а затем пробел, а затем перейдите к следующему столбцу (пропуская все остальные символы в текущем столбце).
Если «S», найдено, увеличивают стоимость на 1.
Если «Н» найдено, увеличивают стоимость на 3.
Если не было «X» в столбце, выход N» ', за которым следует пробел.
Пример вывода, записывается в "problem.out" файла:
0 4 0 N 1
Вот моя реализация в C++:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(void)
{
ifstream input;
input.open("problem.in");
ofstream output("problem.out");
int h, w;
input >> h >> w;
string * str = new string[h];
for(int i = 0; i < h; i++) input >> str[i];
for(int i = 0; i < w; i++)
{
int cost = 0;
bool found = false;
for(int j = 0; j < h; j++)
{
char ch = str[j][i];
if(ch == 'X') { found = true; break; }
else if(ch == 'S') cost += 1;
else if(ch == 'H') cost += 3;
}
if(found) output << cost;
else output << 'N';
output << ' ';
}
input.close();
output.close();
return 0;
}
Я бы предпочел, чтобы увидеть эту проблему реализуется как один функции в этом отношении:
(defun main()
...
(with-open-file (input "problem.in" :direction :input)
(...))
...
(with-open-file (output "problem.out" :direction :output :if-exists :supersede)
(...))
...
)
Спасибо, что нашли время, чтобы написать это. У меня есть некоторые проблемы с вашим кодом. Вы, кажется, получаете правильные результаты, но я получаю следующие результаты (в Windows 7): в Clozure Common Lisp 1.6 результат 0 3 0 4 N. В Lispworks Personal 6.01 результат: Ошибка. Конец файла при чтении потока #. –
Max
@Max: Я получаю правильный результат, используя Clozure CL на моем Mac. Где вы получаете ошибку LispWorks? В призыве решить? –
Попробуйте эту версию. Одна из отличий между Mac и Windows - это конец строки ... –