Polisleri ve Soyguncuları Hardcode (Soyguncular)


12

Bu bir mücadelesi. Polislerin bu mücadeleye verdiği konu burada

Düşünülmesi gereken ilginç bir soru şudur:

Bir sayı dizim varsa, hangi diziden bahsettiğimi netleştirmeden önce kaç tane vermem gerekiyor?

Başlayarak sırayla Mesela ben pozitif tamsayılar hakkında konuşmak istiyorsanız 1 , ben söyleyebiliriz 1,2,3, , ama bu gerçekten yeterli mi?

Ben bu soruyu cevaplamak için bir yolu var, ve bir kod golfçü olmak Bu kod golf içerir. Bu terimleri üreten en kısa kod dizinin tüm terimlerini üretiyorsa, bir dizi için yeterli terim sağladınız. Bunu kod golfü açısından düşünürsek, bu, test senaryolarını geçen en kısa kod istenen görevi yerine getirecek kadar test vakası sağladığınız anlamına gelir.

Meydan okuma

Bu meydan okuma bir mücadelesidir. Polislerin test senaryoları sunacağı ve soyguncular, test senaryolarını amaçlanan sekans dışında taklit etmek için daha kısa bir yol bulmak zorunda kalacaklar. Polisler şu şeyleri sunacak:

  • Girdi olarak pozitif bir tamsayı alan ve çıktı olarak bir tamsayı üreten bir kod parçası. Bu kod sıfır veya bir dizinlenmiş olabilir ancak dizinlemenin ne olduğu açık olmalıdır. Bu kod dizinizi tanımlar.

  • Çıktıyı etkileyebilecek ilgili platform veya dil gereksinimleri, örneğin longint boyutu.

  • Kod tarafından hesaplandığı gibi dizinin ilk n terimleriyle birlikte bir sayısı . Bunlar "test senaryoları" olarak işlev görecektir.nn

Soyguncular, sunulandan daha kısa olan ve tüm test senaryolarını geçen bir dilde bir program bulacaktır ( polisin koduyla ilk girişler için aynı çıktıyı üretir ). Soyguncunun kodu da n'den büyük bir sayı için polisin programından çıktı olarak farklı olmalıdır .nn

puanlama

Soyguncular buldukları çatlak sayısında daha fazla çatlak daha iyi olur. Bir cevap, orijinal çatlaktan daha kısa geçerli bir cevap bulunarak tekrar kırılabilir. Bir cevap ikinci kez kırılırsa, ilkinden ziyade ikinci krakere nokta verilir.


2
Soyguncuların bir cevabı kırmak için birbirlerini dövmelerine izin vermiyor muyuz (yani kazanan dilin en kısa çatlağı)
fəˈnɛtɪk

@ fəˈnɛtɪk Sesler, güzel ekledim.
Ad Hoc Garf Hunter

Yanıtlar:



5

JavaScript, fəˈnɛtɪk'un yanıtı (17 bayt)

x=>"11237"[x]||22

Çok daha düşük bir puan elde etmek zor kodlamak kolay oldu ... Herhangi bir giriş için referans uygulamadan farklıdır , 0 endeksli. Bu çok iyi bilinen bir JS golf hüner kullanır: sınırlarını aşan bir tamsayı ile bir diziye endeksleme, bir falsy değeri ( ) döndürür , böylece buradaki mantıksal OR ( ) kullanılarak basitçe varsayılan bir değere zorlanabilir. durumda , dizinin son terimini değil, takip edeceklerini de ele alır.x6undefined||22

Test yapmak

let f=x=>"11237"[x]||22

for (x of [1,2,3,4,5,6,7]) {
  console.log(x + ' -> ' + f(x))
}

Alternatif olarak, çevrimiçi deneyin!


4

Haskell , Laikoni'nin cevabı , 15 bayt

b n=n*div(n+1)2

Çevrimiçi deneyin!

Genellikle bir yorumda böyle bir şeye işaret ederdim, ama sonra polisler ve soyguncuların biraz daha kesik olduğunu düşündüm.

Bu sadece BMO'nun cevabı eksi özel durum b 42. Laikoni'nin orijinali kayan noktadan geçtiğinden, gerekli değildir: sadece yuvarlama hataları verecek kadar büyük bir sayı bulun, ancak tam Integeraritmetik değil . Örneğin:

a 100000000000000000000000 = 4999999999999999580569600000000000000000000000
b 100000000000000000000000 = 5000000000000000000000000000000000000000000000

Bunun mümkün olabileceğini düşündüm (bu yüzden gerekli terimler için yeniden yazılabileceğini yazdım) ama işe yaradığı bir değer bulamadım.
ბიმო

4

Python 2 , xnor'un cevabı , 43 bayt

İlk fark :n=69

f=lambda n,p=2:n<1or-~f(n-(~-2**p%p<2),p+1)

Çevrimiçi deneyin!

Kredi

Bu çatlağın için kredi bir hayli gitmelisiniz @ Mr.Xcoder ilk ve bu yöntemi kullanarak olası bir saldırı hakkında bir yorum yayınladı kim @PoonLevi bir 44 bayt çözüm buldu.

Nasıl?

teori

Çatlak, Fermat'ın asal ve a ve p'nin nispeten asal olduğunu belirten küçük teoremine dayanır :pbirp

(1)birp-11(şıkp)

Özellikle, :bir=2

2p-11(şıkp)

Yani bazı pozitif tamsayı öyle ki:k

2p-1=kp+1

Hangi yol açar:

2 p - 1 = 2 k p + 1 2 p - 1 1

2p=2kp+2
2p-1=2kp+1
(2)2p-11(şıkp)

Bu son formül, Python kodunun türetildiği ve şimdi için geçerli olan formüldür, ancak 2 kendisi ile nispeten asal olmasa da .p=22

