Hardcoding Polisi dan Perampok (Perampok)


12

Ini adalah tantangan . Utas Polisi untuk tantangan ini ada di sini

Pertanyaan menarik untuk dipikirkan adalah sebagai berikut:

Jika saya memiliki urutan angka, berapa banyak dari mereka yang harus saya berikan sebelum jelas urutan apa yang saya bicarakan?

Sebagai contoh jika saya ingin berbicara tentang bilangan bulat positif agar mulai dari , saya dapat mengatakan , tetapi apakah itu benar-benar cukup?1 , 2 , 3 , 11,2,3,

Saya punya satu cara untuk menjawab pertanyaan ini, dan menjadi pegolf-kode Ini melibatkan golf kode. Anda telah memberikan ketentuan urutan yang cukup jika kode terpendek yang menghasilkan istilah tersebut menghasilkan semua ketentuan urutan tersebut. Jika kami memikirkan hal ini dalam hal kode-golf, ini berarti Anda telah memberikan cukup uji kasus sehingga kode terpendek yang lulus uji-kasus melakukan tugas yang diinginkan.

Tantangan

Tantangan ini adalah tantangan . Di mana polisi akan mempresentasikan kasus uji dan perampok harus menemukan cara yang lebih pendek untuk menipu kasus uji selain dari urutan yang dimaksud. Polisi akan menyajikan hal-hal berikut:

  • Sepotong kode yang mengambil integer positif sebagai input dan menghasilkan integer sebagai output. Kode ini bisa nol atau satu diindeks tetapi harus jelas apa pengindeksannya. Kode ini akan menentukan urutan Anda.

  • Persyaratan platform atau bahasa apa pun yang relevan yang dapat mempengaruhi keluaran, misalnya ukuran longint.

  • Sejumlah , bersama dengan istilah pertama dari urutan sebagaimana dihitung oleh kode. Ini akan bertindak sebagai "kasus uji".nnn

Perampok akan menemukan program dalam bahasa yang sama yang lebih pendek dari yang disajikan dan melewati semua kasus uji (menghasilkan output yang sama untuk input pertama sebagai kode polisi). Kode perampok juga harus berbeda dalam output dari program polisi untuk beberapa nomor lebih besar dari .nnn

Mencetak gol

Perampok akan dinilai dalam jumlah retakan yang mereka temukan dengan lebih banyak retakan yang lebih baik. Sebuah jawaban dapat di-crack kembali dengan menemukan jawaban yang valid lebih pendek dari pada yang asli. Jika jawaban di-crack-kan untuk kedua kalinya, intinya diberikan ke cracker kedua daripada yang pertama.


2
Apakah kita tidak akan membiarkan perampok saling memukuli untuk memecahkan sebuah jawaban (yaitu retakan terpendek dalam memenangkan bahasa)
fəˈnɛtɪk

@ fəˈnɛtɪk Kedengarannya, bagus saya menambahkan itu.
Ad Hoc Garf Hunter

Jawaban:



5

JavaScript, jawaban fəˈnɛtɪk (17 byte)

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

Yah itu mudah untuk hardcode untuk mendapatkan skor yang jauh lebih rendah ... Berbeda dari implementasi referensi untuk setiap entri , 0-diindeks. Ini menggunakan trik golf JS yang sangat terkenal: pengindeksan ke dalam urutan dengan bilangan bulat yang melebihi batas mengembalikan nilai falsy ( ), sehingga hanya dapat dipaksa ke nilai default dengan menggunakan logika OR ( ), dalam hal ini kasus , menangani istilah terakhir dari urutan tetapi juga yang mengikuti.x6undefined||22

Pengujian

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

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

Atau, Coba online!


4

Haskell , jawaban Laikoni , 15 byte

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

Cobalah online!

Saya biasanya akan menunjukkan hal seperti ini dalam komentar, tetapi kemudian saya berpikir, polisi dan perampok sedikit lebih jengkel.

Ini hanya jawaban BMO dikurangi kasus khusus untuk b 42. Karena dokumen asli Laikoni menggunakan floating point, itu tidak perlu: cukup temukan angka yang cukup besar untuk memberikan kesalahan pembulatan dalam hal itu tetapi tidak dalam Integeraritmatika yang tepat . Sebagai contoh:

