แฮ็คการเลือกตั้ง


46

คุณเป็นแฮ็กเกอร์มืออาชีพและหัวหน้าของคุณเพิ่งสั่งให้คุณช่วยผู้สมัครที่ชนะการเลือกตั้ง งานของคุณคือแก้ไขข้อมูลเครื่องลงคะแนนเพื่อเพิ่มผลลัพธ์ของผู้สมัคร

เครื่องลงคะแนนจะเก็บผลการลงคะแนนเป็นจำนวนเต็มสองจำนวน: จำนวนคะแนนเสียงสำหรับผู้สมัครของคุณ ( v1) และจำนวนคะแนนโหวตของฝ่ายตรงข้าม ( v2)

หลังจากสัปดาห์ที่ผ่านมาของการวิจัยคุณได้พบหลุมการรักษาความปลอดภัยในระบบและคุณสามารถเพิ่มมูลค่าของv1โดยจำนวนเต็มxและลดค่าของโดยเดียวกันv2 xแต่มีข้อ จำกัด คุณต้องรักษาความปลอดภัยรหัสแฮชอย่างต่อเนื่อง:

  • รหัสแฮชการรักษาความปลอดภัย: (v1 + v2*2) modulo 7

นอกจากนี้ค่าxต้องน้อยที่สุดเพื่อให้การเปลี่ยนแปลงของคุณไม่มีการสังเกต

โปรแกรมของคุณควรยอมรับว่าเป็นอินพุตv1และv2; ควรเอาท์พุทค่าที่ดีที่สุดสำหรับการเพื่อให้xv1>v2

มีบางกรณีที่คุณไม่สามารถแฮ็คผลลัพธ์ได้ คุณไม่ต้องจัดการกับพวกเขา (สิ่งนี้อาจนำไปสู่ปัญหากับเจ้านายของคุณ แต่นั่นเป็นอีกเรื่องหนึ่ง)

กรณีทดสอบ

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

4
ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Dennis

11
นอกจากนี้สำหรับผู้ลงคะแนนปิด: นี่เป็นหัวข้อที่สมบูรณ์แบบ หากคุณไม่ชอบคุณสามารถลงคะแนนได้
Rɪᴋᴇʀ

10
ฟังก์ชั่นแฮชที่ปลอดภัย!
Cruncher

คุณสามารถสันนิษฐานได้ว่าอินพุตนั้นตามมา.0(ชอบ100.0 123.0)?
แยกผลไม้

คำตอบ:


21

Python 2, 30 ไบต์

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

uคือคะแนนของเราtคือคะแนนของพวกเขา


3
เป็นไปไม่(t-u)/14*7ได้(t-u)/2หรอ
Conor O'Brien

2
โอ้รอไม่เป็นไร Py2 ทำหารจำนวนเต็ม
Conor O'Brien

@ ConorO'Brien Nope t-u == 16พิจารณา จากนั้น
16/14

@ หรือฉันไม่รู้ว่าจะถามแบบไหนฉันจะถามคุณทั้งสองช่วยอธิบายหน่อยได้ไหมว่าคุณคิดยังไง? y<x?0:(y-x)/2-(y-x)/2%7+7;ฉันคิดว่าฉันควรแยกความแตกต่างออกเป็นสองส่วนแล้วหาผลคูณที่ใกล้ที่สุดของ 7 คุณมาถึงสิ่งนี้ได้อย่างไร
ลุยไทเลอร์

1
โซลูชันเดียวกันด้านบน
username.ak

20

Python 2, 30 ไบต์

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

3
@ หรือใช่ฉันคิดว่านี่เป็นเพียงวิธีในการเขียนการแสดงออก เว้นแต่ว่าวิธีการแบบเรียกซ้ำจะสั้นกว่าซึ่งฉันสงสัย
xnor

1
@xnor ฉันไม่รู้ว่าจะถามแบบไหนฉันจะขอให้คุณทั้งสองช่วยอธิบายหน่อยได้ไหมว่าคุณคิดอย่างไร y<x?0:(y-x)/2-(y-x)/2%7+7;ฉันคิดว่าฉันควรแยกความแตกต่างออกเป็นสองส่วนแล้วหาผลคูณที่ใกล้ที่สุดของ 7 คุณมาถึงสิ่งนี้ได้อย่างไร
ลุยไทเลอร์

