Как стать автором
Обновить

Комментарии 120

А новая строка считается за два символа, за один или смотря какая нотация (Windows — \r\n, Mac — \r)?
По идее, вообще не должны считать, но все равно присоединяюсь к вопросу)
Для простоты — переводы строк считаются за один символ. Подправил задание.
Как мне ответили, считаются все символы, но результат можно обфусцицировать, например.
«Спортивное программирование» приучает писать программы в одну строчку, без комментариев, и с именами переменных типа a, b, c…

Да здравствует наше спортивное программирование, самое Бессмысленное и беспощадное программирование в мире.
Ничему не удивляюсь.
Сколько раз участвовал — всегда находил время назвать переменную не «a», а скажем «rVect». Да и строчек мы не жалели, не вижу ничего страшного в двух-трех пустых строчках для визуального разделения кода на блоки)
В данном случае «спортивное» != «быстрое». Это к вопросу о времени.
Пустые строки == дополнительные символы, которые позволят сопернику обойти твое решение.
Суть конкурса состоит в компактности кода — любыми доступными средствами.
Собссно, ничто не мешает написать адекватно, а потом применять какой-нить обфускатор кода — вот вам и сжатый результать без лишних букв)
Иногда руками можно написать решение меньшее, чем выдаст обфускатор.
также как в биатлоне есть элемент гонки и элемент стрельбы, в этом конкурсе есть элемент программирования и элемент обфускации.

предлагаю в будущем сделать чемпионат по обфускации, и сделать спортивную обфускацию частью олимпийских игр.
И шахматы 5-минутки тоже бессмысленны, и бегать 100 метров зачем, если лучше бегать сорок, например, на рыбалку.
Спорт просто не для вас ,.)
Традиционно термин «спортивное программирование» не используется для задач, в которых размер кода является решающим фактором. Такие задачи называются Code Golf, как указано в заголовке, и относятся к другому классу. Спортивное программирование, конечно, учит некоторым нехорошим вещам, но, поверьте, не этой.
Оно приучает думать. И оптимизировать именно по заданным факторам. Это не значит, что нужно применять факторы, которые к данной задаче совсем не относятся.
Пока выполнял задание, словил море фана. Просто заменить переменные на a, b, c мало. Надо еще алгоритм отшлифовать, отсечь все лишнее и даже извратить код, но оптимизировать по заданному фактору. Первая версия моей программы занимала порядка 900 байт, заменив переменные и убрав отступы, получил 450 — и вот тут началось самое интересное. На заключительном этапе радуешься уже каждому сэкономленному символу, полученному в ходе углубленного чтения манов и экспериментов.
Стандартная функция занимает 8 символов, регулярка 7, и хоть с регуляркой ничерта не понятно — смело заменяем чтобы сэкономить символ. А здесь можно извращенно использовать ту же функцию, что и строчкой выше — кода немного прибавляется, но теперь можно написать алиас для функции и выиграть еще один символ.
Играл в города, когда был маленький.
Для подготовки пользовался почтовым справочником по населённым пунктам Советского Союза…
Там был такой козырный населённый пункт для данной игры: ЫНТАЛЫ
(правда в какой уже республике я уже и не припомню..)…

Поэтому практически всех своих соперников я бил в 2 захода…
1 вариант) Выпадает слово на «А». Называешь АПАТИТЫ… кирдык, победа! 1:0
2 вариант) Получаешь «АПАТИТЫ», отвечаешь «ЫНТАЛЫ»(!)...2:0

