選挙をハックする


46

あなたはプロのハッカーであり、あなたの上司は候補者が次の選挙に勝つのを手伝うようにあなたに命じたところです。あなたの仕事は、投票マシンのデータを変更して候補者の結果を高めることです。

投票マシンは、投票結果を2つの整数として保存します。候補者v1の投票数()と相手の投票数(v2)です。

数週間の調査の後、システムにセキュリティホールが見つかりました。v1整数xでの値を増やしv2、同じでの値を減らすことができますx。ただし、制約があり、セキュリティハッシュコードを一定に保つ必要があります。

  • セキュリティハッシュコード: (v1 + v2*2) modulo 7

また、x変更に気付かないように、の値は最小限でなければなりません。

あなたのプログラムは、入力として受け入れるべきv1v2xso の最適値を出力する必要がありますv1>v2

結果をハッキングできない場合があります。それらを処理する必要はありません(これは上司に問題を引き起こす可能性がありますが、それは別の話です)。

テストケース

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

4
コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
デニス

11
また、近い投票者へ:これは完全に話題です。気に入らない場合は、ダウン投票できます。
Rɪᴋᴇʀ

10
なんと安全なハッシュ関数です!
ランチャー

入力の後に.0(Like 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んか?
コナーオブライエン

2
ああ、ちょっと待ってください、Py2は整数除算を行います
コナーオブライエン

@ ConorO'Brien Nope。検討してくださいt-u == 16。その後、16/14 * 7 =
7、16

@orlpどっちがいいのかわからないので、両方に聞いてみます。これについてどう思いますか?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
@orlpうん、これは表現を書くための単なる方法だと思う。再帰的な解決策が短くない限り、これは疑わしい。
xnor

1
@xnor私はどちらを尋ねるかわからないので、私はあなたの両方に尋ねます、あなたはこれについてどう思ったか説明してくれますか?y<x?0:(y-x)/2-(y-x)/2%7+7;、私は違いを半分に分けてから、最も近い7の倍数を見つけるべきだと思いました。どうやってこれに到達しましたか?
ウェイドタイラー

2
@WadeTyler差の半分より厳密に大きい7の最小の倍数を探しています。ことを確認するには(b-a)/2、私たちは/7*77の倍数に最も近いラウンド浮き沈みにして、+7次のアップまで行くことに。つまり、負の数を取得しない限り、負の数を取得する場合は、とにかく0を実行するだけで済みますmax。その一部は、式を微調整し、テストケースで実行して、何が機能するかを確認することでもありました。
-xnor

2
@WadeTyler /7*7は、ゴルフで十分に頻繁に現れる一種の表現であり、私はそれをイディオムと考えています。考えはn/7床を取ることですn/7、すなわち、7適合の全体の倍数を見つけますn。次に、を掛けると、の7倍数になり7ます。
xnor

1
@JackAmmoこの例ではが得られ-2/7*7、Pythonの床除算2/7は負の無限大に向かって丸められるため、-1であるため7*-7+10になります。したがって、両側で0が得られます。
-xnor

13

Mathematica、22バイト

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

引数#とを持つ純粋な関数#2。不一致がより大きい場合、最大再帰深度に達します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私の説明が不明瞭だったので、あなたのコメントは賛成票を取り続けたのでしょうか?
-ngenisis

私はそれが大丈夫だと思ったが、それからまたMathematicaを知っている。
パベル

@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バイトですさあ!!」
パトリックロバーツ

@PatrickRoberts実際、それは正しいです。
メゴ

6

Groovy、41 37バイト

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

これは名前のないクロージャーです。おかげxnorおよびorlp式のためとJames holdernessバグを指摘して。

前のソリューションintdiv()は整数除算に//使用されましたが、Pythonで使用されたものとは異なる動作をします。

ここで試してみてください!


5

Haskell、30 24バイト

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

最初に希望する候補者の投票数を取得する中置演算子。での丸めの他の答えと同じロジックを使用し/14*7+7ます。


2
条件を満たしている最初の値を見つけることのために良い使用であるuntila#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それは短く、とても感謝してもです!最終的には数学的アプローチを使用しました-実際、それはさらに2バイト短くなりました。@ライコニ:素敵なゴルフ、それについて知らなかった、それを覚えているだろう。
レンジー

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いいえ、tio.runはv2は、ネクサスはV1のみの互換性のためにそこにあるある
ASCIIのみ

@ASCIIのみのtio.runの下部には、生成されたすべてのパーマリンクが将来破損する可能性があるという免責事項があります。もっと目立たせるべきだと思います。テスト目的を除き、現時点ではv2を使用しないでください。
デニス

@デニスああ、私は知りませんでした!できるだけ早く編集します。
コナーオブライエン

4

CJam、13 12 15バイト

  • Martin Enderのおかげで1バイト節約できました。
  • Martin Enderのおかげで3バイトが追加されました。
  • ETHproductionsのおかげで変更さ][ました。

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

orlpおよびxnorのメソッドを露骨に盗みました。

入力は、スペースで区切られた2つの数値です。 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.

Dのみ13です。そして、後で7を追加する代わりに、乗算する前に値をインクリメントすることにより、バイトを節約できます。
マーティンエンダー

@JamesHolderness問題は、Pythonの整数除算が-inf方向に丸められるのに対し、CJamの丸めはゼロ方向に向かうことです。
マーティンエンダー

私は誤解しているかもしれませんが、私m]は天井だと思った。m[床です。
-ETHproductions

@ETHproductionsあなたは正しい、編集されました。
エソランジングフルーツ

4

Excel VBA、24 20バイト

細胞からの入力を受け取り即値窓関数A1B1VBE即値ウィンドウに出力します。

?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 $ a> $ bを処理するためだけの余分なバイト:-/





2

Befunge、19バイト

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

オンラインでお試しください!

Befunge参照インタープリターはPythonに対して異なる丸め規則を持っているため、これはorlpおよびxnorで使用されるものとはわずかに異なる式に依存します。また、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:03バイト短くなっていますが、私はあなたのアプローチがもっと好きなので、+ 1します。与えられたほぼすべての答えはすでにmax((b-a)/14*7+7,0)..を使用しています
ケビン・クルーッセン

結果を直接返すラムダを使用することを好みます。そして、ええと誰もが少し短く式をしましたが、これは私が他のみんなをチェックする前に答えについて推論した方法でした
ジャック弾薬

a->b->(b=(b-a)/14*7+7)>0?b:0結果も直接返されます:ここで試してみてください。または、カリー化ラムダよりも単一メソッドのラムダを好むということですか?より長いのに、(a,b)->好みよりa->b->も?
ケビンCruijssen

カリー化よりも単一の方法ですが、それは個人的な好みに過ぎません
ジャックアモ

1

ルビー、26 27バイト

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

基本的にxnorおよびorlpのPythonソリューションと同じですが、ツイストがあります(負のモジュロのため、7を追加する必要はなく、Rubyで1バイトを節約し、Pythonについては知りません)

ひねりはありません。ひねりは認知的不協和の悪い例でした。忘れてください。本当に。:-)


1

Scala、31バイト

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

三元バージョンは2バイト長くなります


1

Noodel、16 バイト

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

xororlpの答えから方程式を引き出しましたが、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.