Hack các cuộc bầu cử


46

Bạn là một hacker chuyên nghiệp và ông chủ của bạn vừa ra lệnh cho bạn giúp ứng cử viên giành chiến thắng trong cuộc bầu cử sắp tới. Nhiệm vụ của bạn là thay đổi dữ liệu của máy bỏ phiếu để tăng kết quả của ứng cử viên.

Máy bỏ phiếu lưu trữ kết quả bỏ phiếu dưới dạng hai số nguyên: số phiếu bầu cho ứng cử viên của bạn ( v1) và số phiếu bầu cho đối thủ của họ ( v2).

Sau nhiều tuần nghiên cứu, bạn đã tìm thấy một lỗ hổng bảo mật trong hệ thống và bạn có thể tăng giá trị của v1một số nguyên xvà giảm giá trị v2tương tự x. Nhưng có một hạn chế, bạn phải giữ mã băm bảo mật không đổi:

  • mã băm bảo mật: (v1 + v2*2) modulo 7

Ngoài ra, giá trị xphải tối thiểu để những thay đổi của bạn có thể không được chú ý.

Chương trình của bạn nên chấp nhận làm đầu vào v1v2; nó sẽ xuất giá trị tối ưu cho xnhư vậy v1>v2.

Có một số trường hợp mà bạn không thể hack kết quả; bạn không phải xử lý chúng (điều này có thể dẫn đến các vấn đề với sếp của bạn, nhưng đó là một câu chuyện khác).

Các trường hợp thử nghiệm

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

4
Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Dennis

11
Ngoài ra, với các cử tri thân thiết: Đây là chủ đề hoàn hảo. Nếu bạn không thích nó, bạn có thể downvote nó.
Rɪᴋᴇʀ

10
Thật là một hàm băm an toàn!
Cruncher

Bạn có thể giả sử các đầu vào được theo sau bởi .0(Thích 100.0 123.0) không?
Trái cây Esolanging

Câu trả lời:


21

Python 2, 30 byte

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

ulà phiếu bầu của chúng tôi, tlà phiếu bầu của họ.


3
Không (t-u)/14*7thể (t-u)/2nào?
Conor O'Brien

2
Oh, đợi đã, đừng bận tâm, Py2 thực hiện phép chia số nguyên
Conor O'Brien

@ ConorO'Brien Không. Hãy xem xét t-u == 16. Sau đó
16/14

@orlp Tôi không biết nên hỏi ai, vì vậy tôi sẽ hỏi cả hai bạn, bạn có thể giải thích cho tôi bạn nghĩ như thế nào về điều này không? y<x?0:(y-x)/2-(y-x)/2%7+7;, Tôi nghĩ rằng tôi nên lấy phần chênh lệch chia làm đôi, và sau đó tìm bội số gần nhất của 7. Làm thế nào bạn đến được đây?
Wade Tyler

1
giải pháp tương tự ở trên
tên người

20

Python 2, 30 byte

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

3
@orlp Vâng, tôi nghĩ đây chỉ là cách viết biểu thức. Trừ khi một giải pháp đệ quy ngắn hơn, mà tôi nghi ngờ.
xnor

1
@xnor Tôi không biết nên hỏi ai, vì vậy tôi sẽ hỏi cả hai bạn, bạn có thể giải thích cho tôi bạn nghĩ như thế nào về điều này không? y<x?0:(y-x)/2-(y-x)/2%7+7;, Tôi nghĩ rằng tôi nên lấy phần chênh lệch chia làm đôi, và sau đó tìm bội số gần nhất của 7. Làm thế nào bạn đến được đây?
Wade Tyler

2
@WadeTyler Chúng tôi đang tìm bội số nhỏ nhất của 7, chênh lệch lớn hơn một nửa. Để tìm ra điều đó (b-a)/2, chúng tôi làm /7*7tròn xuống bội số gần nhất của 7, và sau đó +7đi lên tiếp theo. Đó là, trừ khi chúng ta sẽ nhận được một số âm, trong trường hợp chúng ta chiến thắng bằng mọi cách chỉ có thể làm 0. Lấy maxbằng 0 đạt được điều này. Một số trong đó cũng chỉ là điều chỉnh biểu thức và chạy nó trên các trường hợp thử nghiệm để xem những gì hoạt động.
xnor

2
@WadeTyler Đây /7*7là một loại biểu hiện thường xuất hiện đủ trong việc chơi golf mà tôi nghĩ về nó như một thành ngữ. Ý tưởng là n/7tầng của n/7, tức là tìm thấy có bao nhiêu bội số 7phù hợp bên trong n. Sau đó, nhân bằng cách 7đưa nó đến bội số đó 7.
xnor