После чего, играть становилось неинтересно...:)…
Гугл подсказал, что это в Казахстане.
И он же подкинул ссылку:
botinok.co.il/node/41315
Кто бы знал, что городов на Ы так много немало.
«Ыспарта».
Мне кажется, турки что-то подозревают.
первое слово выбирается в порядке алфавита?
Очевидно нет: в примере [Калининград, Вологда, Алматы, Дмитров, Архангельск, Тобольск, Краков] в качестве правильного ответа дано [Архангельск, Краков, Вологда, Алматы, Тобольск, Калининград, Дмитров], а в случае выбора первого слова по алфавиту, первым словом было бы «Алматы», а не «Архангельск».
Нет, первым может быть любое слово. Более того — важно первое слово выбрать так, чтобы в итоге задействовать все города.
языки выглядят неравнозначными в данном случае
например питон имеет лямбда функции. джава проиграет с анонимными интерфейсам
зато в питоне обязательно нужно переноситься на следующую строку
и т.д.
Это самое тонкое место. Очевидно, что одни языки имеют преимущество над другими. Идеальным решением было бы выбрать один язык или проводить соревнование отдельно для каждого языка. И то и другое не очень практично.
НЛО прилетело и опубликовало эту надпись здесь
На практике на C#+Linq достаточно длинная программа получается, имхо лучше какой-нибудь функциональный нетипизированный скриптовый язык с изотерическим синтаксисом. Какой-нибудь J :-)
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Да, тут забавное недоразумение.
Условие автору стоило бы причесать и дополнить (например, про ввод-вывод и собственные ЯП).
НЛО прилетело и опубликовало эту надпись здесь
> зато в питоне обязательно нужно переноситься на следующую строку
не обязательно.
Инструкции в одной строке можно разделять точкой с запятой. Я очень часто это использую в консоли.

$ cat 1.py
print 123; print 456; print 789

$ python 1.py
123
456
789
Пользы в данном случае никакой: вы потратили сэкономленный символ (перевод строки) на «точку с запятой». А в примере еще и + «пробел».
> переводы строк считаются за один символ

Да и пару циклов таким образом будет реализовать тяжеловато.
Это пример. Тоже самое можно использовать на более глубоком уровне вложенности, когда можно сэкономить по 4-5 табов в каждой строке
Разделитель команд должен быть почти в любом языке, так что тут как раз вполне минимальная запись. Сэкономленные символы здесь — табуляции.
Есть ли ограничения по языкам программирования и по времени исполнения программы?
«4. Если вы используете экзотический язык программирования — подскажите организаторам где можно скачать компилятор.»
Про время в правилах нет ничего.
Ограничений по языкам нет. Время работы программы неограниченно.

Реально примеры будут короткие, до десятка слов, поэтому время здесь некритично.
поясните, «Использовать предпоследнюю букву можно только в том случае, если нет слов, начинающихся с последней буквы.»

ответы

[Дмитров, Вологда, Архангельск, Калининград, Далматово, Владивосток, Краков]

и

[Далматово, Вологда, Архангельск, Калининград, Дмитров, Владивосток, Краков]

не равнозначны?

тоесть сперва нужно 100% использовать совпадения по последней букве?
* Далматово, Вологда

А города Орел не существует типа?

Если уж «6. Выборка будет составлена так, что решение всегда существует. » то будте добры выбирать так чтобы это были честная игра в города.
Причём тут город Орёл и мой вопрос?
«Далматово» заканчивается на «О», а в приведенном Вами примере после этого города идет «Вологда». Т.е. ваша последовательность имеет ошибку.
Можно использовать только города из предложенного массива.
Я выше несколько ступил, это правда. Однако, никто пока не знает, какой будет массив. Если в нем будет Орел, то предпоследнюю букву можно использовать только в том случае, если города на последнюю закончились. Т.е. если «Орел» не «вышел», то «Далматово, Вологда» — неверная последовательность.

И есть вопрос к организаторам:

неправильное решение, переход Вологда-Дмитров недопустим
[Архангельск, Калининград, Далматово, Вологда, Дмитров, Владивосток, Краков]


Почему переход недопустим?
На букву «А» города кончились, предпоследняя буква в слове «Вологда» — Д. Где нарушение правил?
Да, и это уже тоже сказали.

Использовать предпоследнюю букву можно только в том случае, если нет слов, начинающихся с последней буквы.
На «А» города как раз не кончились, потому что первое слово в последовательности должно быть хорошо выбрано, для оптимальной цепочки.
НЛО прилетело и опубликовало эту надпись здесь
И с чего это у нас Архангельск должен быть первым, если мы можем вставить его после Вологды?
Дмитров, Вологда, Архангельск, Краков, Владивосток, Калининград, Далматово
Хм, я должно быть, чего-то не понимаю. Если цепочка начинается со слова «Архангельск» и он в массиве один на букву А, то как это они не кончились?
И с чего это она с него начинается? В посте даже специально оговорено, что первое слово выбирает алгоритм для построения соответствующей условию цепочки, оно не должно быть первым по алфавиту.
НЛО прилетело и опубликовало эту надпись здесь
Цитирование, бессмысленное и беспощадное. К чему вы это написали?

