Utas polisi dapat ditemukan di sini: The Mystery String Printer (Cops)
Tantanganmu
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.
/* Configuration */
var QUESTION_ID = 60329; // Obtain this from the url
// It will be like http://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
/* App */
var answers = [],
answers_hash, answer_ids, answer_page = 1,
more_answers = true,
comment_page;
function answersUrl(index) {
return "//api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}
function commentUrl(index, answers) {
return "//api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}
function getAnswers() {
jQuery.ajax({
url: answersUrl(answer_page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function(data) {
answers.push.apply(answers, data.items);
answers_hash = [];
answer_ids = [];
data.items.forEach(function(a) {
a.comments = [];
var id = +a.share_link.match(/\d+/);
answer_ids.push(id);
answers_hash[id] = a;
});
if (!data.has_more) more_answers = false;
comment_page = 1;
getComments();
}
});
}
function getComments() {
jQuery.ajax({
url: commentUrl(comment_page++, answer_ids),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function(data) {
data.items.forEach(function(c) {
answers_hash[c.post_id].comments.push(c);
});
if (data.has_more) getComments();
else if (more_answers) getAnswers();
else process();
}
});
}
getAnswers();
var POINTS_REG = /(?:<=|≤|<=)\s?(?:<\/?strong>)?\s?(\d+)/
var POINTS_REG_ALT = /<h\d>.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
var valid = [];
var open = [];
answers.forEach(function(a) {
var body = a.body;
var cracked = false;
var points = body.match(POINTS_REG);
if (!points) points = body.match(POINTS_REG_ALT);
if (points) {
var length = parseInt(points[1]);
var crackedpoints = 0;
if (length > 64) crackedpoints = 16;
else if (length > 32) crackedpoints = 8;
else if (length > 16) crackedpoints = 4;
else if (length > 8) crackedpoints = 2;
else crackedpoints = 1;
valid.push({
user: getAuthorName(a),
numberOfSubmissions: 1,
points: crackedpoints
});
}
});
var pointTotals = [];
valid.forEach(function(a) {
var index = -1;
var author = a.user;
pointTotals.forEach(function(p) {
if (p.user == author) index = pointTotals.indexOf(p);
});
if (index == -1) pointTotals.push(a);
else {
pointTotals[index].points += a.points;
pointTotals[index].numberOfSubmissions++;
}
});
pointTotals.forEach(function(a) {
a.points += +((a.numberOfSubmissions - 1) * 5);
});
pointTotals.sort(function(a, b) {
var aB = a.points,
bB = b.points;
return (bB - aB != 0) ? bB - aB : b.numberOfSubmissions - a.numberOfSubmissions;
});
pointTotals.forEach(function(a) {
var answer = jQuery("#answer-template").html();
answer = answer
.replace("{{NAME}}", a.user)
.replace("{{SUBMISSIONS}}", a.numberOfSubmissions)
.replace("{{POINTS}}", a.points);
answer = jQuery(answer);
jQuery("#answers").append(answer);
});
}
body {
text-align: left !important
}
#answer-list {
padding: 20px;
width: 240px;
float: left;
}
#open-list {
padding: 20px;
width: 450px;
float: left;
}
table thead {
font-weight: bold;
vertical-align: top;
}
table td {
padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b">
<div id="answer-list">
<h2>Robber's Leaderboard</h2>
<table class="answer-list">
<thead>
<tr>
<td>Author</td>
<td>Submissions</td>
<td>Score</td>
</tr>
</thead>
<tbody id="answers">
</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr>
<td>{{NAME}}</td>
<td>{{SUBMISSIONS}}</td>
<td>{{POINTS}}</td>
</tr>
</tbody>
</table>
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).
Jawaban:
Pyth, Dennis, ≤ 8
Sialan itu menyenangkan - bagian tersulit adalah mencari tahu bagaimana melakukannya cukup pendek di Pyth.
Analisis
Pada
1234
awalnya mengisyaratkan bahwa kita mungkin berurusan dengan daftar angka, dicetak tanpa pemisah. Mari kita coba dan pisahkan angka-angka dengan cara yang masuk akal:Ada beberapa petunjuk bahwa kita berada di jalur yang benar:
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, 42
ini 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
../T
memberikan 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 denganp
? Ini memberi kami templat berikut:Di mana
V
adalah untuk loop yang loop atas iterable, menyimpan setiap elemen dalam variabelN
.Pandangan sekilas pada partisi terakhir kedua
(5, 5)
harus memperjelas bahwa kita ingin mengambil suatu produk. Cara naif untuk mengurangi daftar dengan perkalian adalahdi mana
d
daftar 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:
dimana
*F
dilipat oleh*
(perkalian). Tidak heran saya tidak menemukannya dalam pencarian saya - saya mencari kata kunci "kurangi" daripada "lipat"!sumber
jk*M./T
<= 7
saya akan hancur. Sudah pasti sejak saya memeriksa bahasa.Mathematica, alphalpha, ≤ 32
Aku benci mengatakan ini, tapi aku baru saja mengenali nomornya di tempat.
sumber
31!10!27079205916672
> <>, VTCAKAVSMoACE, ≤ 64
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:
> <> 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):
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:
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 = 61
adalah prima, yang merupakan pertanda baik.Mari kita coba menemukan elemen terkecil
dan gunakan itu untuk mengurangi semua elemen sehingga elemen min adalah 1:
Perhatikan bagaimana elemen setelah
1
ini51
. Jika ada semacam kekuatan / perkalian yang terjadi, ini adalah tebakan yang bagus untuk pengganda kita.Mari kita coba:
Bingo! Kami sekarang dapat mundur, memberikan kode berikut:
yang kemudian diterjemahkan ke> <>
sumber
Pyth, Maltysen, ≤4
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:Hmm ... tidak terlalu mencerahkan.
Sekarang
G
adalah string alfabet"abc...z"
, yang sepertinya bisa menjadi sumber untuk string panjang untuk dimasukkanC
. Melihat melalui dokumen saya menemukan:Jika kita berurusan dengan kompresi di sini, tidak akan mengejutkan untuk mendapatkan semua jenis karakter ASCII yang diperluas. Mencoba
C.ZG
kemudian memberikan jawabannya.sumber
Fourier, Beta Decay, ≤ 32
Atau sebagai alternatif, dalam CJam:
Analisis
Pada awalnya kita bisa melihat banyak kekuatan 2:
Jika kita mengambil basis log 2 dari angka-angka ini, kita mendapatkan:
yang merupakan seri Fibonacci, mulai dari
1, 0
.sumber
Siput, feersum, ≤2 byte
Ini sebenarnya 2 byte; karakter
z
diikuti 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 dihasilkan8
sebagai 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.
sumber
Rust, Liam Noronha, ≤128 byte
Cukup mencetak string kata demi kata adalah 120 byte ...
sumber
Macaroni 0.0.2, Gagang Pintu, ≤64
sumber
Python 2, Hapus pertanyaan dengan contoh, <= 64
Satu solusi yang mungkin:
(
9**2139
,27**1426
dan729**713
juga memberikan hasil yang sama)sumber
CoffeeScript, user2428118, ≤64
(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
yang sepertinya tidak masuk akal. Tapi saya menemukan beberapa barang aneh di dalamnya, seperti
nX
dantY
. Setelah menyaring ini kita dapatkanX dan Y ini tampaknya menunjukkan kode sumber asli yang digunakan seperti properti posisi
offsetX/Y
. Yang sangat menarik adalahnZ
itemnya. Untuk memeriksa asumsi saya, saya mencari semua properti yang diakhiri dengan "Z":yang menunjukkan banyak
CSSStyleDeclaration, "webkitTransformOriginZ"
. Dari sini kami memiliki indikasi kuat bahwa daftar ini dibangun oleh 2 karakter terakhir dari semua kuncistyle
objek, yang pengujian di atas menunjukkan memang benar.sumber
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.
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.
sumber
Python 2, histokrat, ≤16
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
float
dalam 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:
Hasil aktual dengan cepat keluar ketika n = 6.
sumber
MATLAB, StewieGriffin, ≤ 16
Cetakan:
sumber
5*'$W'.'*' |'
..73
bukannya 5, lakukan+5
, atau jadikan3x3
matriks tetapi pikir ini lebih menyenangkan. Bisa melakukan banyak hal dengan tiga byte yang tersisa..'
sebelumnya, tetapi masuk akal - bertanya-tanya bagaimana cara mengubah string tanpa menggunakan kurung.Matlab, Luis Mendo, ≤16
Saya menemukannya, yay!
Saya tidak tahu bahwa Oktaf juga bisa melakukan ini.
sumber
peaks()
?peaks
.Mathematica, LegionMammal978, ≤64
sumber
Python, spacemanjosh, ≤ 64
Kalkulator simbolis terbalik yang mulia. Tidak bermain golf dengan baik, tapi hei itu cocok.
Sunting: Saya bermain golf.
sumber
JavaScript ES6, Cᴏɴᴏʀ O'Bʀɪᴇɴ, ≤128 byte
Saya ragu ini benar karena saya tidak perlu mendekati 128 byte, tetapi menemukan urutan berulang adalah tantangan yang menyenangkan.
sumber
Thue, ppperry, <= 64
Mengurai 2016 menjadi faktor utama, pada dasarnya. 62 karakter, jadi tebakan saya ini mirip dengan apa yang Anda tuju.
sumber
Python, DLosc, ≤32
(Solusi ini menggunakan Python 2)
sumber
> <>, Sp3000, <= 8
Penunjuk instruksi membungkus dan langkah-langkah berikut terjadi:
'l(?; o>'
mendorong nilai ASCII daril(?; o>
ke stackl
mendorong ukuran tumpukan di tumpukan(
bandingkan dua elemen tumpukan teratas:size of stack
danord('>')
?;
menghentikan program jika ukuran tumpukan lebih besaro
mengeluarkan elemen teratas dari stack sebagai karakter (ini akan selaluo
)>
set arah IP, ini dia no-opOutput 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.sumber
'l=?;o*
JavaScript, ev3commander, ≤ 32
Oke, itu mudah.
sumber
CJam, Reto Koradi, ≤ 4
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.
sumber
Pyth <= 4, Dennis
Itu panjang bergabung pada baris baru dari semua himpunan bagian dari alfabet.
Uji coba:
Saya menemukan nomor
2^27 * 7 - 1
yang merupakan petunjuk kuat bahwa itu didasarkanyG
, yang merupakan2^26
elemen 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 memikirkanj
, yang sangat cocok.sumber
C, tucuxi, ≤64
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.
sumber
Dyalog APL, Dennis, ≤4
Menghitung ln (8) ^ ln (8). Apakah StackExchange akan berhenti mengonversi jawaban saya? Saya akan mengetik banyak hal di sini sehingga tidak berubah menjadi komentar.
sumber
8*⍟⍟8
tetapi tidak tahu⍨
. Kerja bagus :)Terjebak, @quartata, ≤8
Program Pyth berikut :
menghasilkan output yang diinginkan
Metode cracking: Pencarian Google untuk nomor tersebut.
sumber
Pyth, xnor, ≤ 4
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.sumber
Python 3, Mego, ≤128
(Menggunakan Python 3.5.0, tidak diuji pada versi sebelumnya.
10598 byte.)sumber
Ruby, Gagang Pintu, ≤64
sumber
Matlab / Oktaf, Wauzl, ≤16
Menggunakan ide yang sama dengan jawaban Tom Carpenter
(Jika tidak berhasil, coba ini :)
sumber
(1*'234')'*'567'
dalam pikiran, karena jawaban pertama Anda tidak berfungsi di Matlab.