Polisleri ve Soyguncuyu Kodlama (Polisler)


28

Bu bir mücadelesi. Soyguncuların ipliği burada .

Düşünmek için ilginç bir soru şudur:

Eğer bir sayı sırasına sahipsem, hangi sıradan bahsettiğimi belli etmeden önce bunlardan kaç tane sağlamalıyım?

Mesela ben başlayarak sırayla pozitif tamsayılar hakkında konuşmak istiyorsanız , ben söyleyebiliriz , ama gerçekten yeterli olmasıdır?11,2,3,...

Bu soruyu cevaplamanın bir yolu var ve kod golfçü olarak kod golf oynamaktan hoşlanıyor. 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 durumlarını geçen en kısa kodun istenen görevi yerine getirmesi için yeterli test vakası sağladığınız anlamına gelir.

Meydan okuma

Bu meydan okuma bir mücadelesidir. Hangi polislerin test senaryoları sunacakları ve soyguncular test vakalarını amaçlanan sekanstan başka bir sahtekarlıktan daha kısa bir yol bulmak zorunda kalacaklar. Polisler aşağıdakileri sunacak:

  • Girdi olarak negatif olmayan bir tamsayı alan ve çıktı olarak bir tamsayı üreten bir kod parçası. Bu kod dizinizi tanımlayacaktır. Kodunuzun 0'ı giriş olarak desteklemesi gerekmez, bunun yerine en küçük giriş olarak 1 değerini seçmez. Cevabınız böyle ise açık olmalı.

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

  • Kod tarafından hesaplanan dizinin ilk terimleriyle birlikte bir sayısı . Bunlar "test durumları" olarak görev yapacak.nnn

Dizininizin ne yaptığını açıklamanız ve varsa OEIS'i bağlamanız teşvik edilir, ancak dizilim tanımını değil, tanımlayan kodunuzdur.

Soyguncular, aynı dilde sunulan programdan daha kısa bir program bulacak ve tüm test senaryolarını geçecek (ilk girişler için polisin koduyla aynı çıktıyı üretecek). Soyguncunun kodu, den daha büyük bir sayı için polisin programından çıkan çıktıda da farklı olmalıdır .nnn

Polisler göndermeden önce kendi cevaplarını kırabilmeli.

Bir hafta sonra bir polis olabilir onların çatlak açığa ve Güvenli olarak onların cevabı işaretleyin. Bu şekilde işaretlenmiş cevaplar artık kırılamaz.

puanlama

Polis cevapları daha az byte'ın daha iyi olduğu byte sayısı ile puanlanacaktır. Çatlak cevaplar sonsuz bir puan alıyor.


Sadece tüm test vakalarını yazdırmak gibi matematiksel olmayan bir problemi çözmenin yolları olduğu açıktır, ancak bu konu polislerin verdiği davalara bağlıdır. Bununla ilgili bir kural olmalı mı? Dizilerin hesaplanabilirliğine veya Ramsey Teorisi'ne ait herhangi bir şeye karşı bir kısıtlama var mı? (yani makinenizi
kırabilmeniz

2
@Reallyumdub soruyu kendi gönderiminizi çözebilmeniz gerektiğini öngörür.
Buğday Sihirbazı,

@CatWizard Teşekkürler, devam ettim ve bu zaten açık bir meta yayında, bu görünüşe göre bu adamların bazılarını engelliyor. Bu yüzden, hesaplamak için bir saatten fazla bir zaman
harcayan


"Teorik olarak çözümünüz uygulamada tüm sayılar için çalışmalı, ancak uygulama için çalışmalı ..." durumu var mı?
user202729

Yanıtlar:


6

cQuents , 4 bayt ( Kırık )

"::$

Çevrimiçi deneyin!

İşte sekiz ( n=8) vaka:

1 1
2 12
3 123
4 1234
5 12345
6 123456
7 1234567
8 12345678

Kod açıklaması:

"      Stringify sequence (join on "", remove it and see what happens)
 ::    Given input n, output all items in the sequence up to and including n
   $   Each item in the sequence equals the index

Böylece sıra, 1,2,3,4,5 ...birleşir, ""böylece olur 12345 ...ve ::girdiye kadar yazdığı anlamına gelir.



5

Python 3 , 66 57 bayt ( Kırık )

xnor tarafından cracked
ayrıca bir düzenlemeden önce Cat Wizard tarafından da çatladı