1
@JackAmmo Ví dụ đó đưa ra -2/7*7, và vì các vòng phân chia sàn của Python hướng tới vô cực âm, 2/7là -1, do đó 7*-7+1là 0. Vì vậy, cả hai bên đều cho 0, hoạt động tốt.
xnor

13

Toán học, 22 byte

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

Hàm thuần túy với các đối số ##2. Lượt độ sâu đệ quy tối đa nếu chênh lệch lớn hơn 7*2^16 = 458752.

Giải trình

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
Bạn có thể thêm một lời giải thích cho tất cả điều này?
Pavel

@Pavel Có lẽ bình luận của bạn đã tiếp tục nhận được thông báo vì lời giải thích của tôi không rõ ràng?
ngenisis

Tôi nghĩ rằng nó ổn, nhưng một lần nữa tôi cũng biết Mathicala.
Pavel

@Pavel Tốt hơn bây giờ :)
ngenisis

7

Thạch , 9 byte

IH:7‘×7»0

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Trên thực tế , 13 byte

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

Hãy thử trực tuyến!

Sử dụng cùng một max((b-a)/14*7+7,0)công thức mà xnor và orlp sử dụng.

Giải trình:

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
Trên thực tế , đây là một câu trả lời tuyệt vời
TrojanByAccident

Tôi cảm thấy như tên của ngôn ngữ này là cố ý làm cho các tiêu đề đệ trình nghe giống như cú đấm: "Các bạn, thực ra , đây là 13 byte! Thôi nào!"
Patrick Roberts

@PatrickRoberts Thật ra, điều đó đúng.
Mego

6

Groovy, 41 37 byte

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

Đây là một đóng cửa không tên. Cảm ơn xnororlpcho công thức và James holdernesschỉ ra một lỗi.

Giải pháp trước đây được sử dụng intdiv()để phân chia số nguyên nhưng nó hoạt động khác với //sử dụng trong python.

Hãy thử nó ở đây!


5

Haskell, 30 24 byte

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

Một nhà điều hành infix lấy số phiếu của ứng cử viên ưa thích của bạn trước. Sử dụng logic tương tự như các câu trả lời khác của làm tròn với /14*7+7.


2
Tìm giá trị đầu tiên đáp ứng điều kiện là cách sử dụng tốt cho until: a#b=until(\c->a+c>b-c)(+7)0, hoặc tốt hơn a%b=until(>(b-a)/2)(+7)0. Mặc dù một công thức số học vẫn có khả năng ngắn hơn.
xnor

1
Lưu ý rằng ngoài các lựa chọn thay thế ngắn hơn của xnor head[...]hầu như luôn có thể được rút ngắn thành[...]!!0
Laikoni

@xnor: cho đến khi giải pháp của bạn trả về a Fractional a, tôi không chắc điều đó có được chấp nhận hay không. Với divnó là mặc dù ngắn hơn, vì vậy cảm ơn! Cuối cùng đã sử dụng phương pháp toán học - và thực tế, nó ngắn hơn hai byte cho đến khi. @Laikoni: chơi golf đẹp, không biết về điều đó, sẽ nhớ nó.
Renzeee

4

J, 15 byte

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

Thật thú vị, tôi đang giải quyết một vấn đề và tôi nghĩ rằng tôi đã có một giải pháp nhưng hóa ra tôi đã sai. Ồ tốt Hãy thử trực tuyến! Đây là kết quả:

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

Trong tương lai, vui lòng sử dụng TIO.run/nexus
Pavel

@Pavel Không, tio.run là v2, nexus chỉ có khả năng tương thích v1
ASCII-chỉ có

@ ASCII chỉ tio.run có từ chối trách nhiệm ở phía dưới mà tất cả các permalinks được tạo có thể bị phá vỡ trong tương lai. Tôi nghĩ rằng tôi nên làm cho điều đó nổi bật hơn. Ngoại trừ mục đích thử nghiệm, không ai nên sử dụng v2 tại thời điểm này.
Dennis

@Dennis Oh, tôi không biết! Sẽ chỉnh sửa càng sớm càng tốt.
Conor O'Brien

4

