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

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.


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)

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

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.

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

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!


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.


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

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.

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


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: - /


3

Japt , 14 bajtów

V-U /2+7 f7 w0

Uruchom tutaj!

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


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!


2

Dyalog APL , 14 bajtów

Przyjmuje v1jako prawy argument i v2lewy argument.

0⌈7×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!


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.



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.


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ę. :-)


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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.