Seçimleri kes


46

Sen profesyonel bir bilgisayar korsanısın ve patronun bir adayın yaklaşan bir seçimi kazanmasına yardım etmeni emretti. Görevin, adayın sonuçlarını artırmak için oylama makineleri verilerini değiştirmek.

Oylama makineleri, oylama sonuçlarını iki tamsayı olarak kaydeder: Adayınıza verilen oy sayısı ( v1) ve rakiplerine verilen oy sayısı ( v2).

Haftalar süren araştırmalardan sonra, sistemde bir güvenlik boşluğu buldunuz ve v1bir tamsayı ile değerini artırabilir ve aynı xdeğeri azaltabilirsiniz . Ancak bir kısıtlama vardır, güvenlik karma kodunu sabit tutmanız gerekir:v2x

  • güvenlik karma kodu: (v1 + v2*2) modulo 7

Ayrıca, xdeğişikliklerin fark edilmeden gidebilmesi için değerin minimum olması gerekir.

Programınız girdi olarak kabul etmeli v1ve v2; onun için çıktı optimum değer olmalıdır xböylece v1>v2.

Sonuçları kesemeyeceğiniz bazı durumlar vardır; Onlarla başa çıkmak zorunda değilsiniz (bu patronunuzla sorunlara yol açabilir, ama bu başka bir hikaye).

Test durumları

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

4
Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
Dennis

11
Ayrıca, yakın seçmenlere: Bu tamamen konuyla ilgili. Hoşunuza gitmediyse, aşağı oy verebilirsiniz.
51'de

10
Ne güvenli bir karma işlevi!
Cruncher

Girişlerin .0(Beğenilmiş 100.0 123.0) takip edildiğini varsayabilir misiniz ?
Esolanging Fruit

Yanıtlar:


21

Python 2,30 bayt

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

uoylarımız, toyları.


3
(t-u)/14*7Sadece olamaz (t-u)/2mıydı?
Conor O'Brien,

2
Oh, bekle, boşver, Py2 tamsayılı bölüm yapar
Conor O'Brien

@ ConorO'Brien Hayır. Düşünün t-u == 16. Sonra
16/14

@orlp Hangisini soracağımı bilmiyorum, o yüzden ikinize de soracağım, lütfen bana bunun hakkında ne düşündüğünüzü açıklayabilir misiniz? y<x?0:(y-x)/2-(y-x)/2%7+7;, Farkı ikiye bölüp sonra en yakın 7'yi bulmam gerektiğini düşündüm. Buna nasıl ulaştınız?
Wade Tyler

1
aynı çözüm yukarıda
username.ak

20

Python 2,30 bayt

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

3
@orlp Evet, bence bu sadece ifadeyi yazmanın bir yolu. Özyinelemeli bir çözüm daha kısa değilse, ki şüpheliyim.
xnor

1
@xnor Hangisini soracağımı bilmiyorum, o yüzden ikinize de soracağım, lütfen bana bunu nasıl düşündüğünüzü açıklayabilir misiniz? y<x?0:(y-x)/2-(y-x)/2%7+7;, Farkı ikiye bölüp sonra en yakın 7'yi bulmam gerektiğini düşündüm. Buna nasıl ulaştınız?
Wade Tyler

2
@WadeTyler Biz kesinlikle farkın yarısından büyük olan 7'nin en küçük katına bakıyoruz. O bulmak için (b-a)/2, yapmamız /7*77 yakın katına yuvarlak çıkışlar ve sonra +7bir sonraki up kadar gitmek. Yani, negatif bir sayı alamazsak, bu durumda yine de kazanacağımız şey sadece 0 olabilir. Bunu 0 ile almak maxbunu başarır. Bazıları aynı zamanda ifadeyi düzeltip neyin işe yaradığını görmek için test senaryolarında çalıştırıyordu.
xnor

2
@WadeTyler Bu /7*7, bir deyim olarak düşündüğüm golf oynarken yeterince sık görülen bir ifadedir. Buradaki fikir, n/7zeminin n/7kapladığı alandır; yani, içinde kaç tane tam 7uyum olduğunu bulur n. Ardından, çarpma işlemi 7o sayıya katlar 7.
xnor

1
@JackAmmo Bu örnek verir -2/7*7ve Python taban bölümü negatif sonsuzluğa doğru yuvarlandığından 2/7, -1'dir, yani 7*-7+10'dır. Böylece, her iki taraf da 0 değerini verir, ki bu da iyi sonuç verir.
xnor

