2014-12-07 3 views
0

Я только что увидел на StackOverflow объяснение объяснения Объяснения C. Я считаю конкурс очень интересным, поскольку я получаю возможность изучать новый C, и, кроме того, новые знания о программировании каждый день с ним.Напишите программу для создания формулы, соответствующей входному набору, заданному для вывода

Один интересного один Explain 1-liner party of a US President from IOCCC 2013

Как вы можете видеть, программа использует ряд функций по модулю (то есть. (Целое число)% 4796% 275% 4) для хеширования номера входного сигнала для формирования одного из два выхода номера. Эта «хеш-функция» была испытана и ошибочна, чтобы правильно работать для ограниченного набора входов.

Я думаю, что было бы здорово минимизировать размер ваших программ, чтобы вы могли сопоставить один результат другому. Например, вы можете иметь {яблоко, салат, морковь, грушу, апельсин, спаржу) при преобразовании в число и пройти через функцию, превратиться в {1,0,0,1,1,0}, и эта функция меньше чем полная база данных для поиска строки и определения ее плодовитости.

Так что мой вопрос ... как вы собираетесь создавать программу для перетаскивания с помощью модульных функций, которые будут работать для всех заданных наборов входных и выходных данных?

Продолжая пример фруктов, вы можете преобразовать первые две буквы плодов в ряд так: яблоко -> ар -> 0x6170

поэтому список становится {0x6170, 0x6c65, 0x6361, 0x7065, 0x6f72, 0x6173}

Итак, вы хотите сгенерировать функцию, состоящий из повторяющихся модуло на карту {0x6170, 0x6c65, 0x6361, 0x7065, 0x6f72, 0x6173} до {1,0,0,1,1,0}

Как бы это сделать?

+0

Похоже, вы поняли, что это грубая сила. Я не думаю, что есть какой-то особый умный способ обойти это, вы сомневаетесь, это просто сложный способ спросить, есть ли проблема с остановкой решения. – iluvcapra

+0

Я только что нашел этот вопрос http://programmers.stackexchange.com/questions/249458/given-known-inputs-and-outputs-can-we-generate-candidate-functions-that-will-ma – user3109679

+0

Что это такое делать с базами данных, или C в этом отношении? –

ответ

0

Интересный вызов, но далеко за пределами моих математических навыков. Итак, вот скотина реализация силы в простом C :P

не имеет математическое доказательство, и поэтому не могу доказать это всегда найти решение, но это работает для ввода. Добавление «фруктового» «клинтона» и «овоща» «mccaine» заставляет его работать немного дольше; добавление «абрикоса» сигнализирует о столкновении! (Что сообщается, но не говорит где. Обратите внимание, что столкновение внутри аналогично предметов - фрукты или овощей - на самом деле должно быть разрешено. Я не написал для этого код, но он должен быть относительно простым.)

Чтобы увидеть более длинную последовательность, добавьте «банан». По какой-то причине это должно подняться до 163,13,2. Забавно, добавив «кумкват» (у меня иссякнут фрукты) не займет много времени, и даже с другим «кокосом» это займет не так много времени.

Примечания по реализации:

Вы можете ограничить поиск максимального входного кода 2-байтовое, так как функция mod никогда ничего с большими числами делать. Для согласованности этот код C начинается с тестирования всех значений 1-mod (хотя я не нашел ничего полезного). Затем он проверяет значения 2-мода и, наконец, 3-модовые значения. Если он не найдет значения, вы можете расширить его, чтобы искать длинные последовательности с 4 модами и 5 модами, но время поиска будет увеличиваться логарифмически (!).

Должна быть возможность классифицировать более двух значений; что требует очень незначительной перезаписи кода. Я подозреваю, что поиск матча для всех займет гораздо больше времени.

Также должно быть возможно вернуть другие «индексы», чем 0 и 1; как я пишу это, остальная часть процессора работает на 2 и 0. Однако, похоже, это займет совсем немного времени.

реализация C, перебор:

#include <stdio.h> 
#include <stdlib.h> 

