Hacken Sie die Wahlen


46

Sie sind ein professioneller Hacker und Ihr Chef hat Ihnen gerade befohlen, einem Kandidaten zu helfen, eine bevorstehende Wahl zu gewinnen. Ihre Aufgabe ist es, die Wahlmaschinendaten zu ändern, um die Ergebnisse des Kandidaten zu verbessern.

Abstimmungsgeräte speichern Abstimmungsergebnisse als zwei ganze Zahlen: die Anzahl der Stimmen für Ihren Kandidaten ( v1) und die Anzahl der Stimmen für seinen Gegner ( v2).

Nach wochenlangen Recherchen haben Sie eine Sicherheitslücke im System gefunden und können den Wert von v1um eine ganze Zahl erhöhen xund den Wert von v2um dieselbe verringern x. Es gibt jedoch eine Einschränkung: Sie müssen den Sicherheits-Hash-Code konstant halten:

  • Sicherheits-Hash-Code: (v1 + v2*2) modulo 7

Außerdem muss der Wert für xminimal sein, damit Ihre Änderungen unbemerkt bleiben können.

Ihr Programm sollte als Eingabe akzeptieren v1und v2; es sollte den optimalen Wert für xso ausgeben v1>v2.

In einigen Fällen können Sie die Ergebnisse nicht hacken. Sie müssen nicht damit umgehen (dies kann zu Problemen mit Ihrem Chef führen, aber das ist eine andere Geschichte).

Testfälle

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

4
Kommentare sind nicht für eine längere Diskussion gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Dennis

11
Auch zu den nahen Wählern: Dies ist perfekt zum Thema. Wenn es dir nicht gefällt, kannst du es ablehnen.
Freitag,

10
Was für eine sichere Hash-Funktion!
Cruncher

Können Sie davon ausgehen, dass die Eingaben von .0(Gefällt mir) gefolgt werden 100.0 123.0?
Esolanging Fruit

Antworten:


21

Python 2, 30 Bytes

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

uist unsere Stimmen, tist ihre Stimmen.


3
Könnte nicht (t-u)/14*7einfach sein (t-u)/2?
Conor O'Brien

2
Oh, warte, vergiss es, Py2 macht Integer Division
Conor O'Brien

@ ConorO'Brien Nein. Überlegen Sie t-u == 16. Dann ist
16/14

@orlp Ich weiß nicht, wen ich fragen soll, also werde ich euch beide fragen, könnt ihr mir bitte erklären, wie ihr das gedacht habt? y<x?0:(y-x)/2-(y-x)/2%7+7;, Ich dachte, ich sollte die Differenz in zwei Hälften teilen und dann das nächste Vielfache von 7 finden. Wie bist du dazu gekommen?
Wade Tyler

1
Die gleiche Lösung ist oben
username.ak

20

Python 2, 30 Bytes

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

3
@orlp Ja, ich denke, das ist nur der Weg, um den Ausdruck zu schreiben. Es sei denn, eine rekursive Lösung ist kürzer, was ich bezweifle.
Xnor

1
@xnor Ich weiß nicht, wen ich fragen soll, also werde ich euch beide fragen, könnt ihr mir bitte erklären, wie ihr das gedacht habt? y<x?0:(y-x)/2-(y-x)/2%7+7;, Ich dachte, ich sollte die Differenz in zwei Hälften teilen und dann das nächste Vielfache von 7 finden. Wie bist du dazu gekommen?
Wade Tyler

2
@WadeTyler Wir suchen das kleinste Vielfache von 7, das genau die Hälfte der Differenz übersteigt. Um dies herauszufinden, runden (b-a)/2wir /7*7auf das nächste Vielfache von 7 ab und +7gehen dann zum nächsten aufwärts. Das heißt, es sei denn, wir würden eine negative Zahl erhalten. In diesem Fall können wir trotzdem eine 0 machen. Wenn wir die maxmit 0 nehmen, wird dies erreicht. Einiges davon bestand auch darin, den Ausdruck zu optimieren und ihn in den Testfällen auszuführen, um zu sehen, was funktioniert.
Xnor

2
@WadeTyler The /7*7ist eine Art Ausdruck, der beim Golfen oft genug auftaucht, so dass ich ihn als eine Redewendung betrachte. Die Idee ist, das n/7Wort zu ergreifen n/7, dh herauszufinden, wie viele ganze Vielfache in das Wort 7passen n. Dann 7bringt das Multiplizieren mit auf dieses Vielfache von 7.
Xnor

