Zhakuj wybory

46

Jesteś profesjonalnym hakerem, a twój szef właśnie kazał ci pomóc kandydatowi wygrać nadchodzące wybory. Twoim zadaniem jest zmiana danych maszyn do głosowania, aby poprawić wyniki kandydata.

Maszyny do głosowania przechowują wyniki głosowania w postaci dwóch liczb całkowitych: liczby głosów dla twojego kandydata ( v1) i liczby głosów dla jego przeciwnika ( v2).

Po tygodniach badań odkryłeś lukę bezpieczeństwa w systemie i możesz zwiększyć wartość v1o liczbę całkowitą xi zmniejszyć wartość o v2to samo x. Ale jest ograniczenie, musisz utrzymywać stały kod skrótu bezpieczeństwa:

  • kod skrótu bezpieczeństwa: (v1 + v2*2) modulo 7

Ponadto wartość parametru xmusi być minimalna, aby zmiany mogły pozostać niezauważone.

Twój program powinien przyjąć jako wejście v1i v2; powinien wygenerować optymalną wartość dla xtego v1>v2.

Istnieją przypadki, w których nie można zhakować wyników; nie musisz sobie z nimi poradzić (może to prowadzić do problemów z szefem, ale to już inna historia).

Przypadki testowe

100,123 --> 14
47,23 --> 0
40,80 --> 21
62,62 --> 7
1134,2145 --> 511
Arnaud
źródło
4
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Dennis
11
Również dla bliskich wyborców: jest to całkowicie temat. Jeśli ci się nie podoba, możesz to zagłosować.
Rɪᴋᴇʀ
10
Cóż za bezpieczna funkcja skrótu!
Cruncher
Czy możesz założyć, że po danych wejściowych następuje .0(Lubię to 100.0 123.0)?
Esolanging Fruit

Odpowiedzi:

21

Python 2, 30 bajtów

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

uto nasze głosy, tto ich głosy.

orlp
źródło
3
Nie może (t-u)/14*7być po prostu (t-u)/2?
Conor O'Brien
2
Och, czekaj, nieważne, Py2 robi dzielenie liczb całkowitych
Conor O'Brien
@ ConorO'Brien Nope. Zastanów się t-u == 16. Następnie
16/14
@orlp Nie wiem, o który zapytać, więc zapytam was oboje, czy możecie mi wyjaśnić, jak o tym myśleliście? y<x?0:(y-x)/2-(y-x)/2%7+7;, Pomyślałem, że powinienem wziąć różnicę podziel ją na pół, a następnie znajdź najbliższą wielokrotność 7. Jak do tego doszedłeś?
Wade Tyler,
1
to samo rozwiązanie jest powyżej
username.ak
20

Python 2, 30 bajtów

lambda a,b:max((b-a)/14*7+7,0)
xnor
źródło
3
@orlp Tak, myślę, że to tylko sposób na napisanie wyrażenia. Chyba że rozwiązanie rekurencyjne jest krótsze, co wątpię.
xnor
1
@ xnor Nie wiem, o który zapytać, więc zapytam was oboje, czy możesz mi wyjaśnić, jak o tym pomyślałeś? y<x?0:(y-x)/2-(y-x)/2%7+7;, Pomyślałem, że powinienem wziąć różnicę podziel ją na pół, a następnie znajdź najbliższą wielokrotność 7. Jak do tego doszedłeś?
Wade Tyler,
2
@WadeTyler Szukamy najmniejszej wielokrotności 7, która jest znacznie większa niż połowa różnicy. Aby to ustalić (b-a)/2, /7*7zaokrąglamy w dół do najbliższej wielokrotności 7, a następnie +7przechodzimy do następnej w górę. To znaczy, chyba że otrzymalibyśmy liczbę ujemną, w którym to przypadku i tak wygrywamy, możemy po prostu zrobić 0. Biorąc maxz 0, osiągamy to. Niektóre z nich polegały również na poprawieniu wyrażenia i uruchomieniu go na testowych skrzynkach, aby zobaczyć, co działa.
xnor
2
@WadeTyler /7*7Jest to rodzaj wyrażenia, które pojawia się wystarczająco często w golfie, że uważam to za idiom. Chodzi o to, aby n/7zabrać głos n/7, tzn. Dowiedzieć się, ile całych wielokrotności 7dopasowania mieści się w środku n. Następnie pomnożenie przez 7powoduje, że liczba jest równa wielokrotności 7.
xnor
1
@JackAmmo Ten przykład podaje -2/7*7, a ponieważ podział podłogi w Pythonie zaokrągla się w kierunku ujemnej nieskończoności, 2/7wynosi -1, więc 7*-7+1wynosi 0. Tak więc obie strony dają 0, co działa dobrze.
xnor
13