2
@WadeTyler เรากำลังมองหาตัวคูณที่เล็กที่สุดใน 7 ที่มากกว่าความแตกต่างอย่างเคร่งครัดครึ่งหนึ่ง ในการค้นหาสิ่งนั้น(b-a)/2เราต้อง/7*7ปัดเศษเป็นพหุคูณที่ใกล้เคียงที่สุดของ 7 แล้วจึง+7ขึ้นไปบนถัดไป นั่นคือยกเว้นว่าเราจะได้จำนวนลบซึ่งในกรณีที่เราชนะอยู่แล้วก็สามารถทำ 0 ได้โดยใช้max0 ด้วยวิธีนี้ บางส่วนก็แค่ปรับเปลี่ยนนิพจน์และเรียกใช้ในกรณีทดสอบเพื่อดูว่าอะไรใช้งานได้
xnor

2
@WadeTyler /7*7เป็นการแสดงออกที่แสดงออกบ่อยครั้งมากพอในการเล่นกอล์ฟที่ฉันคิดว่ามันเป็นสำนวน ความคิดที่เป็นn/7ใช้เวลาพื้นn/7เช่นพบว่าหลายหลายทั้งภายในกระชับ7 nจากนั้นคูณด้วย7นำมาคูณกับจำนวน7นั้น
xnor

1
@JackAmmo ตัวอย่างนั้นให้-2/7*7และเนื่องจาก Python floor-division กลมไปทางอนันต์เชิงลบ2/7คือ -1 ดังนั้น7*-7+1เท่ากับ 0 ดังนั้นทั้งสองจึงให้ 0 ซึ่งทำงานได้ดี
xnor

13

Mathematica ขนาด 22 ไบต์

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

ฟังก์ชั่นบริสุทธิ์ที่มีการขัดแย้งและ# #2ฮิตลึก recursion 7*2^16 = 458752สูงสุดถ้าความแตกต่างมากกว่า

คำอธิบาย

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
คุณสามารถเพิ่มคำอธิบายทั้งหมดนี้ได้หรือไม่?
Pavel

@Pavel บางทีความคิดเห็นของคุณได้เพิ่มขึ้นอย่างต่อเนื่องเพราะคำอธิบายของฉันไม่ชัดเจน?
ngenisis

ฉันคิดว่ามันดี แต่แล้วฉันก็รู้จัก Mathematica อีกครั้ง
Pavel

@Pavel ดีจะดีกว่าตอนนี้ :)
ngenisis


6

จริงแล้ว 13 ไบต์

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

ลองออนไลน์!

ใช้max((b-a)/14*7+7,0)สูตรเดียวกันกับที่ xnor และ orlp ใช้

คำอธิบาย:

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
ที่จริงแล้วนี่เป็นคำตอบที่ดีมาก
TrojanByAccident

ฉันรู้สึกว่าชื่อของภาษานี้ตั้งใจที่จะทำให้ชื่อที่ส่งนั้นดูคล้ายกับ punchlines: "Guys, อันที่จริงแล้วนี่คือ 13 ไบต์! Come on!"
Patrick Roberts

@PatrickRoberts ที่จริงแล้วถูกต้อง
Mego

6

Groovy, 41 37ไบต์

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

นี่คือการปิดไม่มีชื่อ ขอบคุณxnorและorlpสำหรับสูตรและJames holdernessชี้ให้เห็นข้อผิดพลาด

วิธีการแก้ปัญหาก่อนหน้านี้ใช้intdiv()สำหรับการแบ่งจำนวนเต็ม แต่จะทำงานแตกต่างจากที่//ใช้ในหลาม

ลองที่นี่!


5

Haskell, 30 24 ไบต์

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

ผู้ประกอบการมัดรับจำนวนโหวตของผู้สมัครที่คุณต้องการก่อน ใช้ตรรกะเดียวกับคำตอบอื่น ๆ /14*7+7การปัดเศษด้วย


