선거를 해킹


46

당신은 전문적인 해커이며 상사는 후보자가 다가오는 선거에서 승리하도록 도와달라고 명령했습니다. 당신의 임무는 후보자의 결과를 높이기 위해 투표 시스템 데이터를 변경하는 것입니다.

투표 시스템은 투표 결과를 후보에 대한 투표 수 ( v1)와 상대방에 대한 투표 수 ( ) 의 두 정수로 저장합니다 v2.

연구의 주 후, 시스템의 보안 구멍을 발견하고 당신의 가치를 증가시킬 수 있습니다 v1정수로 x, 그리고 값을 감소 v2동일로 x. 그러나 제약 사항이 있으므로 보안 해시 코드를 일정하게 유지해야합니다.

  • 보안 해시 코드 : (v1 + v2*2) modulo 7

또한 x변경 사항이 눈에 띄지 않게하려면에 대한 값 이 최소화되어야합니다.

당신의 프로그램은 입력으로 받아 들여야 v1하고 v2; 그 출력에 대한 최적 값을해야 x하므로 v1>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) 이 있다고 가정 할 수 있습니까 ?
Esolanging 과일

답변:


21

파이썬 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 * 7 = 7이지만 16/2 = 8입니다. 또한 Python 2로 실행되지 않습니다.
orlp

@orlp 어느 쪽을 물어봐야할지 모르겠습니다. 둘 다 묻겠습니다. 어떻게 생각하는지 설명해 주시겠습니까? y<x?0:(y-x)/2-(y-x)/2%7+7;, 나는 그 차이를 반으로 나눈 다음 가장 가까운 7의 배수를 찾아야한다고 생각했습니다. 어떻게 도착 했습니까?
웨이드 타일러

1
같은 해결책은 위에 있습니다
username.ak

20

파이썬 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. 0을 사용하면이를 달성합니다. 그 중 일부는 표현식을 조정하고 테스트 사례에서 실행하여 효과가 있는지 확인했습니다.
xnor

2
@WadeTyler 이것은 /7*7골프에서 종종 관용구라고 생각할 정도로 충분히 표현되는 일종의 표현입니다. 아이디어는 n/7바닥에 걸리는 것입니다 n/7. 즉, 몇 개의 전체 배수가 7맞는지 찾습니다 n. 그런 다음을 곱하면이의 7배수로 나타납니다 7.
xnor

1
@JackAmmo이 예제는을 제공하고 -2/7*7, 파이썬 층 분할이 음의 무한대로 반올림 2/7되므로 -1이므로 7*-7+10도됩니다. 따라서 양쪽 모두 0을 제공합니다.
xnor

13

매스 매 티카, 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

이 언어의 이름 punchlines 같이 제출 제목 소리를 만들기 위해 의도적 같은 느낌 : "얘들 아, 사실 이 13 바이트 어서!"
Patrick Roberts

@PatrickRoberts 사실, 맞습니다.
Mego

6

그루비, 41 37 바이트

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

이것은 이름이없는 폐쇄입니다. 수식 덕분에 xnor그리고 버그를 지적 해 주셔서 감사합니다 .orlpJames holderness

이전 솔루션 intdiv()은 정수 나누기에 사용되었지만 //파이썬 에서 사용되는 것과 다르게 동작 합니다.

여기 사용해보십시오!


5

하스켈, 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는 감사 그래서, 비록 짧은! 결국 수학적 접근 방식을 사용했으며 실제로는 2 바이트 더 짧았습니다. @Laikoni : 좋은 골프, 그에 대해 몰랐어요, 기억할 것입니다.
Renzeee 2012 년

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 전용 tio.run 은 맨 아래에 생성 된 모든 영구 링크가 향후 중단 될 수있는 고지 사항이 있습니다. 나는 그것을 더 두드러지게 만들어야한다고 생각합니다. 테스트 목적을 제외하고는 현재 v2를 사용하지 않아야합니다.
Dennis

@ 데니스 오, 몰랐어! 최대한 빨리 편집합니다.
Conor O'Brien

4

CJam, 13 12 15 바이트

  • Martin Ender 덕분에 바이트를 절약했습니다.
  • Martin Ender 덕분에 3 바이트가 추가되었습니다.
  • ETH 프로덕션 덕분에 변경 ]되었습니다 [.

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 문제는 파이썬의 정수 나누기가 -inf로 반올림되는 반면 CJam의 반올림은 0으로 반올림한다는 것입니다.
Martin Ender

나는 오해가 있을지 모르지만 나는 m]천정 이라고 생각했다 . m[바닥입니다.
ETHproductions

@ETHproductions 당신이 맞아요, 편집되었습니다.
Esolanging Fruit

4

Excel VBA, 24 20 바이트

세포로부터의 입력을 받아 immediate 만 윈도우 함수 A1B1VBE immediate 만 창으로 출력한다.

?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.

$ a> $ b :-/를 처리하기 위해 7 5 여분의 바이트




2

Dyalog APL , 14 바이트

소요 v1오른쪽 인자로하고 v2왼쪽 인수로.

07×1+(⌊14÷⍨-)

0 ⌈ 최대 0과

7 × 일곱 번

1 + (... ) 하나 더하기 ...

 바닥

14 ÷⍨ 열 네번째

- 차이 (인수 사이)

TryAPL 온라인!


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

자바 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)..를 사용합니다 .
Kevin Cruijssen

결과를 직접 반환하는 람다를 사용하는 것이 좋습니다. yeahb 모두가 공식을 조금 더 짧게했지만 이것이 다른 모든 사람을 확인하기 전에 대답에 대해 추론 한 방법이었습니다.
Jack Ammo

a->b->(b=(b-a)/14*7+7)>0?b:0결과도 직접 반환합니다 . 여기에서 시도하십시오. 아니면 카레 람다보다 단일 방법 람다를 선호한다는 의미입니까? (a,b)->더 길어도 선호 a->b->?
Kevin Cruijssen

카레보다 단일 방법이지만, 그것은 단지 개인적인 취향입니다
Jack Ammo

1

루비, 26 27 바이트

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

기본적으로 xnor 및 orlp의 Python 솔루션과 동일 하며 꼬임 (음수 모듈로 인해 7을 추가 할 필요가 없으며 루비로 1 바이트를 절약하고 파이썬에 대해 알지 못함)

트위스트가 아닌 트위스트는인지 부조화의 나쁜 경우였습니다. 잊어 버려. 정말. :-)


1

스칼라, 31 바이트

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

3 진 버전이 2 바이트 더 깁니다.


1

누델 , 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.