int main (void) 
{ 
    char *fruits[] = { "apple", "pear", "orange"} ; //, "clinton" }; 
    char *veggies[] = { "lettuce", "carrot", "asparagus" }; // , "mccaine" }; 
    int num_f, num_v, found_match; 
    unsigned short *code[2], max_code = 0; 

    int i,j, mod_value1, mod_value2, mod_value3; 

    num_f = sizeof(fruits)/sizeof(fruits[0]); 
    num_v = sizeof(veggies)/sizeof(veggies[0]); 

    code[0] = malloc((num_f+num_v)*sizeof(short)); 
    code[1] = malloc((num_f+num_v)*sizeof(short)); 

    for (i=0; i<num_f; i++) 
    { 
    code[0][i] = (fruits[i][0]<<8)+fruits[i][1]; 
    code[1][i] = 1; 
    if (code[0][i] > max_code) 
     max_code = code[0][i]; 
    } 
    for (i=0; i<num_v; i++) 
    { 
    code[0][num_f+i] = (veggies[i][0]<<8)+veggies[i][1]; 
    code[1][num_f+i] = 0; 
    if (code[0][num_f+i] > max_code) 
     max_code = code[0][num_f+i]; 
    } 

    for (i=0; i<num_f+num_v; i++) 
    { 
    for (j=i+1; j<num_f+num_v; j++) 
    { 
     if (code[0][i] == code[0][j]) 
     { 
     printf ("clash!\n"); 
     exit(-1); 
     } 
    } 
    } 

    printf ("calculating...\n"); 
    for (mod_value1=1; mod_value1<max_code; mod_value1++) 
    { 
    found_match = 1; 
    for (i=0; i<num_f+num_v; i++) 
    { 
     if (code[0][i] % mod_value1 != code[1][i]) 
     { 
     found_match = 0; 
     break; 
     } 
    } 
    if (found_match) 
    { 
     printf ("mod %d should work\n", mod_value1); 
     break; 
    } 
    } 
    if (found_match) 
    { 
    for (i=0; i<num_f; i++) 
    { 
     printf ("%s -> %d\n", fruits[i], code[0][i] % mod_value2 % mod_value1); 
    } 
    for (i=0; i<num_v; i++) 
    { 
     printf ("%s -> %d\n", veggies[i], code[0][num_f+i] % mod_value2 % mod_value1); 
    } 
    } else 
    { 
    for (mod_value1=1; mod_value1<max_code; mod_value1++) 
    { 
    for (mod_value2=mod_value1+1; mod_value2<max_code; mod_value2++) 
    { 
     found_match = 1; 
     for (i=0; i<num_f+num_v; i++) 
     { 
     if (code[0][i] % mod_value2 % mod_value1 != code[1][i]) 
     { 
      found_match = 0; 
      break; 
     } 
     } 
     if (found_match) 
     { 
     printf ("mod %d mod %d should work\n", mod_value2, mod_value1); 
     break; 
     } 
    } 
    if (found_match) 
     break; 
    } 

    if (found_match) 
    { 
    for (i=0; i<num_f; i++) 
    { 
     printf ("%s -> %d\n", fruits[i], code[0][i] % mod_value2 % mod_value1); 
    } 
    for (i=0; i<num_v; i++) 
    { 
     printf ("%s -> %d\n", veggies[i], code[0][num_f+i] % mod_value2 % mod_value1); 
    } 
    } else 
    { 
    for (mod_value1=1; mod_value1<max_code; mod_value1++) 
    { 
     for (mod_value2=mod_value1+1; mod_value2<max_code; mod_value2++) 
     { 
     for (mod_value3=mod_value2+1; mod_value3<max_code; mod_value3++) 
     { 
      found_match = 1; 
      for (i=0; i<num_f+num_v; i++) 
      { 
      if (code[0][i] % mod_value3 % mod_value2 % mod_value1 != code[1][i]) 
      { 
       found_match = 0; 
       break; 
      } 
      } 
      if (found_match) 
      { 
      printf ("mod %d mod %d mod %d should work\n", mod_value3, mod_value2, mod_value1); 
      break; 
      } 
     } 
     if (found_match) 
      break; 
     } 
     if (found_match) 
     break; 
    } 

    if (found_match) 
    { 
     for (i=0; i<num_f; i++) 
     { 
     printf ("%s -> %d\n", fruits[i], code[0][i] % mod_value3 % mod_value2 % mod_value1); 
     } 
     for (i=0; i<num_v; i++) 
     { 
     printf ("%s -> %d\n", veggies[i], code[0][num_f+i] % mod_value3 % mod_value2 % mod_value1); 
     } 
    } 
    } 
    } 
    return 0; 
} 

Результат для оригинального 3 фрукта, список 3 вегетарианец:

mod 25 mod 2 should work 
apple -> 1 
pear -> 1 
orange -> 1 
lettuce -> 0 
carrot -> 0 
asparagus -> 0 

Late Результат, для полезного выхода 2 и 0:

mod 507 mod 8 mod 3 should work 
apple -> 2 
pear -> 2 
orange -> 2 
lettuce -> 0 
carrot -> 0 
asparagus -> 0 

Позже результат с «спорным» «томатом» добавлен как a Категория 2:

mod 103 mod 7 mod 3 should work 
apple -> 1 
pear -> 1 
orange -> 1 
lettuce -> 0 
carrot -> 0 
asparagus -> 0 
tomato -> 2 
+0

Ничего себе! Это очень крутая реализация! Спасибо, что поделился! – user3109679

+0

Это очень полезно! Спасибо! Мне было интересно проанализировать, что делает ваш код. Действительно крутая реализация. – user3109679