Hackear las elecciones

46

Eres un hacker profesional y tu jefe te acaba de ordenar que ayudes a un candidato a ganar las próximas elecciones. Su tarea es alterar los datos de las máquinas de votación para aumentar los resultados del candidato.

Las máquinas de votación almacenan los resultados de la votación como dos enteros: el número de votos para su candidato ( v1) y el número de votos para su oponente ( v2).

Después de semanas de investigación, ha encontrado un agujero de seguridad en el sistema y puede aumentar el valor de v1un número entero xy disminuir el valor de v2la misma x. Pero hay una restricción, debe mantener constante el código hash de seguridad:

  • código hash de seguridad: (v1 + v2*2) modulo 7

Además, el valor de xdebe ser mínimo para que sus cambios pasen desapercibidos.

Su programa debe aceptar como entrada v1y v2; debería generar el valor óptimo para xeso v1>v2.

Hay algunos casos para los que no puede hackear los resultados; no tiene que manejarlos (esto podría generar problemas con su jefe, pero esa es otra historia).

Casos de prueba

100,123 --> 14
47,23 --> 0
40,80 --> 21
62,62 --> 7
1134,2145 --> 511
Arnaud
fuente
44
Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
Dennis
11
Además, para los votantes cercanos: esto es perfectamente sobre el tema. Si no le gusta, puede rechazarlo.
Rɪᴋᴇʀ
10
¡Qué función hash segura!
Cruncher
¿Se puede suponer que las entradas son seguidas por .0(Me gusta 100.0 123.0)?
Esolanging Fruit

Respuestas:

21

Python 2, 30 bytes

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

uson nuestros votos, tson sus votos.

orlp
fuente
3
¿No podría (t-u)/14*7ser justo (t-u)/2?
Conor O'Brien el
2
Oh, espera, no importa, Py2 hace división entera
Conor O'Brien
@ ConorO'Brien Nope. Considere t-u == 16. Entonces 16/14 * 7 = 7, pero 16/2 = 8. Además, no estás ejecutando como Python 2.
orlp
@orlp No sé cuál preguntar, así que les preguntaré a ambos, ¿podrían explicarme cómo pensaron esto? y<x?0:(y-x)/2-(y-x)/2%7+7;, Pensé que debería tomar la diferencia dividirla por la mitad, y luego encontrar el múltiplo más cercano de 7. ¿Cómo llegaste a esto?
Wade Tyler
1
la misma solución está arriba
username.ak
20

Python 2, 30 bytes

lambda a,b:max((b-a)/14*7+7,0)
xnor
fuente
3
@orlp Sí, creo que esta es la forma de escribir la expresión. A menos que una solución recursiva sea más corta, lo cual dudo.
xnor
1
@xnor No sé cuál preguntar, así que les preguntaré a ambos, ¿podrían explicarme cómo pensaron esto? y<x?0:(y-x)/2-(y-x)/2%7+7;, Pensé que debería tomar la diferencia dividirla por la mitad, y luego encontrar el múltiplo más cercano de 7. ¿Cómo llegaste a esto?
Wade Tyler
2
@WadeTyler Estamos buscando el múltiplo más pequeño de 7 que es estrictamente mayor que la mitad de la diferencia. Para encontrar eso desde (b-a)/2, hacemos /7*7redondear hacia abajo al múltiplo más cercano de 7, y luego +7subir al siguiente hacia arriba. Es decir, a menos que obtengamos un número negativo, en cuyo caso estamos ganando de todos modos, solo podemos hacer 0. Tomar el maxcon 0 logra esto. Algo de eso también fue simplemente ajustar la expresión y ejecutarla en los casos de prueba para ver qué funciona.
xnor
2
@WadeTyler The /7*7es un tipo de expresión que aparece con suficiente frecuencia en el golf que creo que es un idioma. La idea es la n/7toma de la palabra n/7, es decir, encuentra cuántos múltiplos enteros de 7ajuste dentro n. Luego, multiplicar por lo 7lleva a ese número múltiplo de 7.
xnor
1
@JackAmmo Ese ejemplo da -2/7*7, y dado que la división de piso de Python se redondea hacia el infinito negativo, 2/7es -1, entonces 7*-7+1es 0. Entonces, ambos lados dan 0, lo que funciona bien.
xnor
13