def f(n):x=n/10-2;return int(x*60-x**3*10+x**5/2-x**7/84)

Çevrimiçi deneyin!

Merhaba! Burada için kırılacak bir dizi var . Bu ilk 40 elemanı 0 indekslemeli olarak veriyor, OEIS dizisi değiln=40

[-54, -56, -58, -59, -59, -59, -59, -57, -55, -53, -50, -46, -43, -38, -33, -28, -23, -17, -11, -5, 0, 5, 11, 17, 23, 28, 33, 38, 43, 46, 50, 53, 55, 57, 59, 59, 59, 59, 58, 56]

Boşlukları kaldırmayı unuttum, henüz uzman bir golfçü değilim: p Bunu düzeltmek için düzenleme yapmamın sakıncası var mı?
crashoz

Tabi devam et. Çatlaklarımı gideririm.
Buğday Sihirbazı,


5

Python 2,44 bayt ( kırık )

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

Çevrimiçi deneyin!

Asal sayılar. Hangi sıra daha saf olabilir? Veya daha fazla abartılı ? Amacınız için ilk 50 asal üretmektir n=1için n=50.

Kod, bu ipucundan kopyalanan bir Wilson Teoremi jeneratörüdür .

Alternatif dizilim için farklı değerler taşma ve hassasiyet gibi makine sınırlamalarından kaynaklanmaz. 3. parti kütüphanesi yok.


Çatlak Arnauld, @PoonLevi ve Bay Xcoder tarafından.


Oldukça emin çatlatan almak istemedim bu ; belki "Python (3. parti kütüphaneleri olmadan)") veya "Python (ithalat olmadan)" veya başka bir şey belirtebilirsiniz?
Jonathan Allan

@JonathanAllan Teşekkürler, 3. parti kütüphanelerinin olmadığını yazdım.
xnor

Bunu henüz çözemedim (şu anki en iyi girişimim 47 byte ya da öylesine), ama bence bu belirli ilkeler hakkında dikkat edilmesi gereken ilginç bir şey var. Her biri için ile, i [ 1 , 50 ] N , bu geçerlidir: 2 s ı2 ( mod  p i ) . Aynı zamanda, bunun için doğru değildir herhangi (aralık yukarıda belirtilen olarak) asal değildir sayı, ancak doespbenben[1,50]N-2pben2(şık pben)yani daha yüksek değerler için. Bu fikri burada bırakıyorum, böylece diğerleri söz konusu tekniği kullanarak ellerine bir çatlak atmaya çalışacaklar ve belki de daha iyi bir skor elde edecekler :)
Bay Xcoder