Mathematica, 22 bajty

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

Czysta funkcja z argumentami #i #2. Uzyskuje maksymalną głębokość rekurencji, jeśli rozbieżność jest większa niż 7*2^16 = 458752.

Wyjaśnienie

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
źródło
4
Czy możesz wyjaśnić to wszystko?
Pavel
@Pavel Może twój komentarz wciąż zyskuje na popularności, ponieważ moje wyjaśnienie jest niejasne?
ngenisis
Myślałem, że to w porządku, ale z drugiej strony znam też matematykę.
Pavel
@Pavel Cóż, teraz jest lepiej :)
ngenisis
7

Galaretka , 9 bajtów

IH:7‘×7»0

Wypróbuj online!

Jak to działa

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
źródło
6

Właściwie 13 bajtów

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

Wypróbuj online!

Używa tej samej max((b-a)/14*7+7,0)formuły, której używają xnor i orlp.

Wyjaśnienie:

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
źródło
5
W rzeczywistości jest to świetna odpowiedź
TrojanByAccident
Wydaje mi się, że nazwa tego języka była celowa, aby tytuły zgłoszeń brzmiały jak poncz: „Chłopaki, właściwie to jest 13 bajtów!
Patrick Roberts,
@PatrickRoberts Właściwie to prawda.
Mego
6

Groovy, 41 37 bajtów

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

To jest nienazwane zamknięcie. Dzięki xnori orlpza formułę oraz James holdernessza wskazanie błędu.

Poprzednie rozwiązanie używane intdiv()do dzielenia liczb całkowitych, ale zachowuje się inaczej niż //w Pythonie.

Wypróbuj tutaj!

Gurupad Mamadapur
źródło
5

Haskell, 30 24 bajtów

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

Operator infix, który najpierw bierze liczbę głosów preferowanego kandydata. Używa tej samej logiki, co inne odpowiedzi zaokrąglania za pomocą /14*7+7.

Renzeee
źródło
2
Znalezienie pierwszej wartości spełniającej warunek jest dobrym zastosowaniem dla until: a#b=until(\c->a+c>b-c)(+7)0lub lepiej a%b=until(>(b-a)/2)(+7)0. Chociaż wzór arytmetyczny jest prawdopodobnie prawdopodobnie krótszy.
xnor
1
Zauważ, że oprócz krótszych alternatyw xnor head[...]można prawie zawsze skrócić do[...]!!0
Laikoni
@ xnor: twoje rozwiązanie dopóki nie zwróci a Fractional a, nie jestem pewien, czy to jest akceptowane. Ze divto jest jednak krótszy, więc dzięki! W końcu zastosował matematyczne podejście - i rzeczywiście był o kolejne dwa bajty krótszy niż przedtem. @Laikoni: fajna gra w golfa, nie wiedziałam o tym, zapamięta.
Renzeee
4

J, 15 bajtów

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

Trochę interesujące, pracowałem nad problemem i myślałem, że mam rozwiązanie, ale jak się okazuje, byłem w błędzie. No cóż. Wypróbuj online! Oto wynik:

   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
źródło
W przyszłości skorzystaj z TIO.run/nexus
Pavel
@Pavel Nie, tio.run to v2, nexus jest tylko dla kompatybilności z v1
tylko ASCII
@ Tylko na ASCII tio.run ma na dole zastrzeżenie, że wszystkie generowane permalinki mogą ulec awarii w przyszłości. Myślę, że powinienem uczynić to bardziej widocznym. Z wyjątkiem celów testowych, nikt nie powinien w tej chwili używać v2.
Dennis
@Dennis Oh, nie wiedziałem! Będzie edytować jak najszybciej.
Conor O'Brien
4

