Hackear as eleições

46

Você é um hacker profissional e seu chefe acabou de ordenar que você ajude um candidato a vencer uma próxima eleição. Sua tarefa é alterar os dados das urnas para aumentar os resultados do candidato.

As máquinas de votação armazenam os resultados da votação como dois números inteiros: o número de votos para seu candidato ( v1) e o número de votos para seu oponente ( v2).

Após semanas de pesquisa, você encontrou uma falha de segurança no sistema e pode aumentar o valor de v1por um número inteiro xe diminuir o valor de v2pelo mesmo x. Mas há uma restrição, você precisa manter o código de hash de segurança constante:

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

Além disso, o valor de xdeve ser mínimo para que suas alterações possam passar despercebidas.

Seu programa deve aceitar como entrada v1e v2; deve gerar o valor ideal para xisso v1>v2.

Existem alguns casos em que você não pode hackear os resultados; você não precisa lidar com eles (isso pode levar a problemas com seu chefe, mas isso é outra história).

Casos de teste

100,123 --> 14
47,23 --> 0
40,80 --> 21
62,62 --> 7
1134,2145 --> 511
Arnaud
fonte
4
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Dennis
11
Além disso, para os eleitores próximos: isso é perfeitamente tópico. Se você não gostar, poderá votar novamente.
Rɪᴋᴇʀ
10
Que função segura de hash!
Cruncher
Você pode assumir que as entradas são seguidas por .0(Curtir 100.0 123.0)?
Esolanging Fruit

Respostas:

21

Python 2, 30 bytes

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

usão nossos votos, tsão seus votos.

orlp
fonte
3
Não poderia (t-u)/14*7ser justo (t-u)/2?
Conor O'Brien
2
Oh, espera, deixa pra lá, Py2 faz inteiro divisão
Conor O'Brien
@ ConorO'Brien Não. Considere t-u == 16. Então
16/14
@ orlp Eu não sei qual perguntar, então eu vou perguntar para vocês dois, vocês podem me explicar como vocês acharam isso? y<x?0:(y-x)/2-(y-x)/2%7+7;, Pensei em dividir a diferença ao meio e depois encontrar o múltiplo mais próximo de 7. Como você chegou a isso?
Wade Tyler
1
a mesma solução está acima
username.ak
20

Python 2, 30 bytes

lambda a,b:max((b-a)/14*7+7,0)
xnor
fonte
3
@ orlp Sim, acho que este é apenas o caminho para escrever a expressão. A menos que uma solução recursiva seja mais curta, duvido.
xnor
1
@ xnor Eu não sei qual perguntar, então eu vou perguntar para vocês dois, vocês podem me explicar como você achou isso? y<x?0:(y-x)/2-(y-x)/2%7+7;, Pensei em dividir a diferença ao meio e depois encontrar o múltiplo mais próximo de 7. Como você chegou a isso?
Wade Tyler
2
@WadeTyler Estamos procurando o menor múltiplo de 7 estritamente maior que a metade da diferença. Para descobrir isso (b-a)/2, fazemos /7*7arredondamentos para o múltiplo mais próximo de 7 e, em seguida , subimos +7para o próximo. Ou seja, a menos que obtivéssemos um número negativo, nesse caso, estamos ganhando de qualquer maneira max. Algumas delas também estavam apenas ajustando a expressão e executando-a nos casos de teste para ver o que funciona.
xnor
2
@WadeTyler The /7*7é um tipo de expressão que aparece com bastante frequência no golfe e que eu penso nisso como uma expressão idiomática. A idéia é a n/7tomada do chão n/7, ou seja, encontra quantos múltiplos inteiros de 7ajuste dentro n. Então, multiplicar por 7traz para esse número múltiplo de 7.
precisa saber é
1
@JackAmmo Esse exemplo fornece -2/7*7e, como a divisão de piso do Python se aproxima do infinito negativo, 2/7é -1, o mesmo 7*-7+1é 0. Portanto, os dois lados dão 0, o que funciona bem.
xnor 14/01
13