Mathematica, 22 bytes

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

Función pura con argumentos #y #2. Golpea la profundidad máxima de recursión si la discrepancia es mayor que 7*2^16 = 458752.

Explicación

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
ngenisis
fuente
44
¿Puedes agregar una explicación para todo esto?
Pavel
@Pavel ¿Tal vez su comentario ha seguido recibiendo votos positivos porque mi explicación no estaba clara?
ngenisis
Pensé que estaba bien, pero también conozco Mathematica.
Pavel
@Pavel Bueno, ahora es mejor :)
ngenisis
7

Jalea , 9 bytes

IH:7‘×7»0

Pruébalo en línea!

Cómo funciona

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.
Dennis
fuente
6

En realidad , 13 bytes

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

Pruébalo en línea!

Utiliza la misma max((b-a)/14*7+7,0)fórmula que usan xnor y orlp.

Explicación:

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
Mego
fuente
55
En realidad , esta es una gran respuesta
TrojanByAccident
Siento que el nombre de este idioma fue intencional para hacer que los títulos de las presentaciones suenen como frases clave: "¡Chicos, en realidad , esto es 13 bytes! ¡Vamos!"
Patrick Roberts el
@PatrickRoberts En realidad, eso es correcto.
Mego
6

Groovy, 41 37 bytes

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

Este es un cierre sin nombre. Gracias a xnory orlppor la fórmula y James holdernesspor señalar un error.

La solución anterior utilizada intdiv()para la división de enteros pero se comporta de manera diferente a la //utilizada en python.

Pruébalo aquí!

Gurupad Mamadapur
fuente
5

Haskell, 30 24 bytes

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

Un operador infijo que toma primero el número de votos de su candidato preferido. Utiliza la misma lógica que las otras respuestas de redondeo /14*7+7.

Renzeee
fuente
2
Encontrar el primer valor que cumple una condición es un buen uso para until: a#b=until(\c->a+c>b-c)(+7)0o mejor a%b=until(>(b-a)/2)(+7)0. Aunque una fórmula aritmética es aún más corta.
xnor
1
Tenga en cuenta que, aparte de las alternativas más cortas de xnor, head[...]casi siempre se pueden acortar a[...]!!0
Laikoni
@xnor: su solución hasta que devuelve un Fractional a, no estoy seguro de si eso es aceptado. Con divesto es aunque más corto, ¡así que gracias! Finalmente utilicé el enfoque matemático, y de hecho, fueron otros dos bytes más cortos que hasta. @Laikoni: buen golf, no sabía sobre eso, lo recordaré.
Renzeee
4

J, 15 bytes

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

Un poco interesante, estaba trabajando en un problema y pensé que tenía una solución, pero resultó que estaba equivocado. Oh bien. Pruébalo en línea! Aquí está el resultado:

   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│
└─────────┴───┘
Conor O'Brien
fuente
En el futuro, utilice TIO.run/nexus
Pavel el
@Pavel No, tio.run es v2, nexus está ahí solo para compatibilidad v1
solo ASCII
@ ASCII-only tio.run tiene un descargo de responsabilidad en la parte inferior que todos los enlaces permanentes generados podrían romperse en el futuro. Creo que debería hacerlo más prominente. Excepto para fines de prueba, nadie debería usar v2 en este momento.
Dennis
@ Dennis ¡Oh, no lo sabía! Se editará lo antes posible.
Conor O'Brien el
4