a 100000000000000000000000 = 4999999999999999580569600000000000000000000000
b 100000000000000000000000 = 5000000000000000000000000000000000000000000000

Saya berpikir bahwa ini mungkin (karena itu saya menulis bahwa itu dapat ditulis ulang untuk persyaratan yang diperlukan) tetapi tidak menemukan nilai yang berfungsi .. Baik dilakukan!
ბიმო

4

Python 2 , jawaban xnor , 43 byte

Perbedaan pertama terjadi untuk :n=69

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

Cobalah online!

Kredit

Banyak penghargaan untuk crack ini harus diberikan kepada @ Mr.Xcoder yang pertama kali memposting komentar tentang kemungkinan serangan menggunakan metode ini, dan ke @PoonLevi yang menemukan solusi 44-byte.

Bagaimana?

Teori

Retak didasarkan pada teorema kecil Fermat yang menyatakan bahwa jika adalah prima dan dan relatif prima, maka:a ppap

(1)ap11(modp)

Secara khusus, untuk :a=2

2p11(modp)

Jadi ada beberapa bilangan bulat positif sehingga:k

2p1=kp+1

Yang mengarah ke:

2p=2kp+2
2p1=2kp+1
(2)2p11(modp)

Rumus terakhir ini adalah salah satu kode Python berasal dan sekarang berlaku untuk , meskipun relatif tidak prima dengan dirinya sendiri.p=22

Sekarang, untuk bagian terpenting: kebalikan dari teorema kecil Fermat tidak benar. Kita mungkin memiliki untuk beberapa bilangan komposit . Angka-angka semacam itu disebut pseudoprim Fermat sebagai basis . Fermat pseudoprimes ke basis 2 juga dikenal sebagai nomor Poulet .an11(modn)na

Pseudoprime Fermat pertama ke basis (atau nomor Poulet pertama) adalah , yang kita miliki:2n=341=11×31

2 341 - 1 1

234111(mod341)
234111(mod341)

Ini berarti bahwa algoritma kami akan kembali bukannya diharapkan 69 th prima .347341347

Penerapan

@PoonLevi menemukan solusi 44-byte berikut, yang secara langsung didasarkan pada :(2)

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

Dengan menggunakan <2alih-alih ==1, kami menyimpan 1 byte tetapi kami memperkenalkan ke dalam urutan, karena :2 1 - 1 012110(mod1)

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

Cobalah online!

Dengan memulai dengan , kita mendapatkan ketentuan yang diharapkan sebesar 1 karena kita melakukan satu iterasi lebih sedikit:p=2

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

Cobalah online!

Trik terakhir adalah menggunakan n<1oralih-alih n and. Ini sama panjangnya tetapi menjadikan iterasi terakhir menghasilkan True alih-alih 0 , karenanya menambahkan offset yang hilang ke setiap istilah.


Selamat kepada kalian semua! Ini adalah solusi yang ada dalam pikiran saya. Saya pikir itu lucu bahwa, dari motivasi tantangan "Jika saya memiliki urutan angka berapa banyak dari mereka yang harus saya berikan sebelum jelas urutan apa yang saya bicarakan?", 50 prima pertama tampaknya tidak cukup - alien Python-golfing akan menganggap Anda berbicara tentang urutan yang berbeda.
xnor

@ xnor Saya suka ide "alien Python-golfing"
dylnan

3

Python 3 , crashoz , 45 byte

lambda n:int(60*math.sin(n/10-2))
import math

Cobalah online!

Ungkapannya x*60-x**3*10+x**5/2-x**7/84adalah deret Taylor untuk hingga term , dikalikan dengan 60. Ini cukup akurat pada input yang digunakan, tetapi untuk nilai yang lebih tinggi, keduanya akan berbeda ketika istilah terpotong menjadi lebih relevan.x 7sin(x)x7



2

Haskell , jawaban Laikoni , 26 22 byte

-4 byte dengan tidak menggunakan infix div, terima kasih kepada Laikoni !

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

Cobalah online!

Penjelasan

