Доброго времени суток! Есть простая задача, по заданному числу N (1 <= N <= 26) вывести N строк в таком формате:
N = 3
a..a
a.ab
aabc
N = 5
a....a
a...ab
a..abc
a.abcd
aabcde
В задаче, вместо точек должны стоять пробелы) Просто так нагляднее)
Задача элементарная, но задание состоит в том, чтобы решить ее, использовав как можно меньше символов. На данный момент лучшее решение на С++ — 99 символов, на С — 81 символ. Если у кого-то есть идеи или реализации, буду рад услышать.
А откуда задача?
Задача с е-олимпа) http://www.e-olimp.com.ua/problems/1124
А эти лучшие решения — они твои? Или хотя бы одного и того же пользователя?
Нет, лучшие решения не мои, я их даже не видел, если честно) Да, одного и того же) Просто на С некоторые моменты можно сократить, поэтому получается меньше)
Ну просто я тут подумал — в Си можно выкинуть
#include <cstdio>
, но взамен необходимо прописатьreturn 0;
Получаем выигрыш в 8 символов. А тут отрыв аж в 18. Где ещё 10 символов сократить? Оо
Хм... в Си можно не писать ни return, ни cstdio Если ты говорил именно о Си)
Ну, по крайней мере в GNU C на Codeforces если явно не прописать ретурн, оно может вернуть не 0 и это посчитается за ошибку исполнения.
Вот решение Antonov на Си. 87 вроде бы символов. На КФ нормально работает)
e[27],c=97,i;main(n){for(scanf("%d",&n),i=n;n--;printf("a%*s\n",i,e))strcat(e,&c),c++;}
Ух ты. Выходит, там ещё и можно не указывать int при объявлении переменных Оо
P.S. Если убрать printf, начинает выдавать RTE. Этому есть какое-то рациональное объяснение? Оо
Я не знаю, если честно)
Неправда, RE нет, просто программа не работает
RTE появится, если очистить, допустим, все тело main().
------------------------------------------------------------------------------------------------------- Действительно. А только что RE был Оо Магия.
А вот такое RE:
Возможно, тут любой код может вызывать RE, как повезет. Поскольку return 0 явно не прописан, то адрес возврата берется с верхушки стека, а там прописан какой-то мусор — иногда 0, а иногда нет.
Если вместо e[27] сделать e[9], то тоже работает http://ideone.com/xICsk9
1 символ выиграл :D
А зачем Вам подсказывать, если можно самим поучаствовать в соревновании и написать более короткий код?
Ну, наверное, потому что это не соревнование, а просто с товарищами решили попробовать=) А так, как на это все же было потрачено время, стало интересно, какие еще способы могут быть)
80 символов (вероятно, можно укоротить)
Довольно красиво) Пока что это рекорд=)
Сократил на 3
s[i++]=96+i это не undefined behavior?
В запуске немного некорректно работает, но можно заменить: s[i]=++i+96;
Так это же вроде тоже UD. Разве гарантируется, в каком порядке вычисляются аргументы
operator=
?действительно можно укоротить, 77 символов
(переделано с Svyat)
UPD: совпадает с решением tyamgin
Уберём ещё один символ: http://ideone.com/GBgSlJ
В коллекцию: в первой правке код на python 2 в 94 символа.
n=int(input())
=>n=input()
format можно заменить на %
code
А переносы строк за символы не считаются?
Лучше уж так http://ideone.com/WX9Kt7 64 символа
UPD: стало 64 символа
-4=60: http://ideone.com/j65LN3
я не считал переносы, так что 64-1=63 или 65 с переносами
тут не только переносы, но и отступы. Отступы — это принципиально важная часть. Более того, в некоторых случаях обязателен разделитель (н-р C-шное int i;) — если использовать \n вместо пробела — то это экономия символа, ведь "они не считаются".
При чем здесь отступы? Я их считал, если че. Но про переносы — согласен, надо считать.
Тогда я не понял смысл вашего комментария.
64 байта и 60 байт. 64 символа и 60 символов. 64 — 4 = 60. Всё правильно, что не так?
p.s. я убрал именно отступы, поэтому на них акцентировал внимание. А переносы строк заменил на ";".
Ой, кажется, я все-таки считал переносы. Да, все правильно
не знаток perl'a, 50 символов http://ideone.com/mcTl14
UPD: Стало 50 символов
48
46
45
(]('a',(' '#~-),a.{~97+[:i.])"0[:>:i.)
Это на J. 38 символов.
(a.{~](97,(32#~-),97+[:i.])"0[:>:i.)
36
Добавлю Scala. Ровно 100, если писать object A extends App{...
А на Java луче даже и не пробовать:)