Hack le elezioni


46

Sei un hacker professionista e il tuo capo ti ha appena ordinato di aiutare un candidato a vincere le prossime elezioni. Il tuo compito è quello di modificare i dati delle macchine di voto per migliorare i risultati del candidato.

Le macchine di voto memorizzano i risultati delle votazioni come due numeri interi: il numero di voti per il tuo candidato ( v1) e il numero di voti per il suo avversario ( v2).

Dopo settimane di ricerca, hai trovato un buco nella sicurezza del sistema e puoi aumentare il valore di v1di un numero intero xe diminuire il valore di v2dello stesso x. Ma c'è un vincolo, devi mantenere costante il codice hash di sicurezza:

  • codice hash di sicurezza: (v1 + v2*2) modulo 7

Inoltre, il valore per xdeve essere minimo in modo che le modifiche possano passare inosservate.

Il tuo programma dovrebbe accettare come input v1e v2; essa deve emettere il valore ottimale per xcosì v1>v2.

Ci sono alcuni casi per i quali non puoi hackerare i risultati; non devi gestirli (questo potrebbe portare a problemi con il tuo capo, ma questa è un'altra storia).

Casi test

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

4
I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Dennis,

11
Inoltre, per gli elettori vicini: questo è perfettamente in tema. Se non ti piace, puoi ridimensionarlo.
Rɪᴋᴇʀ

10
Che funzione hash sicura!
Cruncher,

Puoi presumere che gli input siano seguiti da .0(Like 100.0 123.0)?
Esolanging Fruit,

Risposte:


21

Python 2, 30 byte

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

usono i nostri voti, tsono i loro voti.


3
Non potrebbe (t-u)/14*7essere giusto (t-u)/2?
Conor O'Brien,

2
Oh, aspetta, non importa, Py2 fa la divisione intera
Conor O'Brien,

@ ConorO'Brien Nope. Prendere in considerazione t-u == 16. Quindi 16/14 * 7 = 7, ma 16/2 = 8. Inoltre, non
esegui

@orlp Non so quale chiedere, quindi chiederò a entrambi, potete spiegarmi per favore come ci avete pensato? y<x?0:(y-x)/2-(y-x)/2%7+7;, Ho pensato che avrei dovuto prendere la differenza dividerlo a metà e quindi trovare il multiplo più vicino di 7. Come sei arrivato a questo?
Wade Tyler,

1
la stessa soluzione è sopra
username.ak

20

Python 2, 30 byte

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

3
@orlp Sì, penso che questo sia solo il modo di scrivere l'espressione. A meno che una soluzione ricorsiva non sia più breve, di cui dubito.
xnor

1
@xnor Non so quale chiedere, quindi chiederò a entrambi, potete spiegarmi per favore come ci avete pensato? y<x?0:(y-x)/2-(y-x)/2%7+7;, Ho pensato che avrei dovuto prendere la differenza dividerlo a metà e quindi trovare il multiplo più vicino di 7. Come sei arrivato a questo?
Wade Tyler,

2
@WadeTyler Stiamo cercando il più piccolo multiplo di 7 che è strettamente maggiore della metà della differenza. Per trovarlo da (b-a)/2, facciamo /7*7arrotondare per difetto al multiplo più vicino di 7, e poi +7per passare al successivo. Cioè, a meno che non otteniamo un numero negativo, nel qual caso stiamo vincendo comunque può fare solo 0. Prendere il maxcon 0 raggiunge questo. In parte stava anche modificando l'espressione ed eseguendola sui casi di test per vedere cosa funzionava.
xnor

2
@WadeTyler The /7*7è un tipo di espressione che si presenta abbastanza spesso nel golf da considerarlo un idioma. L'idea è che n/7prende la parola n/7, cioè trova quanti interi interi di 7adattamento all'interno n. Quindi, moltiplicando per lo 7porta a quel numero multiplo di 7.
xnor

1
@JackAmmo Questo esempio fornisce -2/7*7, e poiché la divisione del pavimento di Python arrotonda verso l'infinito negativo, 2/7è -1, quindi 7*-7+1è 0. Quindi, entrambe le parti danno 0, il che funziona bene.
xnor

13

Mathematica, 22 byte

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

Funzione pura con argomenti #e #2. Colpisce la massima profondità di ricorsione se la discrepanza è maggiore di 7*2^16 = 458752.

Spiegazione

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
Puoi aggiungere una spiegazione per tutto questo?
Pavel,

@Pavel Forse il tuo commento ha continuato a ricevere voti perché la mia spiegazione non era chiara?
ngenesi,

Ho pensato che andasse bene, ma poi conosco anche Mathematica.
Pavel,

@Pavel Bene, ora è meglio :)
ngenisis,

7

Gelatina , 9 byte

IH:7‘×7»0

Provalo online!

Come funziona

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

In realtà , 13 byte

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

Provalo online!

Utilizza la stessa max((b-a)/14*7+7,0)formula utilizzata da xnor e orlp.

Spiegazione:

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
In realtà , questa è un'ottima risposta
TrojanByAccident

Sento che il nome di questa lingua fosse intenzionale per far sembrare i titoli delle presentazioni come battute di testa: "Ragazzi, in realtà , sono 13 byte! Andiamo!"
Patrick Roberts,

@PatrickRoberts In realtà, è corretto.
Mego

6

Groovy, 41 37 byte

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

Questa è una chiusura senza nome. Grazie xnore orlpper la formula e James holdernessper aver segnalato un bug.

La soluzione precedente era utilizzata intdiv()per la divisione di numeri interi ma si comporta in modo diverso da quella //usata in Python.

Provalo qui!


5

Haskell, 30 24 byte

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

Un operatore infisso che prende per primo il numero di voti del tuo candidato preferito. Utilizza la stessa logica delle altre risposte di arrotondamento con /14*7+7.


2
Trovare il primo valore che soddisfa una condizione è utile per until:, a#b=until(\c->a+c>b-c)(+7)0o meglio a%b=until(>(b-a)/2)(+7)0. Sebbene una formula aritmetica sia ancora probabilmente più breve.
xnor

1
Nota che, a parte le alternative più brevi di xnor, head[...]è quasi sempre possibile accorciare[...]!!0
Laikoni,

@xnor: la tua fino a quando la soluzione non restituisce a Fractional a, non sono sicuro che sia accettato. Con divesso è però più breve, quindi grazie! Alla fine ha usato l'approccio matematico - e in effetti, era di altri due byte più corto di fino a quando. @Laikoni: bel golf, non lo sapevo, lo ricorderò.
Renzeee,

4

J, 15 byte

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

Molto interessante, stavo lavorando su un problema e pensavo di avere una soluzione, ma a quanto pare ho sbagliato. Oh bene. Provalo online! Ecco il risultato:

   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│
└─────────┴───┘

In futuro, utilizza TIO.run/nexus
Pavel l'

@Pavel No, tio.run è v2, nexus è lì solo per compatibilità v1
solo ASCII

@ ASCII-only tio.run ha una dichiarazione di non responsabilità in fondo che tutti i permalink generati potrebbero rompersi in futuro. Penso che dovrei renderlo più importante. Tranne che a scopo di test, nessuno dovrebbe usare v2 al momento.
Dennis,

@Dennis Oh, non lo sapevo! Modifica al più presto.
Conor O'Brien,

4

CJam, 13 12 15 byte

  • Salvataggio di un byte grazie a Martin Ender.
  • Aggiunti 3 byte grazie a Martin Ender.
  • Cambiato ]a [grazie a ETHproductions.

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

Ha palesemente rubato i metodi di orlp e xnor.

L'input è i due numeri separati da uno spazio: 100 123

Spiegazione:

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è solo 13. E puoi salvare un byte aumentando il valore prima della moltiplicazione invece di aggiungere 7 in seguito.
Martin Ender,

@JamesHolderness Il problema è che la divisione intera di Python lavora intorno a -inf mentre quella di CJam verso zero.
Martin Ender,

Potrei essere frainteso, ma pensavo m]fosse ceil; m[è piano.
ETHproductions

@ETHproductions Hai ragione, modificato.
Esolanging Fruit,

4

Excel VBA, 24 20 byte

Immediates funzione finestra che riceve l'input dalle cellule A1e B1uscite alla finestra VBE immediates.

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

Versione subroutine, 43 byte

accetta l'input b, ccome variante \ intero e stampa nella finestra di VBE immediatamente

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


3

PHP, 41 39 byte

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

accetta input dagli argomenti della riga di comando; corri con -r.

7 5 byte extra solo per gestire $ a> $ b: - /


3

Japt , 14 byte

V-U /2+7 f7 w0

Eseguilo qui!

Grazie ETHproductions per la rasatura di 3 byte!


1
Molto bella. faccetta un argomento e passa a un multiplo di quel numero, quindi penso che tu possa V-U /2+7 f7 w0salvarlo con tre byte.
ETHproductions

3

05AB1E , 9 byte

-14÷>7*0M

Provalo online!

Spiegazione

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

O una funzione corrispondente con lo stesso conteggio di byte che opera su una coppia di numeri

Î¥14÷>7*M

Provalo online!


2

Dyalog APL , 14 byte

Prende v1come argomento giusto e v2come argomento sinistro.

07×1+(⌊14÷⍨-)

0 ⌈ il massimo di zero e

7 × sette volte

1 + (... ) uno più ...

 il piano di

14 ÷⍨ un quattordicesimo di

- la differenza (tra gli argomenti)

ProvaAPL online!


2

Befunge, 19 byte

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

Provalo online!

Questo si basa su una formula leggermente diversa da quella usata da orlp e xnor, poiché l'interprete di riferimento di Befunge ha regole di arrotondamento diverse da Python. Befunge inoltre non ha il lusso di maxun'operazione.

Il calcolo di base è simile al seguente:

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

Esaminando il codice in modo più dettagliato:

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 byte

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

Questa è un'espressione lambda assegnabile a IntBinaryOperator.

a è il voto del tuo candidato, b è quello del tuo avversario.

java arrotonda per divisione con numeri interi positivi, quindi +7-a%7viene utilizzato per aumentare il valore al multiplo successivo di 7.


a->b->(b=(b-a)/14*7+7)>0?b:0è 3 byte più breve, ma mi piace un po 'di più il tuo approccio, quindi +1 da me. Quasi tutte le risposte fornite usano già max((b-a)/14*7+7,0)..
Kevin Cruijssen,

preferisco usare lambda che restituiscono direttamente il risultato. e sì, tutti hanno fatto la formula un po 'più breve, ma è stato così che ho ragionato sulla risposta prima di controllare tutti gli altri
Jack Ammo,

a->b->(b=(b-a)/14*7+7)>0?b:0restituisce direttamente anche il risultato: provalo qui. O vuoi dire che preferisci le lambda monodose rispetto alle lambda al curry; (a,b)->preferenza rispetto a->b->, anche se è più lunga?
Kevin Cruijssen,

metodo unico rispetto al curry, ma questa è solo una preferenza personale
Jack Ammo,

1

Rubino, 26 27 byte

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

Fondamentalmente lo stesso della soluzione Python di xnor e orlp, con una svolta (non è necessario aggiungere 7, a causa del modulo negativo, salva 1 byte in ruby, non so di python)

Nessuna svolta, la svolta era solo un brutto caso di dissonanza cognitiva. Dimenticalo. Veramente. :-)


1

Scala, 31 byte

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

La versione ternaria è più lunga di 2 byte


1

Noodel , 16 byte

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

Estrazione dell'equazione dalle risposte xor e orlp , ma poiché Noodel non ha una capacità massima ha dovuto aggirare il problema .

Provalo:)

Come funziona

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.