Зламати вибори


46

Ви професійний хакер, і ваш начальник щойно наказав вам допомогти кандидату виграти майбутні вибори. Ваше завдання - змінити дані машин для голосування, щоб підвищити результати кандидата.

Машини для голосування зберігають результати голосування як два цілих числа: кількість голосів за вашого кандидата ( v1) та кількість голосів за їх опонента ( v2).

Після тижневих досліджень ви виявили в системі дірку безпеки і можете збільшити значення v1на ціле число xі зменшити значення v2на те саме x. Але є обмеження, вам потрібно постійно підтримувати хеш-код безпеки:

  • код хешу безпеки: (v1 + v2*2) modulo 7

Також значення для xмає бути мінімальним, щоб ваші зміни могли залишитися непоміченими.

Ваша програма повинна приймати як вхід v1і v2; він повинен вивести оптимальне значення для xцього v1>v2.

Є деякі випадки, за яких ви не можете зламати результати; вам не доведеться поводитися з ними (це може призвести до проблем з вашим начальником, але це вже інша історія).

Тестові справи

100,123 --> 14
47,23 --> 0
40,80 --> 21
62,62 --> 7
1134,2145 --> 511

4
Коментарі не для розширеного обговорення; ця розмова переміщена до чату .
Денніс

11
Також близьким виборцям: Це ідеально на тему. Якщо вам це не подобається, ви можете його відхилити.
Rɪᴋᴇʀ

10
Яка безпечна хеш-функція!
Cruncher

Чи можете ви припустити, що за введеннями слідує .0(Like 100.0 123.0)?
Esolanging Fruit

Відповіді:


21

Python 2, 30 байт

lambda u,t:max(0,(t-u)/14*7+7)

uце наші голоси, tє їхні голоси.


3
Не могло (t-u)/14*7бути просто (t-u)/2?
Conor O'Brien

2
О, зачекайте, не забудьте, Py2 робить ціле ділення
Conor O'Brien

@ ConorO'Brien Nope. Розглянемо t-u == 16. Тоді
16/14

@orlp Я не знаю, кого запитати, тому я попрошу вас обох, чи можете ви мені пояснити, як ви це думали? y<x?0:(y-x)/2-(y-x)/2%7+7;, Я подумав, що я повинен взяти різницю, розділити її навпіл, а потім знайти найближчий кратний номер 7. Як ти дійшов до цього?
Уейд Тайлер

1
те саме рішення вище
ім'я користувача.ak

20

Python 2, 30 байт

lambda a,b:max((b-a)/14*7+7,0)

3
@orlp Так, я думаю, що це лише спосіб написання виразу. Якщо рекурсивне рішення не буде коротшим, в чому я сумніваюся.
xnor

1
@xnor Я не знаю, кого запитати, тому я попрошу вас обох, чи можете ви мені пояснити, як ви це думали? y<x?0:(y-x)/2-(y-x)/2%7+7;, Я подумав, що я повинен взяти різницю, розділити її навпіл, а потім знайти найближчий кратний номер 7. Як ти дійшов до цього?
Уейд Тайлер

2
@WadeTyler Ми шукаємо найменший кратний 7, який суворо перевищує половину різниці. Щоб знайти це з (b-a)/2, ми робимо, /7*7щоб округлити падіння до найближчого кратного 7, а потім +7перейти до наступного вгору. Тобто, якщо ми не отримаємо від’ємне число, і в цьому випадку ми все одно виграємо, можемо зробити 0. Отримавши значення max0, це досягає. Деякі з них також просто налаштовували вираз і запускали його на тестових кейсах, щоб побачити, що працює.
xnor

2
@WadeTyler Це /7*7своєрідний вираз, який проявляється досить часто в гольфі, що я вважаю це ідіомою. Ідея полягає у тому, щоб n/7взяти слово n/7, тобто знайти скільки цілих кратних 7розмірів укладаються всередині n. Потім множення на 7приводить його до цього числа, кратного 7.
xnor

1
@JackAmmo Цей приклад дає -2/7*7, і оскільки Python поділ підлоги округлює до негативної нескінченності, 2/7дорівнює -1, так 7*-7+1це 0. Так, обидві сторони дають 0, що добре працює.
xnor

13

Математика, 22 байти

0//.x_/;2x<=#2-#:>x+7&

Чиста функція з аргументами #і #2. Має максимальну глибину рекурсії, якщо розбіжність більше 7*2^16 = 458752.

Пояснення

0                       Starting with 0,
 //.                    repeatedly apply the following rule until there is no change:
    x_                    if you see an expression x
      /;                    such that
        2x<=#2-#            2x <= #2-# (equivalently, #+x <= #2-x)
                :>        then replace it with
                  x+7       x+7 (hash is preserved only by multiples of 7)
                     &  End the function definition

4
Чи можете ви додати пояснення до всього цього?
Павло

@Pavel Можливо, ваш коментар продовжував отримувати відгуки, оскільки моє пояснення було незрозумілим?
ngenisis

Я думав, що це добре, але потім я знову також знаю Mathematica.
Павло

@Pavel Ну, краще зараз :)
ngenisis


6

Власне , 13 байт

7;;τ((-\*+0kM

Спробуйте в Інтернеті!

Використовується та ж max((b-a)/14*7+7,0)формула, яку використовують xnor та orlp.

Пояснення:

7;;τ((-\*+0kM
7;;            3 copies of 7
   τ           double one of them
    ((-        bring the inputs back to the top, take their difference
       \*+     integer divide by 14, multiply by 7, add 7
          0kM  maximum of that and 0

5
Власне , це чудова відповідь
TrojanByAccident

Я відчуваю, що назва цієї мови мала намір зробити так, щоб заголовки подання звучали як пункліни: "Хлопці, насправді це 13 байт! Давай!"
Патрік Робертс

@PatrickRoberts Насправді це правильно.
Mego

6

Groovy, 41 37 байт

{x,y->[Math.floor((y-x)/14)*7+7,0].max()}

Це неназване закриття. Завдяки xnorі orlpдля формули і James holdernessза вказівку на помилку.

Попереднє рішення використовувалося intdiv()для цілого поділу, але воно поводиться інакше, ніж //у пітоні.

Спробуйте тут!


5

Haskell, 30 24 байти

a#b=max 0$div(b-a)14*7+7

Оператор інфіксації, який спочатку набирає кількість голосів вашого бажаного кандидата. Використовується та ж логіка, що й інші відповіді округлення /14*7+7.


2
Пошук першого значення, яке відповідає умові, є корисним для until: a#b=until(\c->a+c>b-c)(+7)0або кращого a%b=until(>(b-a)/2)(+7)0. Хоча арифметична формула все-таки коротша.
xnor

1
Зауважте, що крім коротких альтернатив xnor head[...]майже завжди можна скоротити[...]!!0
Laikoni

@xnor: ваш, поки рішення не повернеться Fractional a, я не впевнений, що це прийнято. З divним хоч і коротше, тож спасибі! Врешті-решт застосував математичний підхід - і справді це було ще два байти коротше, ніж до цього часу. @Laikoni: приємний гольф, про це не знав, запам'ятає.
Renzeee

4

J, 15 байт

0>.7+7*14<.@%~-

Щось цікаво, я працював над проблемою, і думав, що маю рішення, але, як виявляється, я помилявся. Ну добре. Спробуйте в Інтернеті! Ось результат:

   f =: 0>.7+7*14<.@%~-
   tests =: 123 100 ; 23 47 ; 80 40 ; 62 62 ; 2145 1134
   (,. f/ each) tests
┌─────────┬───┐
│123 100  │14 │
├─────────┼───┤
│23 47    │0  │
├─────────┼───┤
│80 40    │21 │
├─────────┼───┤
│62 62    │7  │
├─────────┼───┤
│2145 1134│511│
└─────────┴───┘

Надалі скористайтеся TIO.run/nexus
Павло

@Pavel Ні, tio.run v2, Nexus є лише для сумісності v1
ASCII,

@ ASCII тільки для tio.run внизу є відмова від відповідальності, що всі генеровані постійні посилання можуть порушитись у майбутньому. Я думаю, я повинен зробити це більш помітним. За винятком цілей тестування, в даний момент ніхто не повинен використовувати v2.
Денніс

@Dennis О, я не знав! Відредагуємо якнайшвидше.
Conor O'Brien

4

CJam, 13 12 15 байт

  • Збережено байт завдяки Мартіну Ендеру.
  • Додано 3 байти завдяки Мартіну Ендеру.
  • Змінено ]на [завдяки ETHproductions.

q~\-Ed/m[)7*0e>

Відверто вкрали методи orlp та xnor.

Введення - це два числа, розділені пробілом: 100 123

Пояснення:

q~\-Ed/m])7*0e>
q~\-            e# Input two numbers, swap and subtract them.
    E           e# Push 0xE (15)
     d/m]       e# Float divide and take the floor.
         )7*    e# Increment and multiply by 7.
            0e> e# Max of this and 0.

Dє лише 13. І ви можете зберегти байт, збільшивши значення перед множенням, замість того, щоб потім додавати 7.
Мартін Ендер

@JamesHolderness Проблема полягає в тому, що ціле ділення Python працює кругами в бік -inf, тоді як CJam кругляє до нуля.
Мартін Ендер

Я можу нерозуміти, але я подумав, що m]це стеля; m[є підлога.
ETHproductions

@ETHproductions Ви праві, відредаговані.
Esolanging Fruit

4

Excel VBA, 24 20 байт

Immediates функція вікна , яка приймає вхідні дані з комірок A1і B1виходів до вікна VBE immediates.

?Int([A1-B1]/14)*7+7

Версія підпрограми, 43 байти

приймає введення b, cяк варіант \ ціле число та друкує у вікно безпосереднього VBE

Sub a(b,c):Debug.?Int((c-b)/14)*7+7:End Sub


3

PHP, 41 39 байт

    <?=7*max(0,1+($argv[2]-$argv[1])/14|0);

приймає дані з аргументів командного рядка; бігати з -r.

7 5 додаткових байтів просто для обробки $ a> $ b: - /


3

Japt , 14 байт

V-U /2+7 f7 w0

Запусти його сюди!

Дякую ETHproductions за бриття 3-х байт!


1
Дуже хороша. fприймає аргумент і поверхи до кратного цього числа, тому я думаю, що ви можете так V-U /2+7 f7 w0зберегти три байти.
ETHproductions


2

Діалог APL , 14 байт

Приймається v1як правий аргумент і v2як лівий аргумент.

07×1+(⌊14÷⍨-)

0 ⌈ максимум нуля і

7 × сім разів

1 + (... ) один плюс ...

 пол

14 ÷⍨ чотирнадцятого о

- різниця (між аргументами)

СпробуйтеAPL онлайн!


2

Befunge, 19 байт

777+:&&\-+\/*:0`*.@

Спробуйте в Інтернеті!

Це спирається на дещо іншу формулу, яку застосовують orlp та xnor, оскільки інтерпретатор посилання Befunge має різні правила округлення до Python. У Befunge також немає розкоші maxоперації.

Основний розрахунок виглядає так:

x = (v2 - v1 + 14)/14*7
x = x * (x > 0)

Докладніше вивчаючи код:

7                     Push 7                                      [7]
 77+:                 Push 14 twice.                              [7,14,14]
     &&               Read v1 and v2 from stdin.                  [7,14,14,v1,v2]
       \-             Swap the values and subtract.               [7,14,14,v2-v1]
         +            Add the 14 that was pushed earlier.         [7,14,14+v2-v1]
          \/          Swap the second 14 to the top and divide.   [7,(14+v2-v1)/14]
            *         Multiply by the 7 that was pushed earlier.  [7*(14+v2-v1)/14 => x]
             :        Make a copy of the result                   [x,x]
              0`      Test if it's greater than 0.                [x,x>0]
                *     Multiply this with the original result.     [x*(x>0)]
                 .@   Output and exit.



2

Java 8, 31 байт

(a,b)->b<a?0:(a=(b-a)/2)+7-a%7;

Це лямбда-вираз, який можна присвоїти IntBinaryOperator.

a - голоси вашого кандидата, b - ваші опоненти.

java закріплюється на ділення на додатні цілі числа, тому +7-a%7використовується для підбивання значення до наступного кратного 7.


a->b->(b=(b-a)/14*7+7)>0?b:03 байти коротше, але мені подобається, що ваш підхід більше, тому +1 від мене. Майже в кожній наведеній відповіді вже використовується max((b-a)/14*7+7,0)..
Кевін Кройсейсен

Я вважаю за краще використовувати лямбда, які повертають результат безпосередньо. і так, всі зробили формулу трохи коротше, але саме так я міркував відповідь перед тим, як перевірити всіх інших
Jack Ammo

a->b->(b=(b-a)/14*7+7)>0?b:0також повертає результат безпосередньо: Спробуйте тут. Або ти маєш на увазі, що ти віддаєш перевагу лямбдам з одноразовим способом, ніж ламбда з каррі; (a,b)->перевагу над a->b->, хоча це довше?
Кевін Кройсейсен

єдиний метод над каррінгом, але це лише особиста перевага
Jack Ammo

1

Рубі, 26 27 байт

->a,b{[(b-a)/14*7+7,0].max}

В основному те саме, що рішення Python xnor's та orlp, з поворотом (не потрібно додавати 7 через негативний модуль, економить 1 байт в рубіні, не знаю про python)

Ніякого повороту, поворот був просто поганим випадком когнітивного дисонансу. Забудь це. Дійсно. :-)


1

Scala, 31 байт

(a,b)=>Math.max((b-a)/14*7+7,0)

Потрійна версія на 2 байти довша


1

Локшина , 16 байт

⁻÷14ɲL×7⁺7ḋɲl⁺÷2

Витягнути рівняння з відповідей xor та orlp , але оскільки Noodel не має максимальних можливостей, потрібно було обійти це.

Спробуй це:)

Як це працює

⁻÷14ɲL×7⁺7       # The equation...
⁻                # v2 - v1
 ÷14             # Pops off the difference, then pushes on the (v2 - v1)/14
    ɲL           # Applies lowercase which for numbers is the floor function.
      ×7         # Multiplies that by seven.
        ⁺7       # Then increments it by seven.

          ḋɲl⁺÷2 # To relate with the other answers, this takes the max between the value and zero.
          ḋ      # Duplicates what is on the top of the stack (which is the value just calculated).
           ɲl    # Pops off the number and pushes on the magnitude (abs value).
             ⁺   # Add the abs to itself producing zero if the number came out negative (which means we are already winning).
              ÷2 # Divides the result by two, which will either be zero or the correct offset.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.