Şimdi, en önemli kısım için: Fermat'ın küçük teoreminin tersi doğru değil. Biz olabilir bazıbileşiksayısı için n . Böyle sayılar denirFermat pseudoprimestaban için a . Baz 2'ye Fermat psödoprimleriPouletsayılarıolarak da bilinir.birn-11(şıkn)nbir

Baz (veya ilk Poulet numarasına) ilk Fermat yalancı suçu n = 341 = 11 × 31'dir , bunun için:2n=341=11x31

2 341 - 1 1

2341-11(şık341)
2341-11(şık341)

Bu araçlar bizim algoritma dönmek için gidiyor yerine beklenen 69 inci asal 347 .341347

uygulama

@PoonLevi doğrudan dayanan şu 44 baytlık çözümü buldu :(2)

f=lambda n,p=1:n and-~f(n-(~-2**p%p==1),p+1)

Kullanarak <2yerine ==1, biz 1 byte kaydetmek ama biz tanıtmak , dizinin içine nedeniyle 2 1 - 1 01 :21-10(şık1)

f=lambda n,p=1:n and-~f(n-(~-2**p%p<2),p+1)

Çevrimiçi deneyin!

ile başlayarak , beklenen terimleri 1 oranında alırız çünkü bir yineleme daha az yaparız:p=2

f=lambda n,p=2:n and-~f(n-(~-2**p%p<2),p+1)

Çevrimiçi deneyin!

Son hile n<1oryerine kullanmaktır n and. Bu kadar uzundur ancak son yinelemenin 0 yerine True olmasını sağlar , böylece her bir terime eksik sapma eklenir.


Her şey için tebrikler! Aklımdaki çözüm bu. Meydan okuma motivasyonundan, "Hangi sekans hakkında konuştuğumun açıklığa kavuşturulmasından önce kaç tanesine sahip olmam gerekiyorsa?", İlk 50 asilin yeterli olmadığı - Python golfingli bir uzaylı farklı bir diziden bahsettiğinizi varsayar.
xnor

@xnor "Python-golfing yabancı" fikrini seviyorum
dylnan



2

Haskell , Laikoni'nin cevabı , 26 22 bayt

Laikonidiv sayesinde infix kullanmadan -4 bayt !

b 42=0;b n=n*div(n+1)2

Çevrimiçi deneyin!

açıklama

0n20ceiling(realToFrac n/2)div(n+1)2n>20

b 42=0

Ah, bunu düşünmedim. Biraz daha fazla bulmaca yapmak istediğinizde 20 baytlık bir çatlağa neden olan farklı bir yaklaşımım var. Ayrıca ((n+1)`div`2)-> div(n+1)2.
Laikoni

@Laikoni: Evet, henüz açıklama! Maalesef, evet biraz golf oynadığımdan beri biraz zaman geçti, güncelleyeceğim.
ბიმო

2

> <> , Crashoz cevabı 203 bayt

:l2-$g:0=?;n:





M
-
B
"
BM
",
7M
!"
BBM
!",
7CM
!"-
BBBM
!!",
7BBMM
!!,,
7BBBMM
!!,,
7BBBMM
!!!,,
7BBBBMM
!!!,,
7BBBBMM
!!!!,,
7BBBBBMM
!!!!,,
7BBBBBMM
!!!!!,,
7BBBBBBMM

Çevrimiçi deneyin!

Yukarıdaki tek / çift sayıların n=20merkezde tekrarlanan bir öğe dışında aynı olduğu gerçeğiyle akıllıca bir şey yapacaktım , ancak her öğeyi zor kodlamak daha kolaydı.

Giriş -vbayrak üzerinden yapılır . 34'ün üzerindeki öğeler için hiçbir şey yazdırmaz.


2

Pascal (FPC) , AlexRacer'ın yanıtı , 80 bayt

var n,m:word;begin read(n);while n<>0 do begin n:=n div 2;m:=m+n;end;write(m)end.

Çevrimiçi deneyin!

0n120n=128127126

Bu geç bir cevap gibi görünüyor, ama yine de iyi bir bulmaca için @AlexRacer teşekkürler!


1
Vay canına, bu sahip olduğumdan bile daha kısa. PPCG'ye Hoşgeldiniz!
AlexRacer



1

Kabuk , çatlama BMO en 5 Byter ile  3  2 byte

-1 BMO sayesinde ( LdΣ-> , çünkü, belirli bir zaman Tnum, Lyapar "dizge temsil uzunluğu")

Çevrimiçi deneyin!

bir(0)bir(23)bir(24)
3←d+164

T(0)=010


Tebrikler, tam çözümüm buydu! Ancak ben sadece TNum s için kaydetti Lve Ld eşdeğer olduğunu size bir bayt tasarrufu;)
ბიმო

Ah, dijital uzunluğu bulmaya çalışmak için wiki'de "basamak" ı aradım, ancak bunun Lgeçersiz kılınması için "dize gösterim uzunluğu" olarak fark etmedim Tnum.
Jonathan Allan

(Yalnızca negatif olmayan tamsayılara eşdeğer olduklarını unutmayın - bunun için yeterince iyi.)
Jonathan Allan


0

JavaScript, fəˈnɛtɪk'in yanıtı , 23 bayt

0n14

x=>14-`${73211e9}`[x]|0

Çevrimiçi deneyin!

Nasıl?

İfade , beklenen diziyi veren 14'ten çıkarılan 14 değerinden oluşan bir arama tablosu sağlayarak `${73211e9}`dizeye genişler "73211000000000".

n14

(14 - undefined) | 0
=== NaN | 0
=== 0

21 bayt

NaNn14

x=>14-`${73211e9}`[x]

Çevrimiçi deneyin!

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.