CJam, 13 12 15 bytes

  • Salvó un byte gracias a Martin Ender.
  • Agregado 3 bytes gracias a Martin Ender.
  • Cambiado ]a [gracias a ETHproductions.

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

Robaron descaradamente los métodos de Orlp y Xnor.

La entrada son los dos números separados por un espacio: 100 123

Explicación:

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.
Fruta Esolanging
fuente
Des única 13. Y puede guardar un byte incrementando el valor antes de la multiplicación en lugar de sumar 7 después.
Martin Ender
@JamesHolderness El problema es que la división entera de Python trabaja rondas hacia -inf mientras que las rondas de CJam hacia cero.
Martin Ender
Puedo estar malentendidos, pero pensé que m]es ceil; m[Es piso.
ETHproductions
@ETHproductions Tienes razón, editado.
Esolanging Fruit
4

Excel VBA, 24 20 bytes

Immediates función de ventana que toma la entrada de las células A1y B1y salidas a la ventana de la VBE immediates.

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

Versión de subrutina, 43 bytes

toma la entrada b, ccomo variante \ entero e imprime en la ventana VBE inmediatamente

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

PHP, 41 39 bytes

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

toma datos de los argumentos de la línea de comandos; correr con -r.

7 5 bytes adicionales solo para manejar $ a> $ b: - /

Titus
fuente
3

Japt , 14 bytes

V-U /2+7 f7 w0

¡Ejecútalo aquí!

¡Gracias ETHproductions por reducir 3 bytes!

Oliver
fuente
1
Muy agradable. facepta un argumento y pisos a un múltiplo de ese número, por lo que creo que puede hacerlo V-U /2+7 f7 w0para guardar tres bytes.
ETHproductions
3

05AB1E , 9 bytes

-14÷>7*0M

Pruébalo en línea!

Explicación

-          # push difference of inputs
 14÷       # integer divide by 14
    >      # increment
     7*    # times 7
       0   # push 0
        M  # take max

O una función correspondiente con el mismo número de bytes que opera en un par de números

Î¥14÷>7*M

Pruébalo en línea!

Emigna
fuente
2

Dyalog APL , 14 bytes

Toma v1como argumento correcto y v2como argumento izquierdo.

07×1+(⌊14÷⍨-)

0 ⌈ el máximo de cero y

7 × siete veces

1 + (... ) uno más ...

 el piso de

14 ÷⍨ un decimocuarto de

- la diferencia (entre los argumentos)

TryAPL en línea!

Adán
fuente
2

Befunge, 19 bytes

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

Pruébalo en línea!

Esto se basa en una fórmula ligeramente diferente a la utilizada por orlp y xnor, ya que el intérprete de referencia de Befunge tiene diferentes reglas de redondeo para Python. Befunge tampoco tiene el lujo de una maxoperación.

El cálculo básico se ve así:

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

Examinando el código con más detalle:

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.
James Holderness
fuente
2

Java 8, 31 bytes

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

Esta es una expresión lambda asignable a IntBinaryOperator.

a es el voto de tu candidato, b es el de tu oponente.

Java redondea hacia abajo para la división con enteros positivos, por lo que +7-a%7se utiliza para aumentar el valor al siguiente múltiplo de 7.

Jack munición
fuente
a->b->(b=(b-a)/14*7+7)>0?b:0es 3 bytes más corto, pero me gusta un poco más tu enfoque, así que +1 de mi parte. Casi todas las respuestas dadas ya usan max((b-a)/14*7+7,0)...
Kevin Cruijssen
Prefiero usar lambdas que devuelven el resultado directamente. y sí, todos hicieron la fórmula un poco más corta, pero así fue como razoné sobre la respuesta antes de verificar a todos los demás
Jack Ammo
a->b->(b=(b-a)/14*7+7)>0?b:0también devuelve el resultado directamente: Pruébelo aquí. ¿O quiere decir que prefiere las lambdas de un solo método antes que las lambdas al curry; (a,b)->preferencia sobre a->b->, a pesar de que es más largo?
Kevin Cruijssen
método único sobre el curry, pero eso es solo una preferencia personal
Jack Ammo
1

Ruby, 26 27 bytes

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

Básicamente lo mismo que la solución Python de xnor y orlp, con un giro (no es necesario agregar 7, debido al módulo negativo, ahorra 1 byte en ruby, no sé sobre python)

Sin giro, el giro fue solo un mal caso de disonancia cognitiva. Olvídalo. De Verdad. :-)

GB
fuente
1

Scala, 31 bytes

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

La versión ternaria es 2 bytes más larga

jaxad0127
fuente
1

Noodel , 16 bytes

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

La ecuación extraída de las respuestas xor y orlp , pero dado que Noodel no tiene una capacidad máxima, tuvo que solucionar eso.

Intentalo:)

Cómo funciona

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