Имя: Пароль:
IT
 
Сложный контест на оптимизацию. Машина тьюринга. 24 часа
0 Aceforg
 
27.06.15
21:59
На codingame.com с 20:00 27.06.15 на 24 часа запустился контест "Code of the Rings" на оптимизацию. Кому не жалко выходных и делать нечего, можете попробовать силы.

Суть примерно такова
Выйти из леса произнеся магическую фразу. В лесу есть 30 рун, изначальна на рунах пробелы. Руны можно вращать, на них появляются буквы в алфавитном порядке. Надо составить набор инструкций для Бильбо, произнести магическую фразу и выйти из леса

Формально примерно так
Написать программу генерирующий набор инструкций для Бильбо (этакая машина Тьюринга) для заданной фразы. Чем меньше инструкций, тем выше место, на данный момент рекорд 4817 инструкций
1 Xapac
 
27.06.15
22:01
(0) а зачем это нам?
2 Aceforg
 
27.06.15
22:02
(1) Если не интересно, то можешь пройти мимо
3 Aceforg
 
27.06.15
22:06
+ Написать программу проходящий все тесты не так уж сложно. Вся фишка в оптимизации.
4 Garykom
 
гуру
27.06.15
22:17
Кто то хочет оптимизировать подбор осмысленных паролей?
5 Aceforg
 
28.06.15
00:05
Написал первую версию почти без оптимизации, прошел все 24 претеста. Сейчас нахожусь на 621 месте из 1003 участников.

Пока первые 3 места занимают российские программисты. Рекорд 4029 команд, у меня же 13477 команд

Запилил видео, пятого претеста
http://screencast.com/t/dY8xHTntLyOx
6 Garykom
 
гуру
28.06.15
00:08
7 Aceforg
 
28.06.15
00:11
(6) Они тут причем? Тут они совсем не нужны
8 Garykom
 
гуру
28.06.15
00:13
(7) "произнеся магическую фразу" - фраза предполагает какую то "осмысленность" или хотя бы "произносимость"

а не бессмысленный набор символов
9 Aceforg
 
28.06.15
00:18
(8) Магическая фраза здесь изначальные данные. Что за фраза и какой не имеет никакого значения.
Вот например фраза
OROZOLOKOTONOFOGOMOJOHOFOTOLOPO ODOYOWOAOZO OPOJOTO OROXOVOXO OC

Тут главное написать так чтоб было минимальное количество переходов инструкций
10 Aceforg
 
28.06.15
00:24
+ Вернее, смысл фразы не имеет значения
11 Garykom
 
гуру
28.06.15
00:31
(9)(10) тогда нифига не понял задачу

т.е. есть готовая фраза, есть набор действий для ее "написания" и нужно просто оптимально написать?

"хрень какая то"©

ЗЫ думал надо подбором узнать фразу
12 Aceforg
 
28.06.15
00:36
(11) Есть Бильбо - человечек на видео, он понимает инструкции
< идти налево
> идти направо
+ вращать руну в одну сторону
- вращать руну в другую сторону
. добавляет текущую букву на руне к фразе

на руне буквы в алфавитном порядке и пробел
13 Garykom
 
гуру
28.06.15
00:39
(12) гы забыл главное добавить... тупой человечек не должен долго стоять под камнем и тыкать + камень опустится и прихлопнет

т.е. еще более тупой алгоритм в несколько проходов
14 Garykom
 
гуру
28.06.15
00:43
(12)(13)+ так совсем ничего уже не понимаю... а ТЗ где нибудь есть с правилами?
15 Aceforg
 
28.06.15
00:50
(14) Поскольку требуется регистрация заскринил ТЗ

http://screencast.com/t/mPkzbl2kSsd
http://screencast.com/t/UBkApsn2Ay
http://screencast.com/t/68aMyQ0B
http://screencast.com/t/FrM1H4Hm
16 Garykom
 
гуру
28.06.15
00:56
(15) угу терь вроде понял

вообщем либо крутим рулетку (путой камень) от начала(" ") в + или в - до нужного символа, либо идем к камешку где рулетка стоит поближе к нужному и меньше там крутим смотря скоко действий нуна

т.е. или крутим текущий или топаем до другого
17 Aceforg
 
28.06.15
00:57
+ Например магическая фраза "AZ"
Инструкция будет
"+.>-."
Изначально на всех рунах пробелы
1 "+" вращаем руну и получаем букву "А" на руне
2 "." добавляем букву "А" к фразе
3 ">" Идем на направо, там руне пробел
4 "-" Вращаем руну в обратную сторону получаем "Z"
5 "." добавляем букву "Z" к фразе

Получаем искомую фразу.

Как вариант можно набор "+.--."
18 Garykom
 
гуру
28.06.15
00:59
(17) лучши скажи скоко там символов в алфавите?
19 Aceforg
 
28.06.15
01:00
(16) Да, плюс есть инструкции триггера "[" "]"
для фраз типа
MELLON MORIAMELLON MORIAMORIAMORIAMELLON MELLON MELLON MORIAMORIAMELLON MELLON MORIA
20 Aceforg
 
28.06.15
01:01
(18) Рун всего 30, а букв как и в английском алфавите 26 плюс пробел
21 Garykom
 