Я же ориентировался на пост по ссылке, на аскдеве. Если вам действительно интересна задача, то стоит туда перейти.

По поводу «Человека» — как же это он будет задавать тон, если у нас есть на входе цепочка городов, на выходе цепочка городов, соответствующая условию, и чёрный ящик внутри?
Вы меня не поняли. Это не страшно, попробуем еще раз:

В приведенном примере цепочка следующая:
Архангельск, Калининград, Далматово, Вологда, Дмитров, Владивосток, Краков
Цепочка в примере является завершенной, т.е. включает в себя весь массив.
Организатор конкурса говорит, что такая цепочка неправильная.
Переход Вологда-Дмитров недопустим.

Вы считаете, что после «Вологда» должен быть город на букву А.
Но в ДАННОЙ цепочке он уже использован, он стоит на первом месте, мы не можем использовать его дважды.

Вы же пишете:
На «А» города как раз не кончились, потому что первое слово в последовательности должно быть хорошо выбрано, для оптимальной цепочки.

Но в данном примере они таки кончились, и после Вологда- должен идти Дмитров. Потому что д — предпоследняя буква.
Не поняли вы. Это не результат, это кандидат в результаты. Т.е. одна из всех возможных цепочек. При этом по какому-то стечению обстоятельств (я же не знаю ваш алгоритм) на первом месте оказался Архангельск. Однако он не может быть результатом, потому что использована предпоследняя буква Вологды, когда может быть использована последняя (вас же не затруднит переставить слова?).
Соответственно, стоит продолжать поиск решения, пока не будет полного удовлетворения условиям.
Давайте по-простому: «Архангельск» можно использовать два раза? Если нет, то в той цепочке, которая начинается с города «Архангельск» второго города на «А» быть не может, раз его в массиве нету.
Да, не может быть.
И именно поэтому этот вариант цепочки не может быть ответом, нужно искать другие перестановки.
НЛО прилетело и опубликовало эту надпись здесь
Эти варианты равнозначны. Скажем если нет городов на букву О, то вместо Далматово везде используем Далматов, а на каком месте он будет — непринципиально.
>На вход подается массив…
Каким образом это происходит? Надо читать список из stdin, из файла, предлагать пользователю ввести список поэлементно или еще как-то?
Можно ли выбрать наиболее удобный способ ввода и описать как именно подавать?
Код чтения или инициализации массива не учитывается, делайте как вам удобно.

Пример:

a=['Калининград', 'Вологда', 'Алматы', 'Дмитров', 'Архангельск', 'Тобольск', 'Краков'];

____

for(i in a)…

Код до черты не учитывается при подсчете.
Т.е. я так понимаю, организаторы сами посмотрят, где у вас основной код и посчитают именно его?
А можно ли, чтобы весь код был обрамлен в map{....} и все, или же нужно присвоить рез-тат какой-то переменной, типа y=map{...}? Или можно написать print map{...}?
Как-то не очень понял условия ( лучше бы классически подавали на вход слова через заданный разделитель, и требовали вывод через него же.
Вопрос по выводу данных:
puts s a,a
Это вывод данных, т.е. не считается, или надо разделить:
r=s a,a
# Вывод
puts r


То же самое и про инициализацию. Можно ли во время чтения перевести все в маленький регистр или перевод уже надо делать в коде?

P.S.: Кто-нибудь сделал <100 байт?
> 4. Если вы используете экзотический язык программирования — подскажите организаторам где можно
> скачать компилятор.

Можно написать компилятор языка, имеющего только один оператор «q», который решает данную задачу

По аналогии с ru.wikipedia.org/wiki/HQ9%2B
Собственно, я это и хотел сделать в самом начале, just for lulz.
Даже начал писать инструкцию :)

Через пятнадцать минут унылого наблюдения за ползунком устанавливающейся MSVS2010 степень жестокости и бессмысленности накрыла и перешла все границы… пришлось сдаться. Я слишком слаб для спортивного программирования, жалкий неудачник.

Идея была в том, чтобы создать грамматику на AntLR (чтобы топикстартер не смог уже отказаться, что это настоящий компилятор, хоть и с очень простой грамматикой), потом в качестве кода, генерируемого интерпретатором сделать короткую программу на чистом Си, и откомпилировав через MSVS получить полноценный компилятор языка, умеющего аж одну команду «q».

