Найкоротший вираз для {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4}


24

Дано список цілих чисел {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4}. Для тих, хто цікавиться, ці цифри використовуються в розрахунку на будні дні.

Будній день = (m[n] + d + y + y>>2 + y/400 - y/100) % 7;, де m[n]- вираз, який я шукаю, d- день місяця, y- year - (month <= 2).

Побудуйте вираз, що складається з арифметичних, логічних та порозрядних операторів, який виведе для додатного цілого nчисла mтак, що m % 7дорівнює n-му номеру у списку.

Гілки, потрійні оператори, пошук таблиць і покажчики не дозволяються.

Оцінка:
1 - для | & ^ ~ >> <<операторів
1,1 - для + - < > <= >= == != ! && ||операторів
1,2 - для *оператора
1,4 - для / %операторів

Відповідь з найнижчою кількістю перемог

Особисто я знайшов:

(41*n)>>4+((n+61)>>4)<<2з оцінкою 6,4. Я подумав, що це буде важко знайти настільки забезпечене власне вираження для початку.


Гадаю, перенаправлення масиву (і родинного) теж не дозволено?
Джон Дворак

О, так, звичайно, я відредагував питання.
Сомній

6
Питання було б значно покращене якоюсь мотивацією. Звідки беруться ці цифри?
Пітер Тейлор

table lookupsЯ думаю, що цікаві фрази ...
ɐɔıʇǝɥʇuʎs

4
Чому б не порахувати% 7 у балі? Можливо, є інше рішення, що не використовує%. Чи є нульовим позитивним , негативним, чи то, чи нічого?
Томас Веллер

Відповіді:


34

2 2.2

Я люблю довільну арифметику точності.

0x4126030156610>>(n<<2)

Або якщо вам не подобається шестигранний,

1146104239711760>>(n<<2)

Тест:

print([(0x4126030156610>>(n<<2))%7 for n in range(1,13)])
[0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4]

Чи можете ви зробити 4*nзамість цього таблицю пошуку та зберегти 0,2 бали, записавши її як n<<2?
xnor

@xnor Абсолютно! Просто для переходу з восьмеричного на шістнадцятковий. Так само, як і сек.
isaacg

Класно. Я майже впевнений, що нічого кращого не може, тому що це вимагатиме використання лише однієї операції, і всі вони, здається, мають занадто багато структурних мод 7. Мій найкращий кандидат поділу const/nна цілі етажі зустрічається з протиріччям n=4та n=8.
xnor

@xnor Ще одна близька, const%nяка могла б задовольнити все, крім n = 1,2 та 3.
isaacg

Я хотів би зробити те саме, але ти побив мене до цього ...
ɐɔıʇǝɥʇuʎs

32

2.0

(127004 >> i) ^ 60233

або (оцінка 2.2):

(i * 3246) ^ 130159

Усі знайдені з грубою силою :-)


Оскільки це має такий самий бал, що і відповідь isaacg, але він не використовує 64-бітні цілі числа, я вибираю це як прийняту відповідь. Дякую за відповідь!
Сомній

8
@ user2992539 Хоча приємно, що ця відповідь використовує 32-бітні цілі числа, ви не вказали цей критерій у своєму виклику, що робить відповідь isaacg абсолютно вірною. Тому обидва відповіді відповідають, і я думаю, що справедливо прийняти перший, хто отримав цю оцінку. (Kudos to Super Chafouin, хоч, +1!)
Мартін Ендер

@ m.buettner Я з вами повинен погодитися. Наступного разу я буду більш уважним щодо опису та вибору відповідей.
Сомній

Щоб інші дізналися, чи могли б ви детальніше розказати, як ви зробили грубу силу розрахунку?
Томас Веллер

@Thomas я щойно зробив подвійний forцикл, перевіривши всі значення p, q для формули (p >> i) ^ q, потім пішов прийняти каву і через 10 мільйонів прийшов прочитати результати.
Арно

8

35.3

Я підозрюю, що це може бути найменш ефективним методом створення списку:

1.7801122128869781e+003 * n - 
1.7215267321373362e+003 * n ^ 2 + 
8.3107487075415247e+002 * n ^ 3 - 
2.0576746235987866e+002 * n ^ 4 + 
1.7702949291688071e+001 * n ^ 5 + 
3.7551387326116981e+000 * n ^ 6 - 
1.3296432299817251e+000 * n ^ 7 + 
1.8138635864087030e-001 * n ^ 8 - 
1.3366764519057219e-002 * n ^ 9 + 
5.2402527302299116e-004 * n ^ 10 - 
8.5946393615396631e-006 * n ^ 11 -
7.0418841304671321e+002

Я щойно підрахував поліноміальну регресію. Мені спокуса побачити, який ще жахливий метод можна було б спробувати.

Помітно, я міг би заощадити 3,3 бала, якби результат був округлий. На даний момент я не думаю, що це має значення.


5

3.2

Рішення на основі нуля:

7 & (37383146136 >> (i*3))

Одне рішення на основі:

7 & (299065169088 >> (i*3))

Спочатку я думав, що %7операція буде зарахована також і, %що це дорога операція тут, я намагався її вирішити і без цього.

Я прийшов до результату 3.2, як це:

// Construction of the number
// Use 3 bits per entry and shift to correct place
long c = 0;
int[] nums = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
for (int i = nums.Length - 1; i >= 0; i--)
{
    c <<= 3;
    c += nums[i];
}
// c = 37383146136

// Actual challenge
for (int i = 0; i < 13; i++)
{
    Console.Write("{0} ",7 & 37383146136 >> i*3);
}

Мені були б цікаві оптимізації з використанням цього підходу (без %). Спасибі.


Це круто, можливо, це допоможе мені якийсь день) Як ви думаєте, можливо, я повинен створити окреме питання для мінімізації цілої формули?
Сомній

1
Як щодо (0426415305230 >> (i*3)) & 7? Ви можете побачити вихідні цифри у зворотному порядку.
CJ Dennis

@CJDennis: Я думаю, що в C # немає восьмеричних чисел.
Томас Веллер

Я думав, що це просто C? Я не бачу жодної іншої посилання на C #.
CJ Dennis

0

Пітон (3)

Оскільки цих питань у ці дні досить багато, я вирішив скласти програму для автоматичного їх вирішення в 3 (або 2) лексемах. Ось результат цього виклику:

G:\Users\Synthetica\Anaconda\python.exe "C:/Users/Synthetica/PycharmProjects/PCCG/Atomic golfer.py"
Input sequence: 0 3 2 5 0 3 5 1 4 6 2 4
f = lambda n: (72997619651120 >> (n << 2)) & 15
f = lambda n: (0x426415305230L >> (n << 2)) & 15
f = lambda n: (0b10000100110010000010101001100000101001000110000 >> (n << 2)) & 15

Process finished with exit code 0

Доказ того, що це працює:

f = lambda n: (72997619651120 >> (n << 2)) & 15

for i in range(12):
   print i, f(i)

0 0
1 3
2 2
3 5
4 0
5 3
6 5
7 1
8 4
9 6
10 2
11 4

Як ваш розв'язувач розглядає вартість операндів?
Томас Веллер

@ThomasW. Це не так, він завжди буде використовувати правий зсув, можливо, лівий зсув (якщо значення не є 1 біт) та an &.
ɐɔıʇǝɥʇuʎs
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.