2
การหาค่าแรกที่ตรงกับสภาพที่จะใช้ดีuntil: หรือดีกว่าa#b=until(\c->a+c>b-c)(+7)0 a%b=until(>(b-a)/2)(+7)0แม้ว่าสูตรเลขคณิตจะยังสั้นกว่า
xnor

1
โปรดทราบว่านอกจากทางเลือกที่สั้นกว่าของ xnor head[...]สามารถย่อให้เกือบได้ตลอดเวลา[...]!!0
Laikoni

@xnor: วิธีการแก้ปัญหาของคุณส่งคืนจนกว่าFractional aฉันจะไม่แน่ใจว่าได้รับการยอมรับ ด้วยความที่divสั้นกว่านี้ขอบคุณมาก! ในที่สุดใช้วิธีการทางคณิตศาสตร์ - และแน่นอนมันเป็นอีกสองไบต์ที่สั้นกว่าจนกระทั่ง @Laikoni: การเล่นกอล์ฟที่ดีไม่รู้เกี่ยวกับสิ่งนั้นจะจำได้
Renzeee

4

J, 15 ไบต์

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

ค่อนข้างน่าสนใจฉันกำลังทำงานกับปัญหาและฉันคิดว่าฉันมีทางออก แต่มันกลับกลายเป็นว่าฉันผิด โอ้ดี ลองออนไลน์! นี่คือผลลัพธ์:

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

ในอนาคตโปรดใช้ TIO.run/nexus
Pavel

@Pavel No, tio.run คือ v2, nexus มีเฉพาะสำหรับความเข้ากันได้ v1 เท่านั้น
เท่านั้น

@ ASCII-only tio.runมีข้อจำกัดความรับผิดชอบที่ด้านล่างซึ่ง Permalink ที่สร้างขึ้นทั้งหมดอาจแตกในอนาคต ฉันคิดว่าฉันควรทำให้เด่นกว่านี้ ยกเว้นเพื่อวัตถุประสงค์ในการทดสอบไม่มีใครควรใช้ v2 ในขณะนี้
Dennis

@ เดนนิสโอ้ฉันไม่รู้! จะแก้ไขโดยเร็ว
Conor O'Brien

4