Untuk istilah ini dapat ditulis ulang karena memberi kita cukup byte untuk mencocokkan pola pada yang mengarah ke celah dalam 28 byte:n > 200n20ceiling(realToFrac n/2)div(n+1)2n>20

b 42=0

Ah, saya tidak memikirkan itu. Saya memiliki pendekatan berbeda yang mengarah ke celah 20 byte jika Anda ingin teka-teki lebih banyak. Juga ((n+1)`div`2)-> div(n+1)2.
Laikoni

@Laikoni: Ya, jangan ungkapkan dulu! Oopsi, ya sudah agak lama sejak saya bermain golf, saya akan memperbaruinya.
ბიმო

2

> <> , jawaban crashoz 203 byte

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





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

Cobalah online!

Saya akan melakukan sesuatu yang pintar dengan fakta bahwa angka ganjil / genap di atas n=20adalah sama kecuali untuk elemen berulang di tengah, tetapi lebih mudah untuk hanya kode yang keras setiap elemen.

Input melalui -vflag. Mencetak apa pun untuk elemen di atas 34.


2

Pascal (FPC) , jawaban AlexRacer , 80 byte

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

Cobalah online!

Ketika output identik, tetapi ketika kode di atas mengeluarkan , sedangkan kode AlexRacer menghasilkan .n = 128 127 1260n120n=128127126

Ini sepertinya jawaban yang terlambat, tapi terima kasih @AlexRacer untuk puzzle yang bagus!


1
Wow, ini bahkan lebih pendek dari yang saya miliki. Selamat datang di PPCG!
AlexRacer

1

JavaScript, jawaban fəˈnɛtɪk (12 byte)

Ini berfungsi untuk nilai yang diberikan tetapi gagal untuk banyak nilai lainnya (misalnya ) karena kesalahan presisi.x=6

x=>2.72**x|0

Pengujian

g=
x=>2.72**x|0

tmp=[0,1,2,3,4]
console.log(tmp.map(g).join(','))

Atau, Coba online!


1

JavaScript, jawaban fəˈnɛtɪk (17 byte)

Anda dapat melihat di tautan TIO atau dalam hasil Stack Snippet bahwa gagal untuk entri yang lebih tinggi dari .15

x=>2.7182819**x|1

Jika akurasi hanya diperlukan untuk (nilai pertama ), maka akan berfungsi juga untuk 16 byte.15n1415x=>Math.exp(x)|1

Pengujian

f=x=>2.7182819**x|1
g=x=>(3-(5/63)**.5)**x|1

tmp=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]
console.log(tmp.map(f).join(","))
console.log(tmp.map(g).join(","))

Atau, Coba online!


1

Sekam , memecahkan 5 byter BMO dengan  3  2 byte

-1 terima kasih kepada BMO ( LdΣ-> karena, ketika diberi Tnum, Lmelakukan "panjang representasi string")

Cobalah online!

Panjang digital dari angka segitiga * cocok kemudian berbeda pada ... saat menghasilkan sedangkan menghasilkan .a ( 24 ) 3 4a(0)a(23)a(24)
3←d+164

* Di mana memiliki panjang digital (bukan )1 0T(0)=010


Selamat, itu solusi tepat saya! Namun saya hanya mencatat bahwa untuk TNum s Ldan Ld setara penghematan Anda byte;)
ბიმო

Ah, saya mencari "digit" di wiki untuk mencoba menemukan digital-length, tetapi tidak menemukan yang Lmenimpa sebagai "length of string Representation" Tnum.
Jonathan Allan

(Perhatikan bahwa mereka hanya setara untuk bilangan bulat non-negatif - cukup baik untuk ini.)
Jonathan Allan


0

JavaScript, jawaban fəˈnɛtɪk , 23 byte

Mengembalikan untuk .n 140n14

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

Cobalah online!

Bagaimana?

Ekspresi `${73211e9}`diperluas ke string "73211000000000", memberikan tabel pencarian dari 14 nilai yang dikurangi dari 14, yang memberikan urutan yang diharapkan.

Untuk , hasilnya adalah:n14

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

21 byte

Pengembalian NaNuntuk , yang mungkin atau mungkin tidak dianggap sebagai output yang valid.n14

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

Cobalah online!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.