Mathematica, 22 bytes

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

Função pura com argumentos #e #2. Atinge a profundidade máxima de recursão se a discrepância for maior que 7*2^16 = 458752.

Explicação

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
fonte
4
Você pode adicionar uma explicação para tudo isso?
Pavel
@Pavel Talvez o seu comentário tenha continuado a ser votado porque minha explicação não era clara?
Ngenisis
Eu pensei que estava tudo bem, mas, novamente, eu também conheço o Mathematica.
Pavel
@Pavel Bem, é melhor agora :)
ngenisis
7

Geléia , 9 bytes

IH:7‘×7»0

Experimente online!

Como 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
fonte
6

Na verdade , 13 bytes

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

Experimente online!

Usa a mesma max((b-a)/14*7+7,0)fórmula que xnor e orlp usam.

Explicação:

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
fonte
5
Na verdade , esta é uma ótima resposta
TrojanByAccident
Eu sinto que o nome desse idioma foi intencional para fazer com que os títulos das submissões soassem como punchlines: "Pessoal, na verdade , são 13 bytes! Vamos lá!"
Patrick Roberts
@PatrickRoberts Na verdade, isso está correto.
Mego
6

Groovy, 41 37 bytes

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

Este é um fechamento sem nome. Obrigado xnore orlppela fórmula e James holdernesspor apontar um bug.

A solução anterior usada intdiv()para divisão inteira, mas se comporta de maneira diferente da //usada em python.

Experimente aqui!

Gurupad Mamadapur
fonte
5

Haskell, 30 24 bytes

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

Um operador de infix recebendo o número de votos do seu candidato preferido primeiro. Usa a mesma lógica que as outras respostas de arredondamento /14*7+7.

Renzeee
fonte
2
Encontrar o primeiro valor que atenda a uma condição é um bom uso para until: a#b=until(\c->a+c>b-c)(+7)0ou melhor a%b=until(>(b-a)/2)(+7)0. Embora uma fórmula aritmética ainda seja provavelmente mais curta.
xnor
1
Observe que, além das alternativas mais curtas do head[...][...]!!0
xnor
@ xnor: sua solução até retorna um Fractional a, não tenho certeza se isso é aceito. Com divele é mais curto, então obrigado! Eventualmente, usou a abordagem matemática - e, de fato, era mais dois bytes menor que até o momento. @Laikoni: bom golfe, não sabia sobre isso, vai se lembrar.
Renzeee 12/01
4

J, 15 bytes

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

Meio interessante, eu estava trabalhando em um problema e achei que tinha uma solução, mas, no fim, estava errado. Ah bem. Experimente online! Aqui está o 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
fonte
No futuro, use TIO.run/nexus
Pavel
@Pavel Não, o tio.run é v2, o nexus existe apenas para compatibilidade com v1
ASCII-only
@ ASCII-only tio.run tem um aviso na parte inferior de que todos os links permanentes gerados poderão ser interrompidos no futuro. Eu acho que deveria tornar isso mais proeminente. Exceto para fins de teste, ninguém deve usar a v2 no momento.
Dennis
@ Dennis Oh, eu não sabia! Editará o mais cedo possível.
Conor O'Brien
4