Вот начало инструкции, вплоть до составления грамматики.
Истинные фанаты могут продолжить дело дальше, осталось совсем ничего: написать действительную реализацию команды Q на Си и генерацию этого Си-кода в java-методе GorodaStrategy.play()

Прочитать инструкцию в txt-формате можно здесь:
sites.google.com/site/olegchirchir/data/instant-codegolf.txt
На любом существующем языке программирования, разве не так?
public interface City {
public String getName();
public String setName();
public String getVerboseName();

public Integer getSomeStrangeFlag(int OhShi);
}

public interface CitySet {
public City addCity(City: city);
public City removeCity(City: city);
public Integer reset();
public City getNextCity();
}

public interface Game {
public String getGameName();
public String setGameName();
public String getVerboseName();

public GameStrategy getGameStrategy();
public GameStrategy setGameStrategy();
public String explainGameStrategy();

public Integer startGame();
}

public interface GameStrategy {
public CitySet setCitySet(CitySet citySet);
public Integer process();
public CitySet getResult();
public Integer getProcessState();
}

Друзья! Постойте, не сдавайте задание! Я щаз по быстрому реализую, и тогда-то посмотрим, кто первый!
К сожалению perl не знаю, а на любом другом языке участвовать к codegolf по-моему бессмысленно ( из популярных).
Руби и Питон, естественно.
у питона как минимум — необходимы табуляции, на сколько я знаю. А каждая табуляция — доп. символ…
Занимательная такая задачка.
Решил и получилось где-то 366-367 байт, если всё решение сбить в одну строку. Реализация на php.

По примеру нашлось два решения:
[Дмитров, Вологда, Архангельск, Краков, Владивосток, Калининград, Далматово]
[Дмитров, Владивосток, Краков, Вологда, Архангельск, Калининград, Далматово]

Вот только мне кажется, что победитель будет решением на каком-то декларативном языке программирования.
ага, на брейнфанке ;)
этот язык не развлечение, а нецензурное слово
Решений на самом деле получилось больше:
1. [«дмитров»,«вологда»,«архангельск»,«калининград»,«далматово»,«владивосток»,«краков»]
2. [«дмитров»,«вологда»,«архангельск»,«краков»,«владивосток»,«калининград»,«далматово»]
3. [«дмитров»,«владивосток»,«калининград»,«далматово»,«вологда»,«архангельск»,«краков»]
4. [«дмитров»,«владивосток»,«краков»,«вологда»,«архангельск»,«калининград»,«далматово»]
5. [«далматово»,«вологда»,«архангельск»,«калининград»,«дмитров»,«владивосток»,«краков»]
6. [«далматово»,«вологда»,«архангельск»,«краков»,«владивосток»,«калининград»,«дмитров»]
7. [«далматово»,«владивосток»,«калининград»,«дмитров»,«вологда»,«архангельск»,«краков»]
8. [«далматово»,«владивосток»,«краков»,«вологда»,«архангельск»,«калининград»,«дмитров»]

И судя по всему они все правильные.
«далматово»,«владивосток»
«далматово»,«вологда»
и т.д.

