Retas pemilihan

46

Anda seorang peretas profesional dan bos Anda baru saja memerintahkan Anda untuk membantu seorang kandidat memenangkan pemilihan yang akan datang. Tugas Anda adalah mengubah data mesin pemungutan suara untuk meningkatkan hasil kandidat.

Mesin pemberi suara menyimpan hasil pemungutan suara sebagai dua bilangan bulat: jumlah suara untuk kandidat Anda ( v1) dan jumlah suara untuk lawan mereka ( v2).

Setelah berminggu-minggu penelitian, Anda telah menemukan lubang keamanan dalam sistem dan Anda dapat meningkatkan nilai v1dengan integer x, dan mengurangi nilai v2dengan cara yang sama x. Tetapi ada kendala, Anda harus menjaga kode hash keamanan konstan:

  • kode hash keamanan: (v1 + v2*2) modulo 7

Juga, nilai untuk xharus minimal agar perubahan Anda tidak diperhatikan.

Program Anda harus menerima sebagai masukan v1dan v2; seharusnya menghasilkan nilai optimal untuk xitu v1>v2.

Ada beberapa kasus di mana Anda tidak dapat meretas hasilnya; Anda tidak harus menanganinya (ini mungkin menyebabkan masalah dengan atasan Anda, tapi itu cerita lain).

Uji kasus

100,123 --> 14
47,23 --> 0
40,80 --> 21
62,62 --> 7
1134,2145 --> 511
Arnaud
sumber
4
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Dennis
11
Juga, untuk pemilih dekat: Ini adalah topik yang sempurna. Jika Anda tidak menyukainya, Anda dapat menghapusnya.
Rɪᴋᴇʀ
10
Apa fungsi hash yang aman!
Cruncher
Bisakah Anda menganggap input diikuti oleh .0(Suka 100.0 123.0)?
Buah Esolanging

Jawaban:

21

Python 2, 30 byte

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

uadalah suara kita, tadalah suara mereka.

orlp
sumber
3
Tidak (t-u)/14*7mungkin adil (t-u)/2?
Conor O'Brien
2
Oh, tunggu, tidak apa-apa, Py2 melakukan pembagian integer
Conor O'Brien
@ ConorO'Brien Nggak. Pertimbangkan t-u == 16. Kemudian
16/14
@ Atau saya tidak tahu harus bertanya yang mana, jadi saya akan bertanya kepada Anda berdua, bisakah Anda menjelaskan kepada saya bagaimana pendapat Anda tentang ini? y<x?0:(y-x)/2-(y-x)/2%7+7;, Saya pikir saya harus mengambil perbedaan, membaginya menjadi dua, dan kemudian menemukan kelipatan terdekat dari 7. Bagaimana Anda sampai pada hal ini?
Wade Tyler
1
solusi yang sama ada di atas
username.ak
20

Python 2, 30 byte

lambda a,b:max((b-a)/14*7+7,0)
Tidak
sumber
3
@ Atau Ya, saya pikir ini hanya cara untuk menulis ekspresi. Kecuali jika solusi rekursif lebih pendek, yang saya ragu.
xnor
1
@ xnor Saya tidak tahu yang mana yang harus ditanyakan, jadi saya akan bertanya kepada Anda berdua, bisakah Anda menjelaskan kepada saya bagaimana pendapat Anda tentang ini? y<x?0:(y-x)/2-(y-x)/2%7+7;, Saya pikir saya harus mengambil perbedaan, membaginya menjadi dua, dan kemudian menemukan kelipatan terdekat dari 7. Bagaimana Anda sampai pada hal ini?
Wade Tyler
2
@WadeTyler Kami mencari kelipatan terkecil dari 7 yang benar-benar lebih besar dari setengah perbedaan. Untuk menemukan itu (b-a)/2, kita lakukan /7*7untuk membulatkan ke kelipatan 7 terdekat, dan kemudian +7naik ke yang berikutnya naik. Artinya, kecuali jika kita akan mendapatkan angka negatif, dalam hal ini kita tetap menang hanya bisa 0. Mengambil maxdengan 0 mencapai ini. Beberapa di antaranya juga hanya mengubah ekspresi dan menjalankannya pada kasus uji untuk melihat apa yang berhasil.
xnor
2
@WadeTyler The /7*7adalah semacam ekspresi yang cukup sering muncul di golf sehingga saya menganggapnya sebagai ungkapan. Idenya adalah n/7mengambil lantai n/7, yaitu menemukan berapa banyak kelipatan 7cocok dalam n. Kemudian, mengalikan dengan 7membawanya ke nomor kelipatan 7.
xnor
1
@JackAmmo Contoh itu memberi -2/7*7, dan karena putaran pembagian-lantai Python menuju infinity negatif, 2/7adalah -1, demikian 7*-7+1juga 0. Jadi, kedua belah pihak memberikan 0, yang bekerja dengan baik.
xnor
13

Mathematica, 22 byte

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

Fungsi murni dengan argumen #dan #2. Mencapai kedalaman rekursi maksimum jika perbedaan lebih dari 7*2^16 = 458752.

Penjelasan

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
sumber
4
Bisakah Anda menambahkan penjelasan untuk semua ini?
Pavel
@Pavel Mungkin komentar Anda terus naik karena penjelasan saya tidak jelas?
ngenisis
Saya pikir itu baik-baik saja, tetapi sekali lagi saya juga tahu Mathematica.
Pavel
@Pavel Yah lebih baik sekarang :)
ngenisis
7

Jelly , 9 byte

IH:7‘×7»0

Cobalah online!

Bagaimana itu bekerja

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
sumber
6

Sebenarnya , 13 byte

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

Cobalah online!

Menggunakan max((b-a)/14*7+7,0)rumus yang sama yang digunakan xnor dan orlp.

Penjelasan:

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
sumber
5
Sebenarnya , ini adalah jawaban yang bagus
TrojanByAccident
Saya merasa nama bahasa ini disengaja untuk membuat judul kiriman terdengar seperti punchlines: "Guys, Sebenarnya , ini 13 byte! Ayo!"
Patrick Roberts
@ PatrickRoberts Sebenarnya, itu benar.
Mego
6

Groovy, 41 37 byte

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

Ini adalah penutupan tanpa nama. Terima kasih kepada xnordan orlpuntuk formula dan James holdernessuntuk menunjukkan bug.

Solusi sebelumnya digunakan intdiv()untuk pembagian integer tetapi berperilaku berbeda dari yang //digunakan dalam python.

Coba di sini!

Gurupad Mamadapur
sumber
5

Haskell, 30 24 byte

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

Operator infiks mengambil jumlah suara dari kandidat pilihan Anda terlebih dahulu. Menggunakan logika yang sama dengan jawaban pembulatan lainnya /14*7+7.

Renzeee
sumber
2
Menemukan nilai pertama yang memenuhi syarat adalah penggunaan yang baik untuk until:, a#b=until(\c->a+c>b-c)(+7)0atau lebih baik a%b=until(>(b-a)/2)(+7)0. Padahal rumus aritmatika masih cenderung lebih pendek.
xnor
1
Perhatikan bahwa selain dari alternatif xnor yang lebih pendek, head[...]hampir selalu dapat disingkat menjadi[...]!!0
Laikoni
@ xnor: solusi Anda sampai mengembalikan a Fractional a, saya tidak yakin apakah itu diterima. Dengan divitu meskipun lebih pendek, jadi terima kasih! Akhirnya menggunakan pendekatan matematika - dan memang, itu dua byte lebih pendek dari sebelumnya. @Laikoni: golf yang bagus, tidak tahu tentang itu, akan mengingatnya.
Renzeee
4

J, 15 byte

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

Agak menarik, saya sedang mengerjakan suatu masalah dan saya pikir saya punya solusi tetapi ternyata saya salah. Baiklah. Cobalah online! Inilah hasilnya:

   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
sumber
Di masa depan, silakan gunakan TIO.run/nexus
Pavel
@Pavel Tidak, tio.run adalah v2, nexus hanya ada untuk kompatibilitas v1
ASCII-satunya
@ Tio.run hanya ASCII memiliki penafian di bagian bawah bahwa semua permalink yang dihasilkan mungkin rusak di masa depan. Saya pikir saya harus membuatnya lebih menonjol. Kecuali untuk tujuan pengujian, tidak ada yang harus menggunakan v2 saat ini.
Dennis
@ Dennis Oh, saya tidak tahu! Akan mengedit secepatnya.
Conor O'Brien
4

CJam, 13 12 15 byte

  • Menyimpan satu byte berkat Martin Ender.
  • Menambahkan 3 byte berkat Martin Ender.
  • Diubah ]menjadi [berkat produk ETH.

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

Mencuri metode orlp dan xnor secara terang-terangan.

Input adalah dua angka yang dipisahkan oleh spasi: 100 123

Penjelasan:

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.
Buah Esolanging
sumber
Dhanya 13. Dan Anda dapat menyimpan byte dengan menambahkan nilai sebelum perkalian alih-alih menambahkan 7 setelahnya.
Martin Ender
@JamesHolderness Masalahnya adalah bahwa divisi integer Python bekerja putaran menuju -inf sedangkan putaran CJam menuju nol.
Martin Ender
Saya mungkin salah paham, tetapi saya pikir m]itu langit-langit; m[adalah lantai.
ETHproduk
@ ETHproductions Anda benar, diedit.
Buah Esolanging
4

Excel VBA, 24 20 Bytes

Segera fungsi jendela yang mengambil input dari sel A1dan B1dan output ke VBE segera jendela.

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

Versi Subrutin, 43 Bytes

mengambil input b, csebagai varian \ integer dan mencetak ke jendela VBE segera

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

PHP, 41 39 byte

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

mengambil input dari argumen baris perintah; jalankan bersama -r.

7 5 byte tambahan hanya untuk menangani $ a> $ b: - /

Titus
sumber
3

Japt , 14 byte

V-U /2+7 f7 w0

Jalankan di sini!

Terima kasih ETHproduk untuk mencukur 3 byte!

Oliver
sumber
1
Sangat bagus. fmenerima argumen dan lantai ke kelipatan angka itu, jadi saya pikir Anda bisa V-U /2+7 f7 w0menghemat tiga byte.
ETHproduk
3

05AB1E , 9 byte

-14÷>7*0M

Cobalah online!

Penjelasan

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

Atau fungsi yang sesuai dengan byte-count yang sama yang beroperasi pada pasangan-nomor

Î¥14÷>7*M

Cobalah online!

Emigna
sumber
2

Dyalog APL , 14 byte

Dibawa v1sebagai argumen kanan dan v2sebagai argumen kiri.

07×1+(⌊14÷⍨-)

0 ⌈ maksimum nol dan

7 × tujuh kali

1 + (... ) satu tambah ...

 lantai

14 ÷⍨ seperempat belas

- perbedaan (antara argumen)

TryAPL online!

Adm
sumber
2

Befunge, 19 byte

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

Cobalah online!

Ini bergantung pada formula yang sedikit berbeda dengan yang digunakan oleh orlp dan xnor, karena juru bahasa referensi Befunge memiliki aturan pembulatan yang berbeda dengan Python. Befunge juga tidak memiliki kemewahanmax operasi.

Perhitungan dasar terlihat seperti ini:

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

Memeriksa kode lebih terinci:

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
sumber
2

JavaScript (ES6), 31 byte

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

Darrylyeo
sumber
2

Java 8, 31 byte

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

Ini adalah ekspresi lambda yang ditugaskan untuk IntBinaryOperator .

a adalah suara kandidat Anda, b adalah lawan Anda.

java rounds down untuk pembagian dengan bilangan bulat positif, sehingga +7-a%7digunakan untuk meningkatkan nilai ke kelipatan 7 berikutnya.

Jack Ammo
sumber
a->b->(b=(b-a)/14*7+7)>0?b:0lebih pendek 3 byte, tapi saya lebih suka pendekatan Anda, jadi +1 dari saya. Hampir setiap jawaban yang diberikan sudah menggunakan max((b-a)/14*7+7,0)..
Kevin Cruijssen
saya lebih suka menggunakan lambdas yang mengembalikan hasilnya secara langsung. dan yeahb semua orang melakukan rumus sedikit lebih pendek tapi ini adalah bagaimana saya beralasan tentang jawaban sebelum memeriksa semua orang lain
Jack Ammo
a->b->(b=(b-a)/14*7+7)>0?b:0tidak mengembalikan hasilnya secara langsung juga: Coba di sini. Atau maksud Anda, Anda lebih suka lambda metode tunggal di atas kari lambda; (a,b)->preferensi lebih a->b->, meskipun lebih lama?
Kevin Cruijssen
metode tunggal lebih dari kari, tapi itu hanya preferensi pribadi
Jack Ammo
1

Ruby, 26 27 byte

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

Pada dasarnya sama dengan solusi Python xnor dan orlp, dengan twist (tidak perlu menambahkan 7, karena modulo negatif, menyimpan 1 byte di ruby, tidak tahu tentang python)

Tidak memelintir, memelintir itu hanya kasus buruk disonansi kognitif. Lupakan. Benarkah. :-)

GB
sumber
1

Scala, 31 byte

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

Versi ternary lebih panjang 2 byte

jaxad0127
sumber
1

Noodel , 16 byte

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

Persamaan yang ditarik dari jawaban xor dan orlp , tetapi karena Noodel tidak memiliki kemampuan maksimal harus menyelesaikannya.

Cobalah:)

Bagaimana itu bekerja

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