The Mystery String Printer (Perampok)


26

Utas polisi dapat ditemukan di sini: The Mystery String Printer (Cops)

Tantanganmu

  • Pilih kiriman dari utas polisi, dan cetak utas dari jawaban di utas itu.
  • Kiriman yang Anda pilih tidak boleh aman (harus lebih baru dari 7 hari).
  • Program, fungsi, atau skrip REPL Anda harus mengikuti aturan yang sama dengan utas polisi. Hanya untuk rekap:

    • Program Anda harus ≤128 karakter (jika pengiriman polisi dalam rentang panjang program yang lebih kecil, program Anda juga harus dalam rentang panjang itu. Misalnya, jika program polisi adalah ≤32 byte, program Anda harus ≤32 byte ).
    • Program harus menghasilkan output yang sama setiap kali dijalankan.
    • Tidak ada fungsi kriptografi.
    • Program tidak boleh mengambil input.
    • Tidak ada celah standar.
  • Semua kiriman baru harus menggunakan bahasa yang sama. Pengajuan dari sebelum aturan ini dibuat baik-baik saja, bahkan jika mereka tidak melakukannya.

Mencetak gol

Pemberian skor sama untuk perampok, tetapi sedikit berbeda:

  • Meretakkan program ≤8 byte memberikan 1 poin.
  • Meretakkan program ≤16 byte memberikan 2 poin. ≤32 byte memberikan 4 poin, dan seterusnya.
  • Setiap pengiriman tambahan, berapa pun panjangnya, menghasilkan +5 poin
  • Setiap pengajuan polisi hanya dapat dipecahkan satu-satunya orang pertama yang memecahkan setiap pengajuan mendapatkan poin.

Pengajuan

Setiap jawaban harus disertakan

  • Tautan ke pengajuan polisi.
  • Program dan bahasa pemrograman Anda.
  • Juga memiliki panjang program polisi (sebagai kekuatan 2) sebagai angka terakhir di header Anda.

Selain itu, silakan komentari kiriman polisi dengan tautan ke jawaban Anda.

Berikut ini adalah Stack Snippet untuk menghasilkan papan peringkat. Silakan tinggalkan komentar jika ada masalah dengan cuplikan. Jika Anda ingin melihat semua pengiriman polisi terbuka, lihat cuplikan dalam tantangan polisi.

Kontes ini sudah ditutup.

Pemenang keseluruhan: kennytm

Sebagian besar pengiriman: Sp3000

(Perhatikan bahwa jumlah pengiriman tidak menerjemahkan dengan tepat ke poin, karena panjang program yang retak dihitung saat menghitung skor).


Catatan: setiap pengiriman tambahan menghasilkan 5 poin
Daniel M.

Jawaban:


29

Pyth, Dennis, ≤ 8

V./Tp*FN

Sialan itu menyenangkan - bagian tersulit adalah mencari tahu bagaimana melakukannya cukup pendek di Pyth.

Analisis

Pada 1234awalnya mengisyaratkan bahwa kita mungkin berurusan dengan daftar angka, dicetak tanpa pemisah. Mari kita coba dan pisahkan angka-angka dengan cara yang masuk akal:

1 2 3 4 4 6 5 8 8 9 6 12 10 12 7 16 16 18 12 15 16 8 24 20 24 14 27 18 20 9 32 32 36 24 30 32 16 36 21 24 25 10

Ada beberapa petunjuk bahwa kita berada di jalur yang benar:

  • Semua angka memiliki faktor prima kurang dari 10
  • Banyak angka yang cukup dekat dengan indeks mereka dalam daftar

Namun, ada beberapa kekhasan. Angka pada indeks 23 adalah 24, dan merupakan satu-satunya kasus di mana angka pada indeks lebih besar dari indeks itu sendiri. Namun, petunjuk yang lebih besar adalah bahwa beberapa angka jelas lebih kecil dari tetangga mereka, terutama angka 7 pada indeks 15, 8 pada indeks 22 dan 9 pada indeks 30.

Memperhatikan bahwa ini membentuk pola 7-8-9, kita juga dapat melihat bahwa angka terakhir adalah 10 pada indeks 42. Dengan pertanyaan terakhir @Dennis tentang grup abelian , pemeriksaan cepat pada OEIS mengungkapkan bahwa 15, 22, 30, 42ini adalah urutan selanjutnya dari partisi angka . Pyth memiliki builtin untuk partisi, yang memberi kita dua dari delapan karakter:./

Tetapi perhatikan bahwa angka terakhir adalah 10, yang mencurigakan karena 10 adalah variabel preinitialised dalam Pyth, as T. ./Tmemberikan daftar lengkap dari 42 partisi nomor 10, yang sepertinya berguna.

Sekarang pencetakan dilakukan tanpa pemisah, jadi ini mengisyaratkan penggunaan p. Mungkin kita mengulang setiap partisi, melakukan sesuatu untuk itu, lalu mencetak dengan p? Ini memberi kami templat berikut:

V./Tp??N

Di mana Vadalah untuk loop yang loop atas iterable, menyimpan setiap elemen dalam variabel N.

Pandangan sekilas pada partisi terakhir kedua (5, 5)harus memperjelas bahwa kita ingin mengambil suatu produk. Cara naif untuk mengurangi daftar dengan perkalian adalah

u*GHd1

di mana ddaftar yang dimaksud. Namun, ini terlalu lama.

Sayangnya, di sinilah saya harus menarik forcer kasar. Saya tidak mengikuti Pyth untuk sementara waktu, jadi saya tidak tahu banyak fitur yang lebih baru. Hanya ada dua karakter yang tersisa, yang tampak sepenuhnya bisa dilakukan.

Forcer kasar kemudian kembali:

V./Tp*FN

dimana *Fdilipat oleh *(perkalian). Tidak heran saya tidak menemukannya dalam pencarian saya - saya mencari kata kunci "kurangi" daripada "lipat"!


3
Bahkan mungkin dalam 7:jk*M./T
Jakube

@ Jakube Oh wow, jika jangkauannya sudah <= 7saya akan hancur. Sudah pasti sejak saya memeriksa bahasa.
Sp3000


9

> <>, VTCAKAVSMoACE, ≤ 64

'9?':?!;1-$:'@'+o'3'*'='%$30.

Ironisnya, ini tidak hanya jauh lebih rendah dari batas jangkauan, tetapi juga portabel dan bekerja dengan penerjemah online .

Analisis

Mari kita mulai dengan string target:

yh[cPWNkz^EKLBiQMuSvI`n\Yw|JVXDUbZmfoRC_xrq{TlpHjGt]OadFAsgeyh[

> <> Dorongan karakter untuk stack dengan 'atau "dalam mode string, tapi dengan 63 karakter untuk mencetak dan hanya 64 byte untuk bekerja dengan, kehadiran huruf (petunjuk valid di> <>, untuk trik looparound standar) membuat pencetakan langsung mustahil. Karenanya, kita harus melakukan sesuatu dengan poin kode.

Konversi ke poin kode memberi (Saya menggunakan Python di sini):

>>> L = [ord(c) for c in "yh[cPWNkz^EKLBiQMuSvI`n\Yw|JVXDUbZmfoRC_xrq{TlpHjGt]OadFAsgeyh["]
>>> L
[121, 104, 91, 99, 80, 87, 78, 107, 122, 94, 69, 75, 76, 66, 105, 81, 77, 117, 83, 118, 73, 96, 110, 92, 89, 119, 124, 74, 86, 88, 68, 85, 98, 90, 109, 102, 111, 82, 67, 95, 120, 114, 113, 123, 84, 108, 112, 72, 106, 71, 116, 93, 79, 97, 100, 70, 65, 115, 103, 101, 121, 104, 91]

Perhatikan bahwa tiga angka terakhir sama dengan tiga angka pertama. Ini mengisyaratkan kemungkinan loop modulo terjadi.

Mari kita lihat berapa banyak elemen berbeda yang kita miliki:

>>> len(set(L))
60

Kami memiliki 63 elemen L, tiga elemen pertama bertepatan dengan tiga elemen terakhir. Ini berarti bahwa, selain dari tabrakan ini, semua elemen lain adalah unik. Sekarang ini mengisyaratkan sesuatu seperti mengambil kekuatan modulo bilangan prima. Memang, 60 + 1 = 61adalah prima, yang merupakan pertanda baik.

Mari kita coba menemukan elemen terkecil

>>> min(L)
65

dan gunakan itu untuk mengurangi semua elemen sehingga elemen min adalah 1:

>>> M = [x-64 for x in L]
>>> M
[57, 40, 27, 35, 16, 23, 14, 43, 58, 30, 5, 11, 12, 2, 41, 17, 13, 53, 19, 54, 9, 32, 46, 28, 25, 55, 60, 10, 22, 24, 4, 21, 34, 26, 45, 38, 47, 18, 3, 31, 56, 50, 49, 59, 20, 44, 48, 8, 42, 7, 52, 29, 15, 33, 36, 6, 1, 51, 39, 37, 57, 40, 27]

Perhatikan bagaimana elemen setelah 1ini 51. Jika ada semacam kekuatan / perkalian yang terjadi, ini adalah tebakan yang bagus untuk pengganda kita.

Mari kita coba:

>>> (57*51)%61
40
>>> (40*51)%61
27
>>> all((x*51)%61 == y for x,y in zip(M, M[1:]))
True

Bingo! Kami sekarang dapat mundur, memberikan kode berikut:

x = 57
for _ in range(63):
    print(chr(x + 64), end="")
    x = (x*51)%61

yang kemudian diterjemahkan ke> <>


1
Menariknya, ini berbeda banyak cara dengan apa yang saya lakukan - saya menggunakan 37 dan 112 (dimaksudkan untuk menggunakan 101, tetapi membuat kesalahan dalam kode. Epic gagal) sebagai set perkalian lanjutan dan modulo'd dengan 63, kemudian menambahkan 64 ke masuk ke rentang ASCII yang dapat dibaca. +1 Dilakukan dengan baik.
Addison Crump

Sangat baik, berharap saya bisa melakukan itu;)
J Atkin

7

Pyth, Maltysen, ≤4

C.ZG

Brute force sangat lama sehingga saya melakukannya lebih cepat secara manual.

Analisis

C(convert string to base 256 int) adalah cara termudah untuk menghasilkan sejumlah besar dalam Pyth, jadi mungkin itu karakter pertama. Jika kami mengonversi dari basis 256, kami mendapatkan:

xÚKLJNIMKÏÈÌÊÎÉÍË/(,*.)-+¯¨¬ 

Hmm ... tidak terlalu mencerahkan.

Sekarang Gadalah string alfabet "abc...z", yang sepertinya bisa menjadi sumber untuk string panjang untuk dimasukkan C. Melihat melalui dokumen saya menemukan:

.Z    Compresses or decompresses a string.

Jika kita berurusan dengan kompresi di sini, tidak akan mengejutkan untuk mendapatkan semua jenis karakter ASCII yang diperluas. Mencoba C.ZGkemudian memberikan jawabannya.


6

Fourier, Beta Decay, ≤ 32

2~x1~y20(xoy~z*x~yz~xq^~q)

Atau sebagai alternatif, dalam CJam:

X0I{_2$+}*]2\f#

Analisis

Pada awalnya kita bisa melihat banyak kekuatan 2:

2
1
2
2
4
8
32
256
8192
2097152
...

Jika kita mengambil basis log 2 dari angka-angka ini, kita mendapatkan:

1 0 1 1 2 3 5 8 13 21 ...

yang merupakan seri Fibonacci, mulai dari 1, 0.


6

Siput, feersum, ≤2 byte

z

Ini sebenarnya 2 byte; karakter zdiikuti oleh baris baru \n.

Saya tidak tahu cara kerjanya atau apa yang dilakukannya, tetapi setelah menguji semua input yang mungkin terpisah dari ~+dan ~,, ini adalah satu-satunya program 2-byte yang dihasilkan 8sebagai output.

Dan butuh waktu lama untuk mendapatkan hasil ini. Tidak heran itu disebut "Siput" :-D


Catatan untuk diri sendiri: Lain kali Anda fuzz menguji perangkat lunak yang tidak dikenal, lakukan di dalam VM.


5

Rust, Liam Noronha, ≤128 byte

fn main(){print!("AACAAEGAAACIIMOAAACAAEGQQQSYYDFAAACAAEGAAACIIMOHHHJHHLNXXXAGGKMAAACAAEGAAACIIMOAAACAAEGQQQSYYDFOOO");}

Cukup mencetak string kata demi kata adalah 120 byte ...


1
wow sudah terlambat ketika saya melakukan itu. Bodoh sekali. Saya bisa membuat teks jauh lebih lama tanpa usaha. Saya akan memposting sumber yang sebenarnya.
Liam



5

CoffeeScript, user2428118, ≤64

alert 0+(btoa k.substr -2 for k of document.body.style).join ''

(hanya berfungsi di Chrome 46.0.2490.71 seperti yang dijelaskan oleh Cop.)


Outputnya jelas merupakan rangkaian string pendek yang disandikan base64 karena semua "=". Setelah menguraikannya, kami menemukan daftar string 2-karakter seperti

['nt', 'ms', 'lf', 'ne', 'll', 'on', 'ay', 'on', …

yang sepertinya tidak masuk akal. Tapi saya menemukan beberapa barang aneh di dalamnya, seperti nXdan tY. Setelah menyaring ini kita dapatkan

>>> # Python
>>>
>>> [i for i in tt if not re.match('[a-z]{2}$', i)]
['nX', 'nY', 'tX', 'tY', 'wX', 'wY', 'r', 'nX', 'nY', 'tX', 'tY', 'nX', 'nY', 'nX', 'nY', 'nZ', 'x', 'y']

X dan Y ini tampaknya menunjukkan kode sumber asli yang digunakan seperti properti posisi offsetX/Y. Yang sangat menarik adalah nZitemnya. Untuk memeriksa asumsi saya, saya mencari semua properti yang diakhiri dengan "Z":

// CoffeeScript
checked = []
f = (o) ->
    if !(o in checked) 
        for k of o
            if /Z$/.test(k)
                console.log(o, k)
            if o[k] instanceof Object
                f o[k]
f window

yang menunjukkan banyak CSSStyleDeclaration, "webkitTransformOriginZ". Dari sini kami memiliki indikasi kuat bahwa daftar ini dibangun oleh 2 karakter terakhir dari semua kunci styleobjek, yang pengujian di atas menunjukkan memang benar.


Anda menemukannya, selamat! Kode sumber asli
user2428118

5

Lua <= 4, Egor Skriptunoff

Banyak pengguna merasa gelisah tentang jawaban ini dalam obrolan, jadi saya harus membebaskan mereka dari kesengsaraan mereka. Saya tidak tahu Lua dan tidak bisa mengujinya, tetapi saya akan sangat terkejut jika ini tidak berhasil.

4^~9

Ini akan sangat jelas, tetapi mungkin tidak ada yang mendapatkannya karena operator bitwise hanya ditambahkan dalam versi 5.3; ideone.com hanya memiliki versi 5.2.


facepalm Saya mengabaikan operator bitwise karena mereka hanya menggunakan bilangan bulat.
LegionMammal978

5

Python 2, histokrat, ≤16

[[[51002**3/6]]] 

Petunjuk terbesar adalah janji bahwa itu tidak akan berfungsi di Python 3. Apa yang berubah di Python 3 ? Tersangka terbesar adalah bahwa operator divisi mengembalikan a floatdalam Python 3.

Jadi saya berasumsi solusinya dalam bentuk ⌊α β / n⌋ = c = 22111101102001, karena eksponensial adalah satu-satunya cara pendek untuk membuat angka besar.

Jika {α, β, n} memang membentuk solusi, maka (cn) 1 / β ≈ α harus sangat dekat dengan integer. Oleh karena itu saya menggunakan yang berikut untuk mencoba brute-force {α, β} untuk setiap n:

(* Mathematica *)
n=2; Sort[Table[{N[Abs[k - Round@k] /. k -> (22111101102001*n)^(1/b), 12], b}, {b, 2, 50}]]

(* Output: {{0.00262542213622, 7}, ...}

   The first number is the "quality" of the solution, lower is better.
   the second number is β.
   Thus α ≈ (nc)^(1/β) = 89
   But (89^7)/2 = 22115667447764, which is still far away from the answer.

*)

Hasil aktual dengan cepat keluar ketika n = 6.


Sudah selesai dilakukan dengan baik! Itulah solusi yang dimaksudkan, dan tentang bagaimana saya berharap seseorang akan menyelesaikannya (meskipun saya tidak menyadari sebelumnya betapa tergantungnya platform itu).
histokrat

4

MATLAB, StewieGriffin, ≤ 16

[36;87]*' |'*5

Cetakan:

ans =
        5760       22320
       13920       53940

Bagus! Senang Anda menyukainya :-) cara saya melakukannya: 5*'$W'.'*' |'.
Stewie Griffin

Saya sedang mempertimbangkan membuatnya jauh lebih sulit dengan mengalikan dengan misalnya .73bukannya 5, lakukan +5, atau jadikan 3x3matriks tetapi pikir ini lebih menyenangkan. Bisa melakukan banyak hal dengan tiga byte yang tersisa.
Stewie Griffin

@StewieGriffin Belum pernah menemukan .'sebelumnya, tetapi masuk akal - bertanya-tanya bagaimana cara mengubah string tanpa menggunakan kurung.
Tom Carpenter

4

Matlab, Luis Mendo, ≤16

Saya menemukannya, yay!

fix(peaks(9).^2)

Saya tidak tahu bahwa Oktaf juga bisa melakukan ini.


Bagaimana? Pernahkah Anda mendengar tentang peaks()?
lirtosiast

Ya saya punya. Saya telah dengan bahaya bermain-main dengan peaks.
Wauzl


4

Python, spacemanjosh, ≤ 64

n=0;d=1;L=[]
exec("L+=[10/(100-n)**.5];n+=d;d+=2;"*10)
print(L)

Kalkulator simbolis terbalik yang mulia. Tidak bermain golf dengan baik, tapi hei itu cocok.

Sunting: Saya bermain golf.

print([10/(100-n*n)**.5for n in range(10)])

4

JavaScript ES6, Cᴏɴᴏʀ O'Bʀɪᴇɴ, ≤128 byte

var x=122,s='0037122342526683102122';for(var i=23;i<=505;i+=2)s+=(x+=i);s;

Saya ragu ini benar karena saya tidak perlu mendekati 128 byte, tetapi menemukan urutan berulang adalah tantangan yang menyenangkan.


Wow. Saya menggunakan metode yang sama sekali berbeda. Apakah itu masih dihitung? : 3
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Biasanya. Saya benar-benar ingin tahu tentang yang asli dan apa yang menghasilkan 22 byte pertama, saya kira sesuatu yang funky di init loop
SLuck49

Saya akan mempostingnya ketika saya punya waktu. Saya pikir ini adalah lantai dari fungsi s * s - s / (5-s)
Conor O'Brien

4

Thue, ppperry, <= 64

0::=11
1::=22
2::=33
3::=44
4::=55
a::=bbb
b::=000
::=
aaaaaaa

Mengurai 2016 menjadi faktor utama, pada dasarnya. 62 karakter, jadi tebakan saya ini mirip dengan apa yang Anda tuju.


Anda dapat melakukan 0 :: = 2222 untuk menghemat beberapa byte.
lirtosiast

Poin yang adil, tampaknya agak kurang elegan.
histokrat


4

> <>, Sp3000, <= 8

'l(?; o>

Penunjuk instruksi membungkus dan langkah-langkah berikut terjadi:

  • 'l(?; o>' mendorong nilai ASCII dari l(?; o> ke stack
  • l mendorong ukuran tumpukan di tumpukan
  • (bandingkan dua elemen tumpukan teratas: size of stackdanord('>')
  • ?; menghentikan program jika ukuran tumpukan lebih besar
  • o mengeluarkan elemen teratas dari stack sebagai karakter (ini akan selalu o )
  • > set arah IP, ini dia no-op
  • kita kembali ke langkah pertama

Output adalah oooooooooooo .

Kita bisa mendapatkan banyak output berbeda dengan mengubah [space]ke sesuatu yang mendorong atau muncul di stack dan menggunakan karakter lain yang valid sebagai gantinya >, yang juga dapat mendorong atau pop.


Bagus! Untuk referensi, saya punya:'l=?;o*
Sp3000


4

CJam, Reto Koradi, ≤ 4

HJK#

Tekan 17 , lalu 19 20 = 37589973457545958193355601 .

Cobalah online.

Hanya ada begitu banyak hal yang dapat Anda lakukan dalam empat byte. Suatu bilangan bulat sebesar ini harus melibatkan kekuatan atau faktorial, dan faktorial akan membuntuti nol.


Itu benar. Saya akan menangani pembaruan pos resmi hari ini.
Reto Koradi

4

Pyth <= 4, Dennis

ljyG

Itu panjang bergabung pada baris baru dari semua himpunan bagian dari alfabet.

Uji coba:

$ pyth -cd 'ljyG'
==================== 4 chars =====================
ljyG
==================================================
imp_print(Plen(join(subsets(G))))
==================================================
939524095

Saya menemukan nomor 2^27 * 7 - 1yang merupakan petunjuk kuat bahwa itu didasarkan yG, yang merupakan 2^26elemen panjang. Saya kemudian menebak itu harus dikonversi ke string dan panjangnya dicetak. Namun, satu-satunya cara untuk melakukan ini yang dapat saya pikirkan untuk sementara waktu adalah ``, repr. Kemudian saya memikirkan j, yang sangat cocok.


4

C, tucuxi, ≤64

main(i){for(i=0;i<11000;++i)if(!(i&2*i))printf("1%d",!(i&1));}

Outputnya semua 0 dan 1, tetapi C tidak dapat mencetak biner secara langsung, jadi sangat mungkin ini adalah hasil boolean.

Ada lebih dari 1s, jadi saya mencatat posisi 0s ( 3, 9, 13, 19, …), yang ternyata adalah OEIS A075318 . Ini tidak berguna, tidak ada rumus sederhana untuk menentukan di mana angka dalam urutan ini.

Tetapi kami mencatat bahwa ada semua angka ganjil, jadi mungkin (x-1)/2 = {1, 4, 6, 9, 12, …}ada informasi yang lebih berguna. Dan ini A003622 .

A003622 dapat didefinisikan sebagai "posisi 1 di A003849 ", yang persis apa yang perlu kita crack di sini. Dan A003849 didefinisikan sebagai " A003714 mod 2", di mana A003714 hanyalah semua bilangan bulat itu x & (2*x) == 0. Jadi kita sudah mendapat solusinya.

OEIS rox.


benar-benar mengesankan - Saya tidak pernah berhenti terkejut oleh pengguna situs ini
tucuxi

4

Dyalog APL, Dennis, ≤4

*⍨⍟8

Menghitung ln (8) ^ ln (8). Apakah StackExchange akan berhenti mengonversi jawaban saya? Saya akan mengetik banyak hal di sini sehingga tidak berubah menjadi komentar.


Saya sudah 8*⍟⍟8tetapi tidak tahu . Kerja bagus :)
Sp3000


3

Pyth, xnor, ≤ 4

C`CG

CG( "abc...z"Mengonversi string alfabet dari basis 256) adalah cara Pyth khas menghasilkan angka yang sangat besar. Setelah itu baru saja dirangkaikan dan dikonversi dari pangkalan lagi.


3

Python 3, Mego, ≤128

(Menggunakan Python 3.5.0, tidak diuji pada versi sebelumnya. 105 98 byte.)

import sys
a=sys.stdout
sys.stdout=None
from this import*
a.write(s.translate(s.maketrans(d))[4:])

Sangat bagus! Saya melakukannya di 94, lihat posting polisi saya untuk kode.
Mego


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.