Ну неверные это цепочки, понимаете?
Предпоследнюю букву можно использовать, если нет «чистого» решения.
Предпоследнюю букву можно использовать, если нет «чистого» решения
Вроде как в правилах написано:
спользовать предпоследнюю букву можно только в том случае, если нет слов, начинающихся с последней буквы
Посмотрите пример в посте:
> неправильное решение, переход Вологда-Дмитров недопустим
потому что есть [Вологда, Архангельск]
раз нет ограничения на языки программирования — пишем свой компилятор. Тогда потенциально исполняемый код может занимать 1 байт.
В этом случае мы будем анализировать алгоритм заложенный в компилятор :)
Ненене, так нельзя :)
Лучше добавьте условие вроде наличия статьи об языке в википедии больше месяца.
Программисты на J явно вне конкуренции.
Пролог или Эрланг тоже неплохо бы подошли на роль решателя такого. Не слишком быстро, но ооочень компактно.
Ассемблерщики и паскалевцы значит в пролете…
А что если я напишу свой ограниченный язык программирования?
Напишу интерпретатор, а у самого языка будет только одна функция- "@", которая высчитывает вашу задачу?
P.S. Директивы препроцессора считаются за код?
НЛО прилетело и опубликовало эту надпись здесь
у тебя пожалуй самый глупый вопрос.
на askdev все подробно написано: на входе слова разделенные через ",", на выходе тоже слова, тоже чекер кому, который подходят под правила игри города.
НЛО прилетело и опубликовало эту надпись здесь
дурак математика не поймет, как бы по поставили задачу =(
предлагаю тебе разом поставить на место всю оборзевшую школоту, заняв место хотя бы в первой тройке.

ну, 1984, слабо?
НЛО прилетело и опубликовало эту надпись здесь
А куда ответ выводить?
В консоль или в файл?
4. Если вы используете экзотический язык программирования — подскажите организаторам где можно скачать компилятор.

ща пойду свой компилятор склепаю под игру «города», и длина моего кода будет 1 байт, берете?)
подправляйте правила, что ли ;)
А что, время исполнения кода не учитывается?
Почему-то первой мыслью было составить граф и найти гамильтонов цикл…
На первом курсе в первом семестре была такая контрольная. На входе строка из слов разделенных запятой, а на выходе массив отсортированный. Кода получилось не мало, но там были ещё и другие процедуры кроме сортировки.
А если нет слов и на вторую букву с конца? Брать следующую итд?
Говорят, что тесты будут составлены таким образом, что такого не случится.
говорят, в каждом будет, как минимум, одно правильное решение.

и, не к Вам персонально, а в целом: ну, блин, никто в города не играл чтоли?
*в каждом тесте будет
Да почему-то упёрлись в фиксированность первого города в цепочке. С условием всё очень ясно.
Какая кодировка входных данных? Один байт, или два или utf-8 это для некоторых языков важно ;)
Любая. Как вам будет удобнее.
Пруф
А можно писать на некомпилируемом, а интерпретиремом?
не знаю можно ли, но я написал :)
Надо ли обрабатывать случаи, когда на последнюю букву в списке город есть, но это сам город и больше никого?

Например: [Самара, Курганинск]

Сдается мне, что некоторая часть учавствующих программ посчитает, что надо смотреть на последнюю «к» и не найдет решения.
Эм… какой-то странный вопрос.
[Курганинск, Самара] однозначно и без недоразумений.
А как определяется последнюю букву надо использовать или предпоследнюю на каждом шаге рекурсии?

Если по только тем городам, которые еще в данной ветке рекурсии не обрабатывались, то можно попасть на ошибку «Вологда-Дмитров» из топика. Там нужно смотреть «а» не смотря на то, что Архангельска в остатке уже нет.

А если по всем городам, то можно ошибочно посчитать и себя (Курганинск). Так что нужно каждый раз выкидывать из полного списка текущий город. А это лишние байты. Вот и спрашиваю, нужны ли они?
Простите, но именно на эти вопросы и нужно ответить испытуемым :)
А чем это не язык? Structured Query Language. Хотел бы я посмотреть решение на нём :)
python 206(((
меньше не получается…

попробую на выходных пролог вспомнить)
Там есть питон 176, интересно будет посмотреть :)
дада, а еще 145 на прологе)
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Не могу не смолчать.
Если я заархивирую свой алгоритм, это будет считаться (т.е. в коде будет зазипованная строка, которую я потом unzip'ить/eval'ить буду)? :) – SSoft 13 часов назад

такое не пройдет, обфускатором можно, но код должен быть похож на код все-таки

Уверен, процент решений накрылся из за своеобразной трактовки администрацией собственных правил.
Сейчас описаний «правильных» обфускаторов нет. Но при проверке такие будут. Вот так то.
Ага, странный ответ. Допустимо должно быть всё, хоть даже зипованные исходники; другое дело, что впихнуть архивированный исходник и unzip в сотню байт (а стоит именно на это ориентироваться) вряд ли можно будет.
да любой используйте, главное чтобы небыло eval(unzip('sdjkjcxcbsdhksjdhajsd')), код типа $a=$b*$c[0];$v=$g и тп, все же более похож на код.

Проблема с зипованием, в том, что теряется всякая наглядность, кому будет интересно такое смотреть? у нас цель ведь не только отдать приз, а и оставить что-то интересное, а вот наглядный код это интересно, хоть и програнный обфускатором.
Думаю, у перлокодеров преемущество перед остальными =)
>преИмущество
конечно же.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории