Взломать выборы


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(Нравится 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?
Конор О'Брайен

2
Ой, подождите, неважно, Py2 делает целочисленное деление
Конор О'Брайен

@ ConorO'Брайен Нет. Посмотрим t-u == 16. Тогда
16/14

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

1
то же самое решение выше
username.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. Взятие maxс 0 достигает этого. Некоторые из них также просто настраивали выражение и запускали его в тестовых примерах, чтобы посмотреть, что работает.
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

Mathematica, 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

7

Желе , 9 байт

IH:7‘×7»0

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

Как это устроено

IH:7‘×7»0  Main link. Argument: [v1, v2]

I          Increments; compute [v2 - v1].
 H         Halve the result.
  :7       Perform integer division by 7.
    ‘      Increment the quotient.
     ×7    Multiply the result by 7.
       »0  Take the maximum of the product and 0.

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()для целочисленного деления, но оно ведет себя не так, как //в Python.

Попробуй это здесь!


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: пока решение не вернет a Fractional a, я не уверен, что это принято. С divним хоть и короче, так что спасибо! В конце концов использовался математический подход - и действительно, он был еще на два байта короче, чем до. @Laikoni: хороший гольф, не знал об этом, буду помнить это.
Рензее

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-only tio.run внизу имеет отказ от ответственности, что все сгенерированные постоянные ссылки могут нарушиться в будущем. Я думаю, что должен сделать это более заметным. За исключением тестирования, никто не должен использовать v2 в данный момент.
Деннис

@ Денис О, я не знал! Будет редактировать как можно скорее.
Конор О'Брайен

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]это ceil; 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

Dyalog 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:0на 3 байта короче, но мне больше нравится твой подход, так что +1 от меня. Почти каждый ответ на данный вопрос уже использует max((b-a)/14*7+7,0)..
Кевин Круйссен

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

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

единственный метод по сравнению с карри, но это всего лишь личное предпочтение
Джек Боеприпасы

1

Рубин, 26 27 байт

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

По сути, это то же самое, что и решение xnor и orlp для Python, с изюминкой (не нужно добавлять 7, из-за отрицательного значения по модулю, сохраняет 1 байт в ruby, не знаю о python)

Нет, поворот был просто плохой случай когнитивного диссонанса. Забудь это. В самом деле. :-)


1

Скала, 31 байт

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

Тройная версия на 2 байта длиннее


1

Noodel , 16 байтов

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

Вытащил уравнение из ответов xor и orlp , но поскольку у Нуделя нет максимальной возможности, пришлось обойти это.

Попробуй:)

Как это устроено

⁻÷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.