CJam, 13 12 15 byte

  • Đã lưu một byte nhờ Martin Ender.
  • Đã thêm 3 byte nhờ Martin Ender.
  • Thay đổi ]để [cảm ơn ETHproductions.

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

Đánh cắp một cách trắng trợn phương pháp của orlp và xnor.

Đầu vào là hai số cách nhau bởi một khoảng trắng: 100 123

Giải trình:

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.

Dchỉ là 13. Và bạn có thể lưu một byte bằng cách tăng giá trị trước khi nhân thay vì thêm 7 sau đó.
Martin Ender

@JamesHoldiness Vấn đề là phép chia số nguyên của Python hoạt động theo hướng -inf trong khi các vòng của CJam về 0.
Martin Ender

Tôi có thể hiểu lầm, nhưng tôi nghĩ m]là trần; m[là sàn nhà.
Sản phẩm ETH

@ETHproductions Bạn đã đúng, đã chỉnh sửa.
Esolanging Fruit

4

VBA Excel, 24 20 byte

Chức năng cửa sổ Immediates mà có đầu vào từ các tế bào A1B1và đầu ra cửa sổ VBE immediates.

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

Phiên bản chương trình con, 43 byte

lấy đầu vào b, clà biến thể \ số nguyên và in ra cửa sổ VBE ngay lập tức

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);

lấy đầu vào từ các đối số dòng lệnh; chạy với -r.

7 5 byte bổ sung chỉ để xử lý $ a> $ b: - /


3

Japt , 14 byte

V-U /2+7 f7 w0

Chạy nó ở đây!

Cảm ơn bạn ETHproductions đã cạo sạch 3 byte!


1
Rất đẹp. fchấp nhận một đối số và sàn cho bội số của số đó, vì vậy tôi nghĩ bạn có thể V-U /2+7 f7 w0để tiết kiệm ba byte.
Sản phẩm ETH


2

APL Dyalog , 14 byte

Đưa ra v1như là đối số phải và v2như là đối số trái.

07×1+(⌊14÷⍨-)

0 ⌈ tối đa bằng không và

7 × bảy lần

1 + (... ) một cộng ...

 sàn của

14 ÷⍨ một phần mười bốn

- sự khác biệt (giữa các đối số)

Dùng thử trực tuyến!


2

Befunge, 19 byte

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

Hãy thử trực tuyến!

Điều này phụ thuộc vào một công thức hơi khác với công thức được sử dụng bởi orlp và xnor, vì trình thông dịch tham chiếu Befunge có các quy tắc làm tròn khác với Python. Befunge cũng không có sự sang trọng của một maxhoạt động.

Tính toán cơ bản trông như thế này:

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

Kiểm tra mã chi tiết hơn:

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;

Đây là một biểu thức lambda được gán cho IntBinaryOperator.

a là phiếu bầu của ứng cử viên của bạn, b là đối thủ của bạn.

java làm tròn để phân chia với các số nguyên dương, vì vậy +7-a%7được sử dụng để tăng giá trị cho bội số tiếp theo của 7.


a->b->(b=(b-a)/14*7+7)>0?b:0ngắn hơn 3 byte, nhưng tôi thích cách tiếp cận của bạn hơn, vì vậy +1 từ tôi. Hầu như mọi câu trả lời đã được sử dụng max((b-a)/14*7+7,0)..
Kevin Cruijssen

tôi thích sử dụng lambdas trả về kết quả trực tiếp. và yeahb mọi người đã thực hiện công thức ngắn hơn một chút nhưng đây là cách tôi suy luận về câu trả lời trước khi kiểm tra tất cả mọi người
Jack Ammo

a->b->(b=(b-a)/14*7+7)>0?b:0không trả lại kết quả trực tiếp là tốt: Hãy thử nó ở đây. Hoặc bạn có nghĩa là bạn thích lambdas phương pháp duy nhất trên lambdas cà ri; (a,b)->ưu tiên hơn a->b->, mặc dù nó dài hơn?
Kevin Cruijssen

phương pháp duy nhất cho cà ri, nhưng đó chỉ là một sở thích cá nhân
Jack Ammo

1

Ruby, 26 27 byte

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

Về cơ bản giống như giải pháp Python của xnor và orlp, với một nút xoắn (không cần thêm 7, vì modulo âm, tiết kiệm 1 byte trong ruby, không biết về python)

Không có xoắn, xoắn chỉ là một trường hợp xấu của sự bất hòa nhận thức. Quên đi. Có thật không. :-)


1

Scala, 31 byte

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

Phiên bản ternary dài hơn 2 byte


1

Noodel , 16 byte

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

Kéo phương trình từ câu trả lời xororlp , nhưng vì Noodel không có khả năng tối đa phải làm việc xung quanh đó.

Thử nó:)

Làm thế nào nó hoạt động

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.