13

Mathematica, 22 bayt

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

Argümanlarla saf fonksiyon #ve #2. Tutarsızlık fazla ise maksimum özyineleme derinliğini vurur 7*2^16 = 458752.

açıklama

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
Bütün bunlar için bir açıklama ekleyebilir misiniz?
Pavel

@Pavel Belki de yorumunuz net değil çünkü yorumunuz artmaya devam etti.
ngenis,

İyi olduğunu düşündüm, ama sonra yine Mathematica'yı da biliyorum.
Pavel

@Pavel Eh şimdi daha iyi :)
ngenisis

7

Jöle , 9 bayt

IH:7‘×7»0

Çevrimiçi deneyin!

Nasıl çalışır

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

Aslında , 13 bayt

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

Çevrimiçi deneyin!

Aynı kullanır max((b-a)/14*7+7,0)XNOR ve orlp kullanımı o formülü.

Açıklama:

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
Aslında , bu harika bir cevap
TrojanByAcident,

Gönderim başlıklarını punchline gibi ses çıkarmak için bu dilin adının kasıtlı olduğunu hissediyorum: "Beyler, Aslında , bu 13 bayt! Hadi!"
Patrick Roberts

@PatrickRoberts Aslında, doğru.
Mego

6

Büyük, 41 37 bayt

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

Bu isimsiz bir kapanış. xnorVe orlpformül için ve James holdernessbir hatayı işaret ettiğin için teşekkürler .

intdiv()Tamsayı bölme için kullanılan önceki çözüm ancak python'da //kullanılandan farklı davranır .

Burada dene!


5

Haskell, 30 24 bayt

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

İlk önce tercih ettiğiniz adayın oy sayısını alan bir infix operatörü. Yuvarlamanın diğer cevaplarıyla aynı mantığı kullanır /14*7+7.


2
Bir koşulu karşılayan ilk değeri bulmak iyi bir kullanımdır until: a#b=until(\c->a+c>b-c)(+7)0veya daha iyisi a%b=until(>(b-a)/2)(+7)0. Aritmetik bir formül hala daha kısa olsa da.
xnor

1
head[...][...]!!0
Xnor'ın

@ xnor: çözümünüz geri dönene kadar a Fractional a, kabul edilip edilmediğinden emin değilim. Bununla beraber divdaha kısa olsa da, teşekkürler! Sonunda matematiksel yaklaşımı kullandı - ve aslında, olduğundan daha kısa olan iki bayt idi. @Likonikon: Güzel golf, bunu bilmiyordum, hatırlayacak.
Renzeee

4

J, 15 bayt

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

Çok ilginç, bir sorun üzerinde çalışıyordum ve bir çözüm bulduğumu sanıyordum ama ortaya çıktığında hatalıydım. Oh iyi. Çevrimiçi deneyin! İşte sonuç:

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

Gelecekte, lütfen TIO.run/nexus
Pavel

@Pavel Hayır, tio.run v2, nexus yalnızca v1 uyumluluğu için var
ASCII-only

@ ASCII-only tio.run , alt kısımda, üretilen tüm kalıcı bağlantıların gelecekte kırılabileceği konusunda bir feragatname içeriyor . Sanırım bunu daha belirgin yapmalıyım. Test amaçları dışında, hiç kimse şu anda v2 kullanmamalıdır.
Dennis

@Dennis Oh, bilmiyordum! En kısa zamanda düzenleyecektir.
Conor O'Brien,

4