1
@JackAmmo Dieses Beispiel gibt an -2/7*7, und da die Python- Bodenteilung in Richtung negative Unendlichkeit rundet, 2/7ist -1, also 7*-7+10. Also geben beide Seiten 0, was gut funktioniert.
Xnor

13

Mathematica, 22 Bytes

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

Reine Funktion mit Argumenten #und #2. Erreicht die maximale Rekursionstiefe, wenn die Abweichung größer als ist 7*2^16 = 458752.

Erläuterung

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
Können Sie eine Erklärung für all dies hinzufügen?
Pavel

@Pavel Vielleicht hat dein Kommentar weiterhin Stimmen bekommen, weil meine Erklärung unklar war?
Genisis

Ich fand es in Ordnung, kenne aber auch Mathematica.
Pavel

@Pavel Nun, es ist jetzt besser :)
Genisis

7

Gelee , 9 Bytes

IH:7‘×7»0

Probieren Sie es online!

Wie es funktioniert

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

Eigentlich 13 Bytes

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

Probieren Sie es online!

Verwendet dieselbe max((b-a)/14*7+7,0)Formel wie xnor und orlp.

Erläuterung:

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
Tatsächlich ist dies eine großartige Antwort
TrojanByAccident

Ich habe das Gefühl, dass der Name dieser Sprache beabsichtigt war, damit die Einsendungstitel wie Pointen klingen: "Leute, das sind tatsächlich 13 Bytes! Komm schon!"
Patrick Roberts

@PatrickRoberts Eigentlich ist das richtig.
Mego

6

Groovy, 41 37 Bytes

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

Dies ist eine namenlose Schließung. Danke an xnorundorlp für die Formel und James holdernessfür den Hinweis auf einen Fehler.

Die vorherige Lösung, die intdiv()für die Ganzzahldivision verwendet wurde, verhält sich jedoch anders als// in Python.

Probieren Sie es hier aus!


5

Haskell, 30 24 Bytes

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

Ein Infix-Operator, der zuerst die Anzahl der Stimmen Ihres bevorzugten Kandidaten erfasst. Verwendet die gleiche Logik wie die anderen Antworten zum Runden mit /14*7+7.


2
Das Ermitteln des ersten Werts, der eine Bedingung erfüllt, ist eine gute Verwendung für until: a#b=until(\c->a+c>b-c)(+7)0oder besser a%b=until(>(b-a)/2)(+7)0. Obwohl eine arithmetische Formel wahrscheinlich immer noch kürzer ist.
Xnor

1
Beachten Sie, dass sich die kürzeren Alternativen von xnor head[...]fast immer auf[...]!!0
Laikoni

@xnor: deine till-lösung gibt a zurück Fractional a, ich bin nicht sicher, ob das akzeptiert wird. Damit ist dives zwar kürzer, also danke! Verwendete schließlich den mathematischen Ansatz - und tatsächlich waren es noch zwei Bytes kürzer als bis. @Laikoni: Nettes Golfen, wusste nichts davon, werde mich daran erinnern.
Renzeee

4

J, 15 Bytes

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

Ein bisschen interessant, ich habe an einem Problem gearbeitet und dachte, ich hätte eine Lösung, aber wie sich herausstellte, habe ich mich geirrt. Naja. Probieren Sie es online! Hier ist das Ergebnis:

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

Bitte benutzen Sie in Zukunft TIO.run/nexus
Pavel

@Pavel Nein, tio.run ist v2, Nexus gibt es nur aus Gründen der v1-Kompatibilität
ASCII

@ Nur ASCII tio.run hat unten einen Haftungsausschluss, der besagt, dass alle generierten Permalinks in Zukunft möglicherweise nicht mehr funktionieren . Ich denke, ich sollte das bekannter machen. Außer zu Testzwecken sollte derzeit niemand v2 verwenden.
Dennis

@ Tennis Oh, ich wusste es nicht! Wird so schnell wie möglich bearbeitet.
Conor O'Brien

4

CJam, 13 12 15 Bytes

  • Dank Martin Ender ein Byte gespeichert.
  • 3 Bytes dank Martin Ender hinzugefügt.
  • Geändert , ]um [dank ETHproductions.

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

Offensichtlich Orlp und Xnor Methoden gestohlen.

Eingabe sind die beiden durch ein Leerzeichen getrennten Zahlen: 100 123

Erläuterung:

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.

Dist nur 13. Und Sie können ein Byte speichern, indem Sie den Wert vor der Multiplikation erhöhen, anstatt danach 7 zu addieren.
Martin Ender

@JamesHolderness Das Problem ist, dass die Ganzzahldivision von Python gegen -inf rundet, wohingegen die von CJam gegen Null rundet.
Martin Ender

Ich mag missverstehen, aber ich dachte, es m]ist ein Höchstbetrag. m[ist Boden.
ETHproductions

@ETHproductions Du hast Recht, bearbeitet.
Esolanging Fruit

4

Excel VBA, 24 20 Bytes

Immediates Fensterfunktion , die eine Eingabe von Zellen stattfindet A1und B1und gibt an den Fenstern immediates VBE.

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

Unterprogrammversion, 43 Bytes

Übernimmt die Eingabe b, cals variant \ integer und druckt in das VBE-Direktfenster

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


3

PHP, 41 39 Bytes

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

Nimmt Eingaben von Befehlszeilenargumenten entgegen. renn mit -r.

7 5 zusätzliche Bytes, nur um $ a> $ b zu handhaben: - /


3

Japt , 14 Bytes

V-U /2+7 f7 w0

Führe es hier aus!

Vielen Dank an ETHproductions für das Abschneiden von 3 Bytes!


1
Sehr schön. fAkzeptiert ein Argument und Stockwerke bis zu einem Vielfachen dieser Zahl, so kann man meiner Meinung V-U /2+7 f7 w0nach drei Bytes sparen.
ETHproductions


2

Dyalog APL , 14 Bytes

Nimmt v1als rechtes Argument und v2als linkes Argument.

07×1+(⌊14÷⍨-)

0 ⌈ das Maximum von Null und

7 × sieben Mal

1 + (... ) eins plus ...

 der Boden von

14 ÷⍨ ein vierzehntel von

- der Unterschied (zwischen den Argumenten)

TryAPL online!


2

Befunge, 19 Bytes

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

Probieren Sie es online!

Dies basiert auf einer etwas anderen Formel als die von orlp und xnor verwendete, da der Befunge-Referenzinterpreter andere Rundungsregeln für Python verwendet. Befunge hat auch nicht den Luxus einesmax Operation.

Die Grundberechnung sieht folgendermaßen aus:

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

Den Code genauer untersuchen:

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 Bytes

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

Dies ist ein Lambda-Ausdruck, dem zugewiesen werden kann IntBinaryOperator .

a ist die Stimme deines Kandidaten, b die deines Gegners.

java rundet für die Division mit positiven ganzen Zahlen ab und +7-a%7wird verwendet, um den Wert auf das nächste Vielfache von 7 zu erhöhen.


a->b->(b=(b-a)/14*7+7)>0?b:0ist 3 Bytes kürzer, aber ich mag deine Herangehensweise mehr, also +1 von mir. Fast jede Antwort verwendet bereits max((b-a)/14*7+7,0)..
Kevin Cruijssen

Ich bevorzuge die Verwendung von Lambdas, die das Ergebnis direkt zurückgeben. und ja, jeder hat die Formel ein bisschen kürzer gemacht, aber so habe ich über die Antwort nachgedacht, bevor ich alle anderen überprüft habe
Jack Ammo

a->b->(b=(b-a)/14*7+7)>0?b:0gibt das Ergebnis auch direkt zurück: Probieren Sie es hier aus. Oder meinen Sie, Sie bevorzugen Lambdas mit einer einzigen Methode gegenüber dem Curry von Lambdas? (a,b)->Vorzug vor a->b->, obwohl es länger ist?
Kevin Cruijssen

einzelne Methode gegenüber dem Currying, aber das ist nur eine persönliche Präferenz
Jack Ammo

1

Ruby, 26 27 Bytes

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

Grundsätzlich das Gleiche wie die Python-Lösung von xnor und orlp, mit einem Twist (keine Notwendigkeit, 7 zu addieren, da negatives Modulo 1 Byte in Ruby spart, keine Ahnung von Python)

Keine Verdrehung, die Verdrehung war nur ein schlimmer Fall von kognitiver Dissonanz. Vergiss es. Ja wirklich. :-)


1

Scala, 31 Bytes

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

Die ternäre Version ist 2 Bytes länger


1

Nudel , 16 Bytes

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

Gezogen Gleichung von xor und orlp Antworten, aber da noodel keinen max Fähigkeit hat mußte das Umgehen.

Versuch es:)

Wie es funktioniert

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.