CJam, 13 12 15 bajtów

  • Oszczędność bajtu dzięki Martinowi Enderowi.
  • Dodano 3 bajty dzięki Martinowi Enderowi.
  • Zmieniono ]na [dzięki ETHproductions.

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

Rażąco ukradł metody Orlpa i Xnora.

Dane wejściowe to dwie liczby oddzielone spacją: 100 123

Wyjaśnienie:

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
źródło
Djest tylko 13. I możesz zapisać bajt, zwiększając wartość przed pomnożeniem zamiast dodawać 7 później.
Martin Ender
@JamesHolderness Problem polega na tym, że dzielenie liczb całkowitych Pythona działa zaokrągla w kierunku -inf, natomiast CJam zaokrągla w kierunku zera.
Martin Ender
Mogę być nieporozumieniem, ale myślałem, że m]jest sufit; m[jest podłoga.
ETHprodukcje
@ETHproductions Masz rację, edytowane.
Esolanging Fruit 12.01.17
4

Excel VBA, 24 20 bajtów

Immediates funkcji okna, które przyjmuje sygnał wejściowy z komórek A1i B1i wyjścia do okna Vbe immediates.

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

Wersja podprogramu, 43 bajty

pobiera dane wejściowe b, cjako wariant \ liczba całkowita i wypisuje do okna VBE natychmiast

Sub a(b,c):Debug.?Int((c-b)/14)*7+7:End Sub
Taylor Scott
źródło
3

PHP, 41 39 bajtów

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

pobiera dane wejściowe z argumentów wiersza poleceń; biegać z -r.

7 5 dodatkowych bajtów tylko do obsługi $ a> $ b: - /

Tytus
źródło
3

Japt , 14 bajtów

V-U /2+7 f7 w0

Uruchom tutaj!

Dziękujemy produktom ETH za zrzucenie 3 bajtów!

Oliver
źródło
1
Bardzo dobrze. fakceptuje argument i podłogi do wielokrotności tej liczby, więc myślę, że możesz tak V-U /2+7 f7 w0zapisać trzy bajty.
ETHproductions
3

05AB1E , 9 bajtów

-14÷>7*0M

Wypróbuj online!

Wyjaśnienie

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

Lub odpowiednia funkcja z tą samą liczbą bajtów działająca na parze liczb

Î¥14÷>7*M

Wypróbuj online!

Emigna
źródło
2

Dyalog APL , 14 bajtów

Przyjmuje v1jako prawy argument i v2lewy argument.

07×1+(⌊14÷⍨-)

0 ⌈ maksymalnie zero i

7 × siedem razy

1 + (... ) jeden plus ...

 podłoga

14 ÷⍨ czternasta z

- różnica (między argumentami)

Wypróbuj APL online!

Adám
źródło
2

Befunge, 19 bajtów

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

Wypróbuj online!

Opiera się to na nieco innej formule niż ta używana przez orlp i xnor, ponieważ interpreter referencyjny Befunge ma inne reguły zaokrąglania niż Python. Befunge również nie ma luksusu maxoperacji.

Podstawowe obliczenia wyglądają następująco:

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

Szczegółowy przegląd kodu:

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
źródło
2

JavaScript (ES6), 31 bajtów

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

darrylyeo
źródło
2

Java 8, 31 bajtów

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

Jest to wyrażenie lambda, które można przypisać IntBinaryOperator.

a to głosy twojego kandydata, b to twój przeciwnika.

java zaokrągla w dół dla dzielenia z dodatnimi liczbami całkowitymi, więc +7-a%7służy do zwiększania wartości do następnej wielokrotności 7.

Jack Ammo
źródło
a->b->(b=(b-a)/14*7+7)>0?b:0jest 3 bajty krótszy, ale bardziej podoba mi się twoje podejście, więc daj +1 ode mnie. Prawie każda udzielona odpowiedź już wykorzystuje max((b-a)/14*7+7,0)...
Kevin Cruijssen,
Wolę używać lambdas, które zwracają wynik bezpośrednio. i tak, wszyscy zrobili formułę nieco krócej, ale tak właśnie rozumowałem odpowiedź przed sprawdzeniem wszystkich innych
Jack Ammo
a->b->(b=(b-a)/14*7+7)>0?b:0zwraca również wynik bezpośrednio: Wypróbuj tutaj. A może masz na myśli, że wolisz lambdy jednoprocesowe od curd lamb; (a,b)->preferencja ponad a->b->, nawet jeśli jest dłuższa?
Kevin Cruijssen
jedna metoda zamiast curry, ale to tylko osobiste preferencje
Jack Ammo
1

Rubin, 26 27 bajtów

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

Zasadniczo to samo co rozwiązanie Python xnora i orlpa, z niespodzianką (nie trzeba dodawać 7, z powodu ujemnego modulo, zapisuje 1 bajt w ruby, nie wiem o python)

Bez skrętu, skręt był po prostu złym przypadkiem dysonansu poznawczego. Zapomnij o tym. Naprawdę. :-)

GB
źródło
1

Scala, 31 bajtów

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

Wersja trójskładnikowa jest dłuższa o 2 bajty

jaxad0127
źródło
1

Noodel , 16 bajtów

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

Wyciągnął równanie z XOR i orlp odpowiedzi, ale ponieważ Noodel nie mają max zdolność musiał obejść to.

Spróbuj:)

Jak to działa

⁻÷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
źródło