CJam, 13 12 15 bayt

  • Martin Ender sayesinde bir bayt kaydedildi.
  • Martin Ender sayesinde 3 bayt eklendi.
  • Değişti ]için [ETHproductions sayesinde.

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

Açıkça orlp ve xnor'ın yöntemlerini çaldı.

Giriş, boşlukla ayrılmış iki sayıdır: 100 123

Açıklama:

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.

Dsadece 13. Ve sonradan 7 eklemek yerine, çarpma işleminden önceki değeri artırarak bir bayt kaydedebilirsiniz.
Martin Ender

@JamesHolderness Sorun, Python'un tamsayı bölümünün -inf'e doğru yuvarlanması, CJam'ın sıfıra doğru yuvarlanmasıdır.
Martin Ender

Yanlış anlıyor olabilirim ama m]tavan olduğunu düşündüm ; m[kat.
ETHProductions

@ETHproductions Haklısın, düzenlenmiş.
Esolanging Fruit

4

Excel VBA, 24 20 Bayt

Hücrelerden girdi alan A1ve B1VBE'ye çıkış alan pencere işlevini anında pencereye yönlendirir.

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

Alt Program Sürümü, 43 Bayt

girdiyi b, cvaryant \ tamsayı olarak alır ve VBE'ye giriş penceresine yazdırır

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


3

PHP, 41 39 bayt

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

komut satırı argümanlarından girdi alır; ile koş -r.

7 $ sadece $ a> $ b ile başa çıkmak için ekstra bayt: - /


3

Japt , 14 bayt

V-U /2+7 f7 w0

Burada çalıştır!

3 bayt'ı tıraş ettiğiniz için teşekkür ederiz ETHProductions!


1
Çok hoş. fbu sayının katına bir argüman ve kat kabul eder, bu yüzden V-U /2+7 f7 w0üç byte tasarruf edebileceğinizi düşünüyorum .
ETHProductions

3

05AB1E , 9 bayt

-14÷>7*0M

Çevrimiçi deneyin!

açıklama

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

Veya bir sayı çiftinde çalışan aynı byte sayısı ile karşılık gelen bir fonksiyon

Î¥14÷>7*M

Çevrimiçi deneyin!


2

Dyalog APL , 14 bayt

Alır v1sağ argüman olarak ve v2sol argümanı.

07×1+(⌊14÷⍨-)

0 ⌈ sıfırın maksimum ve

7 × Yedi kere

1 + (... ) bir artı ...

 katında

14 ÷⍨ on dörtte biri

- fark (argümanlar arasındaki)

TryAPL çevrimiçi!


2

Befunge, 19 bayt

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

Çevrimiçi deneyin!

Befunge referans yorumlayıcısının Python için farklı yuvarlama kuralları olduğundan, orlp ve xnor tarafından kullanılanlardan biraz farklı bir formüle dayanır. Befunge ayrıca bir maxoperasyonun lüksüne sahip değildir .

Temel hesaplama şuna benzer:

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

Kodu daha ayrıntılı incelemek:

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 bayt

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

Bu atanabilir bir lambda ifadesidir IntBinaryOperator.

a, adayının oyları, b rakibinin oyları.

java pozitif tamsayılarla bölme için aşağı yuvarlanır, bu nedenle +7-a%7değeri 7'nin bir sonraki katına çıkarmak için kullanılır.


a->b->(b=(b-a)/14*7+7)>0?b:03 bayt daha kısa, ama yaklaşımını daha çok seviyorum, benden +1. Verilen hemen hemen her cevap zaten kullanır max((b-a)/14*7+7,0)..
Kevin Cruijssen

Doğrudan sonucu veren lambdaları tercih ediyorum. ve evet, herkes formülü biraz daha kısaltdı, fakat bu, herkesin dikkatini çekmeden önce cevabımın nedenini düşünmemdi
Jack Ammo

a->b->(b=(b-a)/14*7+7)>0?b:0sonucu da doğrudan döndürür: Burada deneyin. Yoksa körleme lambdalarının üstünde tek yöntemli lambdaları mı tercih ediyorsunuz? (a,b)->Tercih a->b->daha uzun olsa bile mi?
Kevin Cruijssen

Körleme üzerine tek bir yöntem, ama bu sadece kişisel bir tercih
Jack Ammo

1

Ruby, 26 27 bayt

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

Temelde xnor ve orlp'in Python çözümü ile aynı, bir bükülme ile (negatif modülo nedeniyle 7 eklemeye gerek yok , yakutta 1 bayt tasarruf sağlıyor, python hakkında bir şey bilmiyor)

Hayır büküm, büküm sadece kötü bir bilişsel uyumsuzluk vakasıydı. Unut gitsin. Gerçekten mi. :-)


1

Scala, 31 bayt

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

Üçlü sürüm 2 bayttır


1

Erişte , 16 bayt

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

Dan denklemi çekti xor ve orlp cevapları, ancak o zamandan beri Noodel olmayan bir maksimum kapasitesi o geçici bir çözüm gerekiyordu.

Dene:)

Nasıl çalışır

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.