Ini didasarkan pada xkcd # 153 .
Buat program atau fungsi bernama yang mengambil 2 parameter, masing-masing adalah string atau daftar atau array byte atau karakter. Parameter kedua hanya akan berisi karakter yang diambil dari lrfu
(atau byte ASCII yang setara). Ini harus ditafsirkan sebagai serangkaian instruksi yang harus dilakukan pada urutan bit yang diwakili oleh parameter pertama.
Pemrosesan yang dilakukan harus setara dengan yang berikut:
- Konversikan parameter pertama menjadi bitstring tunggal yang dibentuk dengan menggabungkan bit dari masing-masing karakter (ditafsirkan sebagai salah satu dari ASCII 7-bit, ASCII yang diperluas 8-bit, atau pengkodean Unicode standar). Misalnya jika parameter pertama adalah
"AB"
maka ini akan menjadi salah satu 10000011000010
(7-bit), 0100000101000010
(8-bit atau UTF-8) 00000000010000010000000001000010
,, atau 01000001000000000100001000000000
(UTF-16 dalam dua endiannesses), dll.
- Untuk setiap karakter di parameter kedua, secara berurutan, jalankan instruksi yang sesuai:
l
memutar bitstring ke kiri. Misalnya 10000011000010
menjadi 00000110000101
.
r
memutar bitstring ke kanan. Misalnya 10000011000010
menjadi 01000001100001
.
f
membalik (atau membalikkan) setiap bit dalam bitstring. Misalnya 10000011000010
menjadi 01111100111101
.
u
membalikkan bitstring. Misalnya 10000011000010
menjadi 01000011000001
.
- Konversi bitstring menjadi string ASCII yang menggunakan satu karakter per bit. Misalnya
10000011000010
menjadi "10000011000010"
. Ini karena tidak semua set 7/8 bit memiliki karakter yang ditugaskan padanya.
Contoh (dalam Python):
>>> f("b", "rfu")
01110011
Ia berubah "b"
menjadi representasi biner ASCII 8-bit 01100010
, memutarnya dengan benar ( 00110001
), membalik setiap bit ( 11001110
), dan membalikkannya ( 01110011
).
Fleksibilitas
Karakter lain dapat digunakan sebagai pengganti karakter l
, r
, f
, dan u
, tetapi mereka harus jelas didokumentasikan.
Papan angka
Terima kasih kepada @Optimizer untuk membuat cuplikan kode berikut. Untuk menggunakan, klik "Tampilkan cuplikan kode", gulir ke bawah dan klik "► Jalankan cuplikan kode".
var QUESTION_ID = 45087; var answers = [], page = 1;var SCORE_REG = /\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;function url(index) {return "http://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=votes&site=codegolf&filter=!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";}function getAnswers() {$.ajax({url: url(page++),method: "get",dataType: "jsonp",crossDomain: true,success: function (data) {answers.push.apply(answers, data.items);if (data.has_more) getAnswers();else process()}});}getAnswers();function shouldHaveHeading(a) {var pass = false;try {pass |= /^(#|<h).*/.test(a.body_markdown);pass |= ["-", "="].indexOf(a.body_markdown.split("\n")[1][0]) > -1;} catch (ex) {}return pass;}function shouldHaveScore(a) {var pass = false;try {pass |= SCORE_REG.test(a.body_markdown.split("\n")[0]);} catch (ex) {}return pass;}function getRelDate(previous) {var current = Date.now();var msPerMinute = 60 * 1000;var msPerHour = msPerMinute * 60;var msPerDay = msPerHour * 24;var msPerMonth = msPerDay * 30;var msPerYear = msPerDay * 365;var elapsed = current - previous;if (elapsed < msPerMinute) {return Math.round(elapsed/1000) + ' seconds ago';}if (elapsed < msPerHour) {return Math.round(elapsed/msPerMinute) + ' minutes ago';}if (elapsed < msPerDay ) {return Math.round(elapsed/msPerHour ) + ' hours ago';}if (elapsed < msPerMonth) {return 'approx. ' + Math.round(elapsed/msPerDay) + ' days ago';}if (elapsed < msPerYear) {return 'approx. ' + Math.round(elapsed/msPerMonth) + ' months ago';}return 'approx. ' + Math.round(elapsed/msPerYear ) + ' years ago';}function process() {answers = answers.filter(shouldHaveHeading);answers = answers.filter(shouldHaveScore);answers.sort(function (a, b) {var aB = +(a.body_markdown.split("\n")[0].match(SCORE_REG) || [Infinity])[0],bB = +(b.body_markdown.split("\n")[0].match(SCORE_REG) || [Infinity])[0];return aB - bB});answers.forEach(function (a) {var answer = $("#answer-template").html();answer = answer.replace("{{BODY}}", a.body).replace("{{NAME}}", a.owner.display_name).replace("{{REP}}", a.owner.reputation).replace("{{VOTES}}", a.score).replace("{{DATE}}", new Date(a.creation_date*1e3).toUTCString()).replace("{{REL_TIME}}", getRelDate(a.creation_date*1e3)).replace("{{POST_LINK}}", a.share_link).replace(/{{USER_LINK}}/g, a.owner.link).replace('{{img}}=""', "src=\"" + a.owner.profile_image + '"');answer = $(answer);if (a.is_accepted) {answer.find(".vote-accepted-on").removeAttr("style");}$("#answers").append(answer);});}
body { text-align: left !important}
<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="answers"></div><div id="answer-template" style="display: none"><div class="answer" ><table><tbody><tr><td class="votecell"><div class="vote"><span style="cursor: pointer;" title="Total Votes" itemprop="upvoteCount" class="vote-count-post ">{{VOTES}}</span><span style="display: none" class="vote-accepted-on load-accepted-answer-date" title="The question owner accepted this as the best answer">accepted</span></div></td><td class="answercell"><div class="post-text" itemprop="text">{{BODY}}</div><table class="fw"><tbody><tr><td class="vt"><div class="post-menu"><a href="{{POST_LINK}}" title="short permalink to this answer" class="short-link">share</a></div></td><td class="post-signature" align="right"><div class="user-info "><div class="user-action-time">answered <span title="{{DATE}}" class="relativetime">{{REL_TIME}}</span></div><div class="user-gravatar32"></div><div class="user-details"><br></div></div></td><td class="post-signature" align="right"><div class="user-info user-hover"><div class="user-action-time"></div><div class="user-gravatar32"><a href="{{USER_LINK}}"><div class="gravatar-wrapper-32"><img {{img}} alt="" height="32" width="32"></div></a></div><div class="user-details"><a href="{{USER_LINK}}">{{NAME}}</a><br><span class="reputation-score" title="reputation score " dir="ltr">{{REP}}</span></div></div></td></tr></tbody></table></td></tr></tbody></table></div></div>
"rrfrburb"
? Juga, ketika seseorang menggeser atau membalikkan bit, apakah ia melakukannya untuk setiap huruf individual, atau string secara keseluruhan? Lebih banyak kasus uji akan membuatnya lebih jelas.Jawaban:
CJam,
3432 byteIni menggunakan karakter berikut untuk instruksi:
Input diambil dari STDIN dengan kata di baris pertama dan string instruksi di baris kedua.
Uji di sini.
Penjelasan
Mendapatkan bit string sebenarnya hanya masalah menafsirkan kode karakter sebagai digit nomor basis-256 (dan mendapatkan representasi basis-2). Yang sulit adalah bahwa konversi basis yang terakhir tidak akan membuahkan hasil dengan 0s di sebelah kiri. Oleh karena itu, saya menambahkan 1 yang memimpin ke input awal, dan kemudian membagi 1 lagi di representasi biner. Sebagai contoh, jika inputnya adalah
ab
, saya mengubahnya menjadi array[1 'a 'b]
, menafsirkannya sebagai base-256 (karakter secara otomatis dikonversi ke kode karakter), yang mana90466
dan ke basis-2, yang mana[1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0]
. Sekarang jika saya hanya menghapus yang memimpin1
saya punya bitstream yang saya cari.Itulah yang dilakukan oleh bagian kode ini:
Sekarang saya membaca daftar instruksi dan mengeksekusi blok untuk setiap karakter dalam string instruksi:
Hal pertama yang harus dilakukan adalah untuk mengevaluasi karakter dan bilangan bulat yang sebenarnya
0
,1
,2
atau3
. Sekarang keajaiban golf yang sebenarnya ... tergantung pada instruksi saya ingin menjalankan sepotong kode pendek yang mengimplementasikan operasi:Saya bisa menyimpan ini dalam array blok dan memilih blok yang tepat untuk dijalankan, tetapi menyandikannya dalam string sebenarnya lebih pendek:
Pertama, saya menggunakan asosiasi integer dengan instruksi untuk memotong awal string. Jadi untuk rotasi kiri, string tidak berubah, untuk rotasi kanan karakter pertama dibuang dan seterusnya. Lalu saya memilih setiap karakter keempat dari string, mulai dari yang pertama, dengan
4%
. Perhatikan bagaimana keempat cuplikan kode didistribusikan di seluruh string. Akhirnya saya hanya mengevaluasi string sebagai kode~
.String bit dicetak secara otomatis di akhir program.
sumber
1m<
bukan(+
? Anda sedang bekerja pada array daripada angka, bukan?CJam, 34 byte
Pendekatan lain dalam CJam.
Teks input ada di baris pertama dan instruksi ada di baris kedua.
Instruksi:
sumber
f~
tidak diterapkan, bukan? ;)Pyth 33
Penggunaan:
Pyth github
Cobalah online di sini.
Ini adalah program yang menggunakan string sebagai argumen pertama dan string perintah sebagai argumen kedua. Dalam versi online, Anda harus memberikan string yang dipisahkan oleh baris baru, seperti:
Penjelasan:
Sesuatu yang tidak bisa saya tekan: Pyth
reduce
secara otomatis menggunakanG
untuk nilai sebelumnya, danH
untuk nilai berikutnya.sumber
lrfu
, tetapi mereka harus didokumentasikan dengan jelas." (penekanan saya)Scala - 192
sumber
Matlab (166 byte)
Ini menggunakan huruf
abcd
bukanlrfu
masing - masing.Beberapa trik yang digunakan di sini untuk menghemat ruang:
abcd
huruf memungkinkan saya kurangi97
sekali, dan kemudian huruf menjadi0
,1
,2
,3
. Ini menghemat ruang dalamswitch
-case
klausa.circshift
sebagai fungsi anonim satu huruf juga menghemat ruang, karena digunakan dua kali.D
terdiri dari'0'
dan'1'
karakter (kode ASCII48
dan49
), pernyataan tersebutD=char(97-D)
sesuai dengan inversi antara'0'
dan'1'
nilai - nilai. Perhatikan bahwa ini97
tidak ada hubungannya dengan yang disebutkan di atas.'
digunakan sebagai pengganti transpose.'
.sumber
Python 2 - 179
sumber
C #, 418 byte
Diformat:
sumber
J, 164
Diformat:
Contoh
sumber
JavaScript (E6), 163
167Sepenuhnya menggunakan fleksibilitas input, fungsi bernama dengan 2 parameter array.
Fungsi mengembalikan string karakter yang terdiri dari '1' dan '0'
Contoh
f("b", "rfu")
terjemahkan keF([98],[82,70,85])
, hasilnya adalah0111001
Catatan menggunakan string karakter jauh lebih lama di javascript! Jumlah byte 186
Contoh
F("b", "RFU")
, hasilnya0111001
lagisumber
Ruby, 151
Cukup mudah. Loop melalui karakter dalam
s
dan melakukan suatu tindakan untuk merekasumber
Python 2, 142
Mirip dengan jawaban pyth saya dalam pendekatan: Saya membangun daftar semua string dan indeks ke dalamnya berdasarkan nilai dari string instruksi yang saya iterate menggunakan pengurangan.
Penggunaan:
sumber