@ Mr.Xcoder Burada önerilen yönteminize dayanarak en iyi girişimim. N = 69'da başarılı bir şekilde ayrışarak 341'i döndürür (ilk Fermat psödoprimi baz 2'ye veya ilk Poulet numarasına) ancak aynı zamanda N = 1 için de başarısız olur. Kendi başıma halledebileceğimden şüpheliyim, bu yüzden sahip olduğumu daha iyi paylaşabileceğimi düşündüm. (En iyi
fikrim

1
@Arnauld Bu yöntemi kullanarak 44 baytlık bir çözüm buldum . Daha ileri gidemiyorum. Belki başka biri bunu çözebilir.
Poon Levi

4

Wolfram Dili (Mathematica) , 39 34 bayt (Güvenli)

Check[{1,9,7}[[#]],18+Boole[#>9]]&

Çevrimiçi deneyin!

Basit görünüyor, çözüm zor olmalı.

1 indeksli ve . Bu dizi OEIS'de mevcut değil.n=99

{1, 9, 7, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19}

Yukarıdaki liste şuna eşittir:

Join[{1, 9, 7}, Table[18, 6], Table[19, 90]]

İşte çözümünüzü kontrol etmek için bir şablon: Çevrimiçi deneyin!

Amaçlanan Çatlak

Buradaki mandal, ilk üç terim hariç, hane sayısı 1 artarken çıktı 1 artar; amaçlanan çözümün dizge dönüştürmeyle ilgisi var.

Bu nedenle, İfadeler ve Dize Arasında Dönüştürme belgesini okumak bir işlevi bulabilir SpokenString.

Çözüm, ifadenin x^nçeşitli girdiler için konuşulan dizgeli versiyonunun uzunluğu.StringLength@SpokenString[x^#]&


3

Haskell , 29 bayt (Kırık: 1 , 2 )

a n=n*ceiling(realToFrac n/2)

Çevrimiçi deneyin!

Bu A093005 : .bir(n)=nn2

olan test durumları :0n20map a [0..20]

[0,1,2,6,8,15,18,28,32,45,50,66,72,91,98,120,128,153,162,190,200]

Amaçlanan çözüm (20 bayt)

b n=sum$n<$show(3^n)

Çevrimiçi deneyin! Farklılık gösterir ile, bir ( 23 ) = 276 ve B ( 23 ) = 253 .n=23bir(23)=276b(23)=253

Bu fonksiyon, eşdeğerdir . Tavan sayesinde her iki fonksiyon da 0 - 22 aralığındaki tamsayı argümanları için çakışıyor :b(n)=n len(3n)=nlOg10(1+3n)022

kaynak



@Likonikon, eğer amaçlanan çatlak daha kısa ise, bir başkası soyguncuyu BMO'dan potansiyel olarak talep edebilir.
f Julnɛtɪk

@ fəˈnɛtɪk Teşekkürler, bu kuralın farkında değildim.
Laikoni


2
@BMO Oraya gitmek :)
Laikoni

2

JavaScript (ES6), 12 bayt ( Kırık )

Bu oldukça kolaydır.

n=>n*(8*n+1)

Çevrimiçi deneyin!

Bu A139275 :

bir(n)=n(8n+1)

Kodunuz :0n<9

0,9,34,75,132,205,294,399,520

Ve meydan okuma kurallarına göre, ötesine geçmesi gerekir.


n=>8*n*n+niçin n=94906273geçerli, bu geçerli bir çatlak mı?
ngn

@ngn Bu meydan okuma kurallarına göre benim için geçerli gözüküyor, ancak OP'ye hassasiyetin kaybının geçerli bir sapma olarak sayılıp sayılmadığını sormalısınız. Amaçlanan çatlak n=9olsa da, farklıdır .
Arnauld,

@CatWizard ^
ngn

Geçerli bir çatlak olduğunu söyleyebilirim.
Buğday Sihirbazı,

2
kırık ( |yerine +)
ngn

2

Malbolge, 10 bayt

ub&;$9]J6

Kodun bir 0x14 (cihaz kontrolü 4) bayt ile sona erdiğini unutmayın.

Çevrimiçi deneyin!

Kırılması gereken 0 indeksli dizi [9, 19, 29].


2

> <> , 276 bayt ( Kırık )

1$1-:?!v$:      1[0$          >:?!va2[$:{:@%:{$-{,]v
       >$n; v              <  ^   >~{]02.1+1+ffr+1r<
 :}[r]{  [01>:{*@@+$a*l2=?!^~]+ff+9+1g"3"=?v"3"ff+9+1pf0.
 :}[l01-$>    $:0(?v$@$:@@:@)?v@@1-$}v     >"2"ff+9+1p00.
>.       ^-1l v!?} <  .4a}$@@$<   .4a<
^26{]r0[}:{]~{<

Çevrimiçi deneyin! -v nN. Öğeyi (1 indeksli) almak için bunu bir tane ile çağırın

1$1-:?!;$::n84*o1[0$          >:?!va2[$:{:@%:{$-{,]v
            v              <  ^   >~{]02.1+1+ffr+1r<
 :}[r]{  [01>:{*@@+$a*l2=?!^~]+ff+9+1g"3"=?v"3"ff+9+1pf0.
 :}[l01-$>    $:0(?v$@$:@@:@)?v@@1-$}v     >"2"ff+9+1p00.
>.       ^-1l v!?} <  .4a}$@@$<   .4a<
^26{]r0[}:{]~{<

Çevrimiçi deneyin! -v n1'den başlayarak n-1 elementlerin bir listesini almak için arayın.

Çevrimiçi Balık Tercüman

Uzun ve karmaşık bir, bu OEIS A004000 .

A (n) = k olsun, m hanesini, k rakamını tersine çevirerek, m 'yi k' ye ekleyin. Sonra (n + 1) elde etmek için toplamın rakamlarını artan sırada sıralayın.

Örnek: 668 -> 668 + 866 = 1534 -> 1345.

n=34

1 2 4 8 16 77 145 668 1345 6677 13444 55778 133345 666677 1333444 5567777 12333445 66666677 133333444 556667777 1233334444 5566667777 12333334444 55666667777 123333334444 556666667777 1233333334444 5566666667777 12333333334444 55666666667777 123333333334444 556666666667777 1233333333334444 5566666666667777

Kişi verilen nsoru için tek bir çıktı elde etmek için programı nasıl çalıştırır (sorunun gerektirdiği gibi)?
Jonathan Allan,

Balıklarda gerçekten "işlevler" olmadığından, n-inci değerini almak için çağırabileceğiniz bir sürüm ekledim (aslında aynıdır, çünkü önceki n-1 öğelerini hesaplamak zorundadır)
crashoz

Daha da önemlisi, tek çıktıyı veren aynı girdi indekslemesine uyan bir çatlağınız var mı?
Jonathan Allan

1
1<=n<=34n>34


2

Jöle , 6 byte , Güvenli!

<4+ạ2ȯ

Bu, sıfır dizinli bir diziyi tanımlar :

bir(n)={1n<32n=3n-2n>3

bir(0)bir(15)1,1,1,2,2,3,4,5,6,7,8,9,10,11,12,13

Çevrimiçi deneyin! ( burada tek bir değer sürümüdür)

Bu şu anda OEIS’de bulunmamakta ( A34138 yeterince kısa ise çatlak olarak çalışsa da)

Amaçlanan Çatlak

16n
17inci1070045392852801514=bir(16)

!ÆsDL


1

JavaScript, 26 bayt ( Kırık )

let f=x=>x>1?f(x-1)*f(x-2)+1:1

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

OEIS A007660

Çıktı, 0 indekslemeli ilk 6 elementtir (1,1,2,3,7,22)

(biraz OEIS'in listelendiği listeden değiştirildi)

Sadece işleri halletmek için basit bir çözüm bulmak

Çevrimiçi deneyin!



Örnek snippet'inizin çıkışı 0'da değil 1'de başlar?
Paŭlo Ebermann

@ PaŭloEbermann Bu
düzeltme






0

> <> , 42 bayt, çatlak

i3%0v
642 .
840
789
159
a 1
v<<
n
l
?
\/
;

Çevrimiçi deneyin!

Çatlama sırası (0 indeksli): 101786, 5844, 19902(OEIS'de değil).

Amaçlanan çözüm , referans için.



Genellikle Soyguncular sert çıktı kodlama olmalıdır
Jo Kral

@JoKing Senin çatlağın benimkinden farklı bir değer üretmiyor gibi görünüyor (ya da belki hangi değerlerin farklı olduğunu bulmak için yeterince test etmedim), ama bu muhtemelen kolayca düzeltilebilir. Kodlamayı yasaklayan kurallarda hiçbir şey görünmemekle birlikte, meydan okuma ruhuna uymayabileceğini kabul ediyorum - her durumda, kodlamanın (bir polis için) kendi riskleriyle geldiğini kanıtladınız.
Aidan F. Pierce,

1
Ben için farklı bir değer üretmek için benim cevap güncelledik4
Jo Kral

0

Perl 6 , 53 bayt

{(1,2,2,{$!=++$;prepend(@,2-$!%2 xx$_).pop}...*)[$_]}

Çevrimiçi deneyin!

0 dizinli Kolakoski dizisini ( OEIS A000002 ) döndüren adsız kod bloğu . Çözümlerin ilk 130 n > 129öğeyle eşleşmesi gerekir, bu nedenle bazıları için Kolakoski dizisinden farklıdır.


0

Pascal (FPC) , 86 bayt ( kırık )

var n:word;begin read(n);write(n div 2+n div 4+n div 8+n div 16+n div 32+n div 64)end.

Çevrimiçi deneyin!

n=120

0   0   1   1   3   3   4   4   7   7   8   8  10  10  11  11  15  15  16  16  18  18  19  19  22  22  23  23  25  25  26  26  31  31  32  32  34  34  35  35  38  38  39  39  41  41  42  42  46  46  47  47  49  49  50  50  53  53  54  54  56  56  57  57  63  63  64  64  66  66  67  67  70  70  71  71  73  73  74  74  78  78  79  79  81  81  82  82  85  85  86  86  88  88  89  89  94  94  95  95  97  97  98  98 101 101 102 102 104 104 105 105 109 109 110 110 112 112 113 113 116


Orijinal çözümüm

var n,i,s:word;begin read(n);i:=2;repeat s:=s+n div i;i:=i*2until i>n;write(s)end.

ama r_64 daha da iyi yaptı !


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.