破解选举


46

您是专业的黑客,您的老板刚刚下令您帮助候选人赢得即将举行的选举。您的任务是更改投票机数据以提高候选人的成绩。

投票机将投票结果存储为两个整数:候选人v1的投票数()和对手的投票数(v2)。

经过数周的研究,您已经在系统中发现一个安全漏洞,您可以将a的值增加v1一个整数x,而将a的值减少v2一个same x。但是有一个约束,您必须保持安全性哈希码不变:

  • 安全哈希码: (v1 + v2*2) modulo 7

另外,的值x必须最小,这样您的更改才能被忽略。

你的程序应该接受作为输入v1v2; 它应该输出的最佳值,x所以v1>v2

在某些情况下,您无法破解结果。您不必处理它们(这可能会导致老板遇到问题,但这是另一回事了)。

测试用例

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

4
评论不作进一步讨论;此对话已转移至聊天
丹尼斯

11
另外,对亲密的选民来说:这完全是话题。如果您不喜欢它,则可以对其进行投票。
Rɪᴋᴇʀ

10
多么安全的哈希函数!
Cruncher

您可以假设输入后面跟有.0(Like 100.0 123.0)吗?
硕果累累

Answers:


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会进行整数除法
Conor O'Brien

@ ConorO'Brien Nope。考虑一下t-u == 16。然后
16/14

@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*7舍入到最接近的7的倍数,然后+7向上舍入到下一个。就是说,除非我们得到一个负数,否则在这种情况下我们赢了就只能做0。max用0来实现。其中一些还只是调整表达式并在测试用例上运行它以查看有效的方法。
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+1也是0。因此,双方都给出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

@Pavel也许是因为我的解释不清楚,您的评论仍在继续受到反对吗?
ngenisis

我以为还不错,但后来我又认识了Mathematica。
Pavel

@Pavel现在好了:)
ngenisis

7

果冻,9字节

IH:7‘×7»0

在线尝试!

这个怎么运作

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

实际上,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

我觉得这种语言的名称是故意使投稿标题听起来像个小插曲:“伙计们,实际上,这是13个字节!加油!”
Patrick Roberts

@PatrickRoberts其实是正确的。
Mego

6

Groovy,41 37字节

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

这是一个未命名的闭包。感谢xnorand 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:直到解决方案返回a 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不,tio.run是v2,nexus仅用于v1兼容性
ASCII码,仅ASCII,2009年

仅限@ASCII的tio.run在底部有一个免责声明,所有生成的永久链接将来可能会中断。我认为我应该使这一点更加突出。除测试目的外,任何人都不应使用v2。
丹尼斯

@丹尼斯哦,我不知道!将尽快编辑。
科纳·奥布莱恩

4

CJam,13 12 15字节

  • 感谢Martin Ender,节省了一个字节。
  • 感谢Martin Ender,增加了3个字节。
  • 更改][感谢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.

D只是13。您可以通过在乘法之前增加值来节省一个字节,而不是在事后加7。
Martin Ender

@JamesHolderness问题是Python的整数除法朝-inf取整,而CJam的朝零取整。
Martin Ender

我可能会误会,但我以为m]是塞勒;m[是地板。
ETHproductions

@ETHproductions您是正确的,已编辑。
硕果累累

4

Excel VBA,24 20字节

立即数窗函数,它输入从细胞中A1B1,并输出到VBE立即数窗口。

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

子例程版本,43字节

将输入b, c作为变量\整数并打印到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

05AB1E,9个字节

-14÷>7*0M

在线尝试!

说明

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

或具有相同字节数的对应函数在数字对上运行

Î¥14÷>7*M

在线尝试!


2

Dyalog APL,14 个字节

注意到v1作为右边的参数,并v2为左参数。

07×1+(⌊14÷⍨-)

0 ⌈ 零和的最大值

7 × 七次

1 + (...... ) 一加...

 地板

14 ÷⍨ 十分之一的

- 差异(参数之间)

在线尝试APL!


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;

这是可分配给的Lambda表达式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直接返回结果。和yeahb大家做了一个公式短一点,但是这是我怎么思索答案检查每个人都别人的面前
杰克弹药

a->b->(b=(b-a)/14*7+7)>0?b:0确实也直接返回结果:在这里尝试。或者您是说您更喜欢单方法lambda,而不是可卷曲的lambda;(a,b)->对的偏好a->b->,即使更长一些?
凯文·克鲁伊森

单一方法而不是咖喱,但这只是个人喜好
Jack Ammo

1

Ruby,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.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.