гуру
28.06.15
01:05
(19) поподробнее про триггер?
22 Aceforg
 
28.06.15
01:09
"[" если руна с пробелом, все что в скобках пропускается
"]" если руна с пробелом, то триггер закрывается, иначе все что в скобках начинается заново

For example, AAAAAAAAAAAAAAAAAAAAAAAAAA (A x26) can be achieved with a simple
+.......................... as well as with +>-[<.>-].
23 Aceforg
 
28.06.15
01:10
Вся фишка в этих квадратных скобках. Пока еще не придумал как можно сделать
24 Garykom
 
гуру
28.06.15
01:10
(21) хотя понял... алгоритм лучшего сжатия данных за счет минимума инструкций, причем можно не только повторять в цикле цепочки байт но и использовать старые
25 Garykom
 
гуру
28.06.15
01:11
(23) про RLE почитай
26 Aceforg
 
28.06.15
01:12
+ (22) Кажется строка  "+>-[<.>-]." делает много лишних движений, но она короче "+.........................."
27 Aceforg
 
28.06.15
01:16
(2)Тут сжатие конечно поможет, но не сильно
28 Aceforg
 
28.06.15
01:19
Подумываю делать через деревья, но боюсь не уложусь по времени. Ограничение по времени 2 сек
29 Aceforg
 
28.06.15
01:29
Кстати прогать можно в любом ИДЕ, надо поставить расширение и прожку. Отлаживаю в Visual Studio, проверяю на сайте автоматом
30 Garykom
 
гуру
28.06.15
01:31
(28) просто храни у себя текущее состояние рун

затем смотреть что выгоднее крутить рулетку или если где то есть цепочка готовая то сбегать туда и сделать циклу

вообщем классический архиватор так то нужно написать

нуна анализировать фразу, на повторы символов и подстрок, и в процессе анализировать текущий словарь на уже готовые или "почти готовые" построки

т.е. нужно ввести AAABA а у нас уже есть где то AAAAA то бежим туды, меням одну B на A и юзаем "слово"
31 Garykom
 
гуру
28.06.15
01:32
(30)+ но они конечно хитро...е

там на готовый алгоритм который кто то наваяет и отправит права у кого?
32 Garykom
 
гуру
28.06.15
01:32
(31) т.е. алгоритмы победителей это готовые алгоритмы сжатия для архиваторов
33 Aceforg
 
28.06.15
01:34
(32) Ну что ты заладил про архиваторы. Они тут не сильно помогут. Ну как архиватор сделает из "+.........................."
"+>-[<.>-]."  Тут принцип совершенно другой.
34 Garykom
 
гуру
28.06.15
01:42
(33) как бы сделать минимальную последовательность простых операций на ленточном поле для вывода требуемого файла ))

т.е. распаковать такой сжатый файл может вообще любой КА, причем очень быстро

причем скорость распаковки будет очень высокая, и требующая минимум памяти
35 Aceforg
 
28.06.15
01:42
Сделал небольшую оптимизацию, получилось 11893 команд, но все равно опустился до 730 места. Наши продолжают лидировать
36 Garykom
 
гуру
28.06.15
01:43
(33) и как бы какие принципы архивации(сжатия) данных то вообще знаем?
37 Garykom
 
гуру
28.06.15
01:44
(36)+
3 основных это:
1. RLE,
2. словарное кодирование и
3. частотное кодирование
38 Garykom
 
гуру
28.06.15
01:45
да мое в 14 строк пока на 940 месте и оно не проходит последний тест 24 long spell

тупо ошибка что не влазит ))
39 Garykom
 
гуру
28.06.15
01:46
(38)+

static void Main(string[] args)
    {
        string magicPhrase = Console.ReadLine();
        // Write an action using Console.WriteLine()
        // To debug: Console.Error.WriteLine("Debug messages...");
        int currentCode = 32;
        int lenPhrase = magicPhrase.Length;
        foreach (char symbol in magicPhrase){
            char rune = (char)currentCode;
            while (rune!=symbol){
                Console.Write("+");
                currentCode++;
                if (currentCode==33) currentCode = 65; else
                if (currentCode==31) currentCode = 90; else
                if (currentCode==91) currentCode = 32; else
                if (currentCode==64) currentCode = 32;
                rune = (char)currentCode;
            }
            Console.Write(".");
        }
        Console.WriteLine("");
    }
40 Garykom
 
гуру
28.06.15
01:47
(39) совсем тупой алгоритм "на месте стою рулетку кручу"
41 Aceforg
 
28.06.15
01:48
(39) Начало положено )
42 Garykom
 
гуру
28.06.15
01:48
(40) надо хотя бы крутить в разные стороны будет получеше или смещаться если так будет ближе от " "
43 Garykom
 
гуру
28.06.15
02:00
(37) развивая алгоритмы

1. пример в (22) и (26)
2. если следующие символы уже есть в виде рун (причем неважно слева-направо или справа-налево) то проще их протыкать чем крутить рулетку
3. некоторые наиболее часто встречающиеся символы в магической фразе лучше хранить в виде готовых рун и тыкать с минимальными переходами
44 Garykom
 
гуру
28.06.15
02:01
(43)+ вообщем совмещение 1 и 3 дает место в 1-й сотне легко
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.