CJam, 13 12 15 ไบต์

  • บันทึกเป็นไบต์ขอบคุณ Martin Ender
  • เพิ่ม 3 ไบต์ด้วย Martin Ender
  • เปลี่ยน]เป็น[ขอบคุณ ETHproductions

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

โจ๋งครึ่มวิธีการ orlp และ xnor ของโจ๋งครึ่ม

อินพุตคือตัวเลขสองตัวคั่นด้วยช่องว่าง: 100 123

คำอธิบาย:

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.

D13เป็นเพียง และคุณสามารถบันทึกไบต์ด้วยการเพิ่มค่าก่อนการคูณแทนที่จะเพิ่ม 7 หลังจากนั้น
Martin Ender

@JamesHolderness ปัญหาคือการแบ่งจำนวนเต็มของ Python ทำงานไปทาง -inf ในขณะที่รอบ CJam เป็นศูนย์
Martin Ender

ฉันอาจจะเข้าใจผิด แต่ฉันคิดว่าm]เป็นเพดาน m[เป็นพื้น
ETHproductions

@ETHproductions คุณถูกแก้ไข
แยกผลไม้

4

Excel VBA, 24 20 ไบต์

ฟังก์ชั่นหน้าต่างทันทีที่รับอินพุตจากเซลล์A1และB1และส่งออกไปยัง VBE หน้าต่างทันที

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

เวอร์ชันรูทีนย่อย 43 ไบต์

รับอินพุตb, cเป็น Variant \ integer และพิมพ์ไปที่หน้าต่าง VBE ทันที

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


3

PHP, 41 39 ไบต์

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

รับอินพุตจากอาร์กิวเมนต์บรรทัดรับคำสั่ง -rทำงานด้วย

7 5 ไบต์พิเศษเพื่อจัดการ $ a> $ b: - /


3

Japt , 14 ไบต์

V-U /2+7 f7 w0

เรียกใช้ที่นี่!

ขอบคุณ ETHproductions สำหรับการกำจัด 3 ไบต์!


1
ดีมาก. fยอมรับอาร์กิวเมนต์และจำนวนชั้นเป็นจำนวนเท่ากันดังนั้นฉันคิดว่าคุณสามารถV-U /2+7 f7 w0บันทึกได้สามไบต์
ETHproductions


2

Dyalog APL ขนาด 14 ไบต์

รับv1อาร์กิวเมนต์ที่ถูกต้องและv2อาร์กิวเมนต์ซ้าย

07×1+(⌊14÷⍨-)

0 ⌈ จำนวนสูงสุดของศูนย์และ

7 × เจ็ดครั้ง

1 + (... ) หนึ่งบวก ...

 พื้นของ

14 ÷⍨ ที่สิบสี่ของ

- ความแตกต่าง (ระหว่างข้อโต้แย้ง)

ลองใช้ออนไลน์!


2

Befunge ขนาด 19 ไบต์

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

ลองออนไลน์!

สิ่งนี้ขึ้นอยู่กับสูตรที่แตกต่างกันเล็กน้อยกับที่ใช้โดย orlp และ xnor เนื่องจากล่ามอ้างอิงของ Befunge มีกฎการปัดเศษที่แตกต่างกันกับ Python Befunge ยังไม่มีความหรูหราของการmaxดำเนินการ

การคำนวณพื้นฐานมีลักษณะดังนี้:

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

ตรวจสอบรหัสโดยละเอียดเพิ่มเติม:

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 ไบต์

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

นี่เป็นนิพจน์แลมบ์ดาที่มอบหมายให้ IntBinaryOperatorนี่คือการแสดงออกแลมบ์ดามอบหมายไป

a คือการโหวตของผู้สมัครของคุณ b คือฝ่ายตรงข้ามของคุณ

java ปัดเศษลงสำหรับการหารด้วยจำนวนเต็มบวกดังนั้น+7-a%7จะใช้ในการชนค่าขึ้นกับพหุคูณถัดไปของ 7


a->b->(b=(b-a)/14*7+7)>0?b:0สั้นกว่า 3 ไบต์ แต่ฉันชอบวิธีการของคุณมากกว่านี้ดังนั้น +1 จากฉัน เกือบคำตอบให้แล้วทุกใช้max((b-a)/14*7+7,0)..
เควิน Cruijssen

ฉันชอบใช้ lambdas ที่ส่งคืนผลลัพธ์โดยตรง และใช่ทุกคนทำสูตรสั้นลงเล็กน้อย แต่นี่เป็นเหตุผลที่ฉันให้เหตุผลเกี่ยวกับคำตอบก่อนที่จะตรวจสอบทุกคนอื่น ๆ
Jack Ammo

a->b->(b=(b-a)/14*7+7)>0?b:0ส่งคืนผลลัพธ์โดยตรงเช่นกัน: ลองที่นี่ หรือคุณหมายถึงคุณชอบ lambdas แบบวิธีเดียวมากกว่าการแกะ lambdas (a,b)->การตั้งค่ามากกว่าa->b->แม้ว่ามันอีกต่อไป?
Kevin Cruijssen

วิธีการเดียวมากกว่าแกง แต่เป็นเพียงการตั้งค่าส่วนตัว
Jack Ammo

1

Ruby, 26 27 ไบต์

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

โดยทั่วไปเหมือนกับโซลูชัน Python ของ xnor และ orlp ที่มีการบิด (ไม่จำเป็นต้องเพิ่ม 7 เนื่องจากโมดูโลเชิงลบช่วยประหยัด 1 ไบต์ในทับทิมไม่ทราบเกี่ยวกับงูหลาม)

ไม่มีการบิดการบิดเป็นเพียงกรณีที่ไม่ดีของความไม่ลงรอยกันทางปัญญา ลืมมันไปเถอะ จริงๆ. :-)


1

สกาลา 31 ไบต์

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

เวอร์ชันที่ประกอบไปด้วยมีความยาว 2 ไบต์


1

Noodel ขนาด 16 ไบต์

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

ดึงสมการจากคำตอบxorและorlpแต่เนื่องจากNoodelไม่มีความสามารถสูงสุดที่จะต้องแก้ไข

ลองมัน:)

มันทำงานอย่างไร

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.