Разминка для мозгов
От: Ziaw Россия  
Дата: 20.05.10 17:56
Оценка:
hardcase навел меня на некий
конкурс

По идее nemerle неплохой язык для таких задач. Но у меня решение получается в 240 символов. Хотя даже пхп там догоняют до 220. А кто-то и 140 выдал.
Вобщем если кто-то сможет улучшить — велкам, я уже устал Производительность побоку, входные данные там обещают несколько десятков городов, это решение выдерживает несколько сотен.

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

      def test(r, x) 
      {
          r.Filter(inp.Map(s => ToLower(s[0])).Contains(_)).Last() == ToLower(x[0])
      }
      
      def reorder(valid, head, tail)
      {
          | (_, [], []) => valid.Rev()
          | ([], _, x :: tail) =>  
            match (reorder([x], head, tail))
            {
                | [] => reorder([], x :: head, tail)
                | x => x
            }
          | (r :: _, head, x :: tail) when test(r, x) => 
            reorder(x :: valid, [], head + tail)
          | (_, _, x :: tail) => reorder(valid, x :: head, tail)
          | _ => 
            []
      }
      
      def right = reorder([], [], inp);
      match (right)
      {
        | [] => WriteLine("err");
        | _ => WriteLine($"$right");
      }


Естественно чтобы получить 240 байт надо убрать все пробелы и перейти на односимвольные переменные.
Re: Разминка для мозгов
От: Воронков Василий Россия  
Дата: 21.05.10 21:40
Оценка: 15 (2)
Здравствуйте, Ziaw, Вы писали:

var list = ["kaliningrad", "vologda", "almaty", "dmitrov", "arhangelsk", "tobolsk", "krakov"];
let search(t, l, w, i) {
    on u, x::xs, _, _ -> x[0] == w[i] ? {list = t+xs; x } : search(x::u, xs, w, i)
    on _ -> search([], t+l, w, i - 1)
}

var p = "a";
[ for (e in list) p = search([], list, p, p.length - 1) ]


132
Немерлевский вариант можно, я думаю, в таком же ключе написать.
Re[2]: Разминка для мозгов
От: Ziaw Россия  
Дата: 22.05.10 03:01
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>
ВВ>var list = ["kaliningrad", "vologda", "almaty", "dmitrov", "arhangelsk", "tobolsk", "krakov"];
ВВ>let search(t, l, w, i) {
ВВ>    on u, x::xs, _, _ -> x[0] == w[i] ? {list = t+xs; x } : search(x::u, xs, w, i)
ВВ>    on _ -> search([], t+l, w, i - 1)
ВВ>}

ВВ>var p = "a";
ВВ>[ for (e in list) p = search([], list, p, p.length - 1) ]
ВВ>


ВВ>132

ВВ>Немерлевский вариант можно, я думаю, в таком же ключе написать.

Напиши =) Не буду же я твой вариант постить на конкурс. Не ради приза даже, просто если там победит немерл — будет здорово.

Только тут вроде ошибка, он будет искать город с последей буквы, потом с предпоследней, потом со второй сзади, так?
Re: Разминка для мозгов
От: Vermicious Knid  
Дата: 22.05.10 04:39
Оценка: 7 (1)
Здравствуйте, Ziaw, Вы писали:

Z>По идее nemerle неплохой язык для таких задач.

Я так не думаю. По сравнению с С# и Java — да, а вообще нет. По очень многим причинам Nemerle далеко не самый краткий язык, особенно когда речь идет о таких небольших программах. Т.к. основной критерий для этого конкурса — размер исходного кода, то видимо для таких "задач" лучше подходят языки типа J/K/APL.

Z>Но у меня решение получается в 240 символов. Хотя даже пхп там догоняют до 220. А кто-то и 140 выдал.

Сильно меньше на Nemerle не получится.

Моя лучшая попытка:
using Nemerle.Utility; // нужно для IEnumerable.Filter

def lst = ["Kaliningrad", "vologda", "almaty", "dmitrov", "arhangelsk", "tobolsk", "krakov"].Map(_.ToLower());

// копипаст из кода Ziaw, мне ничего короче придумать не удалось
def last_letter(c){ c.Filter(lst.Map(x=>x[0]).Contains(_)).Last }

mutable res = [];
def search(sol, l)
{
    if (l is []) 
        res = sol :: res
    else
        foreach(x in l)
            when (x[0] == last_letter(sol.Last))
                search(sol+[x], l.Remove(x))
}

lst.Iter(t=>search([t], lst.Remove(t)));
System.Console.WriteLine(res.Head)

На первый взгляд вроде бы работает правильно и находит все решения. Первоначальный вариант был менее императивным, но в погоне за краткостью родился именно такой код.
Re[3]: Разминка для мозгов
От: Воронков Василий Россия  
Дата: 22.05.10 10:08
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Напиши =) Не буду же я твой вариант постить на конкурс. Не ради приза даже, просто если там победит немерл — будет здорово.


Вот как-то так:

mutable lst = ["kaliningrad", "vologda", "almaty", "dmitrov", "arhangelsk", "tobolsk", "krakov"];
def search(l, w, i) {
    | (x::xs, _, _) => if (x[0] == w[i]) {lst=lst.Remove(x); x } else search(xs, w, i)
    | _ => search(lst, w, i - 1)
}
mutable p = "a";
$[ { p = search(lst, p, p.Length - 1); p } | e in lst]


На выходе:

[almaty, tobolsk, kaliningrad, dmitrov, vologda, arhangelsk, krakov]


Z>Только тут вроде ошибка, он будет искать город с последей буквы, потом с предпоследней, потом со второй сзади, так?


Да, вроде так и должно быть? Только мне непонятно по какому принципу должен первый город выбираться. Выбираю первый на "а".
Re[4]: Разминка для мозгов
От: Ziaw Россия  
Дата: 22.05.10 11:23
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

Z>>Только тут вроде ошибка, он будет искать город с последей буквы, потом с предпоследней, потом со второй сзади, так?


ВВ>Да, вроде так и должно быть?


Нет, только последняя или предпоследняя если в исходном списке нет городов на последнюю.

ВВ>Только мне непонятно по какому принципу должен первый город выбираться. Выбираю первый на "а".


Задача найти любой валидный маршрут, по условию он существует.
Re: Разминка для мозгов
От: _DAle_ Беларусь  
Дата: 22.05.10 11:40
Оценка: 14 (1)
Здравствуйте, Ziaw, Вы писали:

Z>hardcase навел меня на некий

Z>конкурс

Z>По идее nemerle неплохой язык для таких задач. Но у меня решение получается в 240 символов. Хотя даже пхп там догоняют до 220. А кто-то и 140 выдал.

Z>Вобщем если кто-то сможет улучшить — велкам, я уже устал Производительность побоку, входные данные там обещают несколько десятков городов, это решение выдерживает несколько сотен.

Интересно, вот 25 городов: ["AB", "BA", "BC", "CB", "ABA", "ACA", "ADA", "AEA", "AFA", "AGA", "AHA", "AIA", "AJA", "AKA", "ALA", "AMA", "ANA", "AOA", "APA", "AQA", "ARA", "ASA", "ATA", "AUA", "AVA"]. Выдерживает?
Re[2]: Разминка для мозгов
От: Ziaw Россия  
Дата: 22.05.10 12:58
Оценка:
Здравствуйте, _DAle_, Вы писали:

_DA>Интересно, вот 25 городов: ["AB", "BA", "BC", "CB", "ABA", "ACA", "ADA", "AEA", "AFA", "AGA", "AHA", "AIA", "AJA", "AKA", "ALA", "AMA", "ANA", "AOA", "APA", "AQA", "ARA", "ASA", "ATA", "AUA", "AVA"]. Выдерживает?


Да легко Только у нее нет решения. Никакую из букв тут откинуть нельзя. Достаточно взглянуть на первые 5 городов. Если добавить еще один город "BA" — решение находится за 55мс с решением, 60 без.
Re[3]: Разминка для мозгов
От: _DAle_ Беларусь  
Дата: 22.05.10 13:11
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, _DAle_, Вы писали:


_DA>>Интересно, вот 25 городов: ["AB", "BA", "BC", "CB", "ABA", "ACA", "ADA", "AEA", "AFA", "AGA", "AHA", "AIA", "AJA", "AKA", "ALA", "AMA", "ANA", "AOA", "APA", "AQA", "ARA", "ASA", "ATA", "AUA", "AVA"]. Выдерживает?


Z>Да легко Только у нее нет решения. Никакую из букв тут откинуть нельзя. Достаточно взглянуть на первые 5 городов. Если добавить еще один город "BA" — решение находится за 55мс с решением, 60 без.


Как это нет решения? AB BC CB BA а дальше в любом порядке. Может мы по-разному понимаем условие?
Re[4]: Разминка для мозгов
От: Ziaw Россия  
Дата: 22.05.10 13:51
Оценка:
Здравствуйте, _DAle_, Вы писали:

_DA>Как это нет решения? AB BC CB BA а дальше в любом порядке. Может мы по-разному понимаем условие?


Ага, туплю чего то Нашел у себя багу, заодно чуть уменьшил алгоритм. Тупым перебором тут не ограничиться, примерно 15 городов еще выдерживается, потом квдратичная сложность заруливает. Интересно, насколько каверзные примеры там будут? Наверное тупой перебор просто не пройдет в финал
Re[5]: Разминка для мозгов
От: Ziaw Россия  
Дата: 22.05.10 13:52
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>потом квдратичная сложность заруливает.


Или факториал... туплю все туплю.
Re[6]: Разминка для мозгов
От: _DAle_ Беларусь  
Дата: 22.05.10 14:01
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, Ziaw, Вы писали:


Z>>потом квдратичная сложность заруливает.


Z>Или факториал... туплю все туплю.


Мне почему-то кажется, что организаторы конкурса не в курсе, что за задачу они вообще дали И тесты такие они вряд ли будут придумывать. Так что, думаю, переборное решение — это то, чего ждут организаторы.
Re[7]: Разминка для мозгов
От: Ziaw Россия  
Дата: 22.05.10 14:34
Оценка:
Здравствуйте, _DAle_, Вы писали:

_DA>Мне почему-то кажется, что организаторы конкурса не в курсе, что за задачу они вообще дали И тесты такие они вряд ли будут придумывать. Так что, думаю, переборное решение — это то, чего ждут организаторы.


=) Интересно. А как можно оптимизировать?
Я вижу оптимизацию в поиске множеств без решения. Или просто запоминании их по мере отсечения для каждой начальной буквы.
Еще один вариант в постепенном выстраивании "однозначных" цепочек, только тут маленько не хватает мозгов, чтобы понять не будет ли данная задача сложнее исходной.
Re[8]: Разминка для мозгов
От: _DAle_ Беларусь  
Дата: 22.05.10 14:52
Оценка: 22 (2)
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, _DAle_, Вы писали:


_DA>>Мне почему-то кажется, что организаторы конкурса не в курсе, что за задачу они вообще дали И тесты такие они вряд ли будут придумывать. Так что, думаю, переборное решение — это то, чего ждут организаторы.


Z>=) Интересно. А как можно оптимизировать?

Z>Я вижу оптимизацию в поиске множеств без решения. Или просто запоминании их по мере отсечения для каждой начальной буквы.
Z>Еще один вариант в постепенном выстраивании "однозначных" цепочек, только тут маленько не хватает мозгов, чтобы понять не будет ли данная задача сложнее исходной.

Строим ориентированный граф. Вершины — символы алфавита, ребра — это названия городов. То есть для "Алматы" (при отсутствии городов на Ы) будет ребро между вершинами А и Т. Остается найти эйлеров путь в этом графе. Делается это со сложностью O(n), где n — количество наших городов-ребер.
Re[5]: Разминка для мозгов
От: Воронков Василий Россия  
Дата: 22.05.10 16:22
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>>>Только тут вроде ошибка, он будет искать город с последей буквы, потом с предпоследней, потом со второй сзади, так?

ВВ>>Да, вроде так и должно быть?
Z>Нет, только последняя или предпоследняя если в исходном списке нет городов на последнюю.

А где ты там такое увидел? Они пишут: "Прошу учесть во внимание что города на букву Ы в данном списке нет, поэтому далее поиск идет по предыдущей букве." По идее логика такая — если нет города на эту букву, то берем предыдущую и пр. Вроде как это вполне соответствует правилам самой игры Города.
Re[6]: Разминка для мозгов
От: Ziaw Россия  
Дата: 22.05.10 16:43
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Здравствуйте, Ziaw, Вы писали:


Z>>>>Только тут вроде ошибка, он будет искать город с последей буквы, потом с предпоследней, потом со второй сзади, так?

ВВ>>>Да, вроде так и должно быть?
Z>>Нет, только последняя или предпоследняя если в исходном списке нет городов на последнюю.

ВВ>А где ты там такое увидел? Они пишут: "Прошу учесть во внимание что города на букву Ы в данном списке нет, поэтому далее поиск идет по предыдущей букве." По идее логика такая — если нет города на эту букву, то берем предыдущую и пр. Вроде как это вполне соответствует правилам самой игры Города.


Увидел в каментах, но важно не это, а то, что буквы нет во всем списке, а не только в остатке. Либо я не так понял логику твоего поиска.
Re[7]: Разминка для мозгов
От: Воронков Василий Россия  
Дата: 22.05.10 16:52
Оценка:
Здравствуйте, Ziaw, Вы писали:

ВВ>>А где ты там такое увидел? Они пишут: "Прошу учесть во внимание что города на букву Ы в данном списке нет, поэтому далее поиск идет по предыдущей букве." По идее логика такая — если нет города на эту букву, то берем предыдущую и пр. Вроде как это вполне соответствует правилам самой игры Города.

Z>Увидел в каментах, но важно не это, а то, что буквы нет во всем списке, а не только в остатке. Либо я не так понял логику твоего поиска.

Не понял, что значит нет во всем списке? Ты в игру-то играл? По идее один и тот же город нельзя называть два раза, т.е. как только он у нас заматчился — выкидываем его из списка и игнорируем в дальнейшем. Поэтому учитываться всегда должен только остаток, как я понимаю.
А по производительности вы тут зря обсуждение затеяли. Там таких условий нет. Важно, чтобы в принципе работало + самый короткий код. По сути это конкурс говнокода
К тому же даже мой первоначальный вариант на интерпретируемом языке на 2х десятков городов работает без времени.
Re[7]: Разминка для мозгов
От: Воронков Василий Россия  
Дата: 22.05.10 16:54
Оценка:
Здравствуйте, Ziaw, Вы писали:

ВВ>>А где ты там такое увидел? Они пишут: "Прошу учесть во внимание что города на букву Ы в данном списке нет, поэтому далее поиск идет по предыдущей букве." По идее логика такая — если нет города на эту букву, то берем предыдущую и пр. Вроде как это вполне соответствует правилам самой игры Города.

Z>Увидел в каментах, но важно не это, а то, что буквы нет во всем списке, а не только в остатке. Либо я не так понял логику твоего поиска.

Да, уточню — у меня поиск всегда производится по всему списку за минусом уже выбранных городов.
Re[8]: Разминка для мозгов
От: Ziaw Россия  
Дата: 22.05.10 17:09
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Здравствуйте, Ziaw, Вы писали:


ВВ>>>А где ты там такое увидел? Они пишут: "Прошу учесть во внимание что города на букву Ы в данном списке нет, поэтому далее поиск идет по предыдущей букве." По идее логика такая — если нет города на эту букву, то берем предыдущую и пр. Вроде как это вполне соответствует правилам самой игры Города.

Z>>Увидел в каментах, но важно не это, а то, что буквы нет во всем списке, а не только в остатке. Либо я не так понял логику твоего поиска.

ВВ>Не понял, что значит нет во всем списке? Ты в игру-то играл? По идее один и тот же город нельзя называть два раза, т.е. как только он у нас заматчился — выкидываем его из списка и игнорируем в дальнейшем. Поэтому учитываться всегда должен только остаток, как я понимаю.


http://www.askdev.ru/blog/05/2010/%D0%9A%D0%BE%D0%BD%D0%BA%D1%83%D1%80%D1%81-%D0%98%D0%B3%D1%80%D0%B0-%D0%B2-%D0%B3%D0%BE%D1%80%D0%BE%D0%B4%D0%B0/#comment4321

Там условие найти маршрут содержащий все города в списке, как мне тут подсказали — Эйлеров путь.
Re[9]: Разминка для мозгов
От: Roman Odaisky Украина  
Дата: 22.05.10 19:35
Оценка:
Здравствуйте, _DAle_, Вы писали:

_DA>Делается это со сложностью O(n), где n — количество наших городов-ребер.


Оно-то так, только оптимизировать ведь нужно не производительность. Даже в 100 символов уложиться уже трудно.
До последнего не верил в пирамиду Лебедева.
Re[9]: Разминка для мозгов
От: Воронков Василий Россия  
Дата: 22.05.10 20:47
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>http://www.askdev.ru/blog/05/2010/%D0%9A%D0%BE%D0%BD%D0%BA%D1%83%D1%80%D1%81-%D0%98%D0%B3%D1%80%D0%B0-%D0%B2-%D0%B3%D0%BE%D1%80%D0%BE%D0%B4%D0%B0/#comment4321

Z>Там условие найти маршрут содержащий все города в списке, как мне тут подсказали — Эйлеров путь.

Комментарий, на который ты приводишь ссылку, опровергается самим же автором конкурса здесь:
http://www.askdev.ru/question/1969/Code-Golf-%D0%B8%D0%B3%D1%80%D0%B0-%D0%B2-%D0%B3%D0%BE%D1%80%D0%BE%D0%B4%D0%B0/

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

правильное решение, хотя возможна более оптимальная цепочка

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

Честно говоря, я уже запутался какие там правила По ходу они изменились в процессе обсуждения. Но я сомневаюсь, что автор предполагал использование эйлерового цикла.
Re[10]: Разминка для мозгов
От: _DAle_ Беларусь  
Дата: 22.05.10 22:30
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Здравствуйте, Ziaw, Вы писали:


Z>>http://www.askdev.ru/blog/05/2010/%D0%9A%D0%BE%D0%BD%D0%BA%D1%83%D1%80%D1%81-%D0%98%D0%B3%D1%80%D0%B0-%D0%B2-%D0%B3%D0%BE%D1%80%D0%BE%D0%B4%D0%B0/#comment4321

Z>>Там условие найти маршрут содержащий все города в списке, как мне тут подсказали — Эйлеров путь.

ВВ>Комментарий, на который ты приводишь ссылку, опровергается самим же автором конкурса здесь:

ВВ>http://www.askdev.ru/question/1969/Code-Golf-%D0%B8%D0%B3%D1%80%D0%B0-%D0%B2-%D0%B3%D0%BE%D1%80%D0%BE%D0%B4%D0%B0/

ВВ>Т.е. там явно говорится, что

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

ВВ>правильное решение, хотя возможна более оптимальная цепочка


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


ВВ>Честно говоря, я уже запутался какие там правила По ходу они изменились в процессе обсуждения. Но я сомневаюсь, что автор предполагал использование эйлерового цикла.


Я уверен, что не предполагал. Он там в комментариях удивляется тому, что решения могут долго работать А с формулировкой со всякими предпоследними буквами автор явно перемудрил, надо было быть проще и просто всегда гарантировать существование ответа с последними буквами. Да и сказать, что городов не может быть больше 20, тогда никаких бы дополнительных вопросов к нему не возникало.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.