CJam, 13 12 15 bytes

  • Guardou um byte graças a Martin Ender.
  • Adicionado 3 bytes graças a Martin Ender.
  • Alterado ]para [graças a ETHproductions.

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

Roubou descaradamente os métodos orlp e xnor.

Entrada são os dois números separados por um espaço: 100 123

Explicação:

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.
Esolanging Fruit
fonte
Dé apenas 13. E você pode salvar um byte, incrementando o valor antes da multiplicação, em vez de adicionar 7 depois.
Martin Ender
@JamesHolderness O problema é que a divisão inteira do Python trabalha em direção a -inf, enquanto a de CJam em direção a zero.
Martin Ender
Posso estar entendendo mal, mas pensei que m]fosse teto; m[é andar.
ETHproductions
@ETHproductions Você está certo, editado.
Esolanging Fruit
4

Excel VBA, 24 20 bytes

Função Immediates janela que recebe a entrada a partir de células A1e B1e saídas para a janela do VBE imediatos.

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

Versão da sub-rotina, 43 bytes

recebe a entrada b, ccomo variante \ inteiro e imprime na janela do VBE imediatamente

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

PHP, 41 39 bytes

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

recebe entrada dos argumentos da linha de comando; corra com -r.

7 5 bytes extras apenas para manipular $ a> $ b: - /

Titus
fonte
3

Japonês , 14 bytes

V-U /2+7 f7 w0

Execute-o aqui!

Obrigado ETHproductions por reduzir 3 bytes!

Oliver
fonte
1
Muito agradável. faceita um argumento e usa um múltiplo desse número, então acho que você pode V-U /2+7 f7 w0salvar três bytes.
ETHproductions
3

05AB1E , 9 bytes

-14÷>7*0M

Experimente online!

Explicação

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

Ou uma função correspondente com a mesma contagem de bytes operando em um par de números

Î¥14÷>7*M

Experimente online!

Emigna
fonte
2

Dyalog APL , 14 bytes

Toma v1como argumento certo e v2como argumento esquerdo.

07×1+(⌊14÷⍨-)

0 ⌈ o máximo de zero e

7 × sete vezes

1 + (... ) mais um ...

 o chão de

14 ÷⍨ um décimo quarto de

- a diferença (entre os argumentos)

TryAPL online!

Adão
fonte
2

Befunge, 19 bytes

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

Experimente online!

Isso depende de uma fórmula ligeiramente diferente da usada pelo orlp e xnor, já que o interpretador de referência Befunge possui regras de arredondamento diferentes para o Python. Befunge também não tem o luxo de uma maxoperação.

O cálculo básico é assim:

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

Examinando o código em mais detalhes:

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
fonte
2

JavaScript (ES6), 31 bytes

(a,b,c=(b-a)/14|0)=>c>0?c*7+7:0

darrylyeo
fonte
2

Java 8, 31 bytes

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

Esta é uma expressão lambda atribuível a IntBinaryOperator.

a é o voto do seu candidato, b é o seu oponente.

java arredonda para baixo para divisão com números inteiros positivos, então +7-a%7é usado para aumentar o valor para o próximo múltiplo de 7.

Jack Ammo
fonte
a->b->(b=(b-a)/14*7+7)>0?b:0é 3 bytes mais curto, mas eu meio que gosto mais da sua abordagem, então +1 de mim. Quase todos os resposta já dada usa max((b-a)/14*7+7,0)..
Kevin Cruijssen
Eu prefiro usar lambdas que retornam o resultado diretamente. e yeahb todos fizessem a fórmula um pouco mais curto, mas isso foi como eu fundamentado sobre a resposta antes de verificar elses todos
Jack Ammo
a->b->(b=(b-a)/14*7+7)>0?b:0também retorna o resultado diretamente: tente aqui. Ou você quer dizer que prefere lambdas de método único ao invés de curdar lambdas; (a,b)->preferência sobre a->b->, mesmo que seja mais longo?
21717 Kevin Murrijssen 13:17
método único sobre currying, mas isso é apenas uma preferência pessoal
Jack Ammo
1

Ruby, 26 27 bytes

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

Basicamente, o mesmo que as soluções Python do xnor e do orlp, com um toque (não é necessário adicionar 7, por causa do módulo negativo, economiza 1 byte em ruby, não sabe sobre python)

Sem reviravoltas, a reviravolta foi apenas um caso grave de dissonância cognitiva. Esqueça. Realmente. :-)

GB
fonte
1

Scala, 31 bytes

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

A versão ternária é 2 bytes mais longa

jaxad0127
fonte
1

Noodel , 16 bytes

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

A equação extraída das respostas xor e orlp , mas como Noodel não tem uma capacidade máxima, foi necessário contornar isso.

Tente:)

Como 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
fonte