Tujuan dari tantangan ini adalah menulis fungsi / program terpendek untuk mengambil teks input, mengenkripsinya menggunakan metode di bawah ini, dan mengembalikan hasilnya.
Sebagai contoh, saya akan menggunakan string hello world
.
Pertama , dapatkan teks input.
hello world
Kedua , konversikan string menjadi terner (base 3). Gunakan kunci ini:
a = 000
b = 001
c = 002
d = 010
e = 011
f = 012
g = 020
...
w = 211
x = 212
y = 220
z = 221
[space] = 222
Dengan kunci ini, hello world
menjadi 021011102102112222211112122102010
, seperti yang terlihat di bawah ini.
h e l l o w o r l d
021 011 102 102 112 222 211 112 122 102 010
Ketiga , pindahkan digit pertama ke ujung.
021011102102112222211112122102010
becomes
210111021021122222111121221020100
Keempat , ubah nomor kembali menjadi string menggunakan kunci yang sama.
210 111 021 021 122 222 111 121 221 020 100
v n h h r n q z g j
Terakhir , kembalikan teks terenkripsi.
vnhhr nqzgj
Berikut ini beberapa contoh teks dan hasilnya:
the turtle ==> dvo fh ego
python ==> uudwqn
code golf ==> hpjoytqgp
Karena ini adalah kode golf, entri terpendek dalam byte akan menang. Kesalahan diperbolehkan jika beberapa karakter bukan huruf kecil atau spasi. Ini adalah tantangan pertama saya, jadi saran apa pun akan lebih bermanfaat.
Semoga berhasil!
Papan peringkat:
var QUESTION_ID=54643;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),e.has_more?getAnswers():process()}})}function shouldHaveHeading(e){var a=!1,r=e.body_markdown.split("\n");try{a|=/^#/.test(e.body_markdown),a|=["-","="].indexOf(r[1][0])>-1,a&=LANGUAGE_REG.test(e.body_markdown)}catch(n){}return a}function shouldHaveScore(e){var a=!1;try{a|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(r){}return a}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading),answers.sort(function(e,a){var r=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0],n=+(a.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0];return r-n});var e={},a=1,r=null,n=1;answers.forEach(function(s){var t=s.body_markdown.split("\n")[0],o=jQuery("#answer-template").html(),l=(t.match(NUMBER_REG)[0],(t.match(SIZE_REG)||[0])[0]),c=t.match(LANGUAGE_REG)[1],i=getAuthorName(s);l!=r&&(n=a),r=l,++a,o=o.replace("{{PLACE}}",n+".").replace("{{NAME}}",i).replace("{{LANGUAGE}}",c).replace("{{SIZE}}",l).replace("{{LINK}}",s.share_link),o=jQuery(o),jQuery("#answers").append(o),e[c]=e[c]||{lang:c,user:i,size:l,link:s.share_link}});var s=[];for(var t in e)e.hasOwnProperty(t)&&s.push(e[t]);s.sort(function(e,a){return e.lang>a.lang?1:e.lang<a.lang?-1:0});for(var o=0;o<s.length;++o){var l=jQuery("#language-template").html(),t=s[o];l=l.replace("{{LANGUAGE}}",t.lang).replace("{{NAME}}",t.user).replace("{{SIZE}}",t.size).replace("{{LINK}}",t.link),l=jQuery(l),jQuery("#languages").append(l)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/,NUMBER_REG=/\d+/,LANGUAGE_REG=/^#*\s*([^,]+)/;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}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>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table></div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table></div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table><table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table>
sumber
uint64
) menggunakan peningkatan kekuatan27
. Perpindahan dengan satu digit kemudian akan sama dengan mengalikan bilangan bulat besar ini dengan3
, dan pengenalan digit pertama di ujung lainnya hanya akan menjadi tambahan. Tetapi ada beberapa komplikasi, seperti membuang "carry" terakhir (mungkin melaluimod
operasi), dan saya tidak bisa membuatnya bekerja dengan beberapa byteJawaban:
Pyth,
2322 byteCobalah online: Input Reguler / Test Suite
Berkat @isaacg untuk satu byte.
Penjelasan:
sumber
G
daripada menggunakanN
, misalnya=+Gd
.Pyth, 26 byte
Cobalah online di Pyth Compiler / Executor: demo | uji kasus
Ide
Asumsikan semua karakter input telah dipetakan ke bilangan bulat yang ditentukan langkah 2.
Untuk setiap bilangan terner 3 digit, kita memiliki xyz 3 = 9x + 3y + z , sehingga pembagian modular dengan 9 menghasilkan hasil bagi x dan residu 3y + z .
Jika inputnya abc 3 def 3 ghi 3 , terapkan pembagian modular untuk setiap hasil a, 3b + c, d, 3e + f, g, 3h + i .
Setelah memutar daftar dari atas satu unit ke kiri, kita dapat mengelompokkan bilangan bulat menjadi pasangan. Ini menghasilkan daftar (3b + c, d), (3e + f, g), (3h + i, a) .
Sekarang, jika kita mengonversi (3y + z, w) dari basis 3 ke integer, kita memperoleh 3 (3y + z) + w = 9y + 3z + w = zyw 3 .
Dengan demikian, menerapkan konversi basis ke daftar pasangan memberi kita bcd 3 efg 3 hia 3 , yang tepatnya merupakan hasil dari rotasi digit terner gabungan satu unit ke kiri.
Yang tersisa untuk dilakukan adalah memetakan bilangan bulat yang dihasilkan kembali ke karakter.
Kode
sumber
Python 2, 96
Mengkonversi karakter
c
ke nilaix
sebagaix=(ord(c)-97)%91
, dengan modulo hanya mempengaruhi ruang untuk mengubahnya menjadi 26. sebaliknya konversii
untukchr((i-26)%91+32)
, dengan modulo hanya mempengaruhii=26
untuk membuatnya menjadi ruang.Kami mengulang karakter, mencatat nilai saat ini
x
dan nilai sebelumnyay
. Kami menggunakan dua digit terner terakhiry
, ditemukan sebagaiy%9
, dan digit terner pertamax
, ditemukan sebagaix/9
. Nilai dari rangkaian adalahy%9*3+x/9
. Mungkin ada beberapa optimasi yang menggabungkan aritmatika ini dengan pergeseran oleh97
dan perbaikan ruang.Kami membuat loop ini, kami kembali ke karakter pertama dari string di akhir. Kami juga melakukan satu loop persiapan untuk menulis di nilai sebelumnya
y
, menekan karakter untuk loop pertama ketikay
belum diinisialisasi.sumber
CJam,
3929 byteYang keren tentang ini adalah ia bahkan tidak menggunakan konversi basis.
Cobalah online .
Saya baru menyadari bahwa saya memiliki ide yang persis sama dengan jawaban Pyth Jakube. Saya benar-benar porting kode CJam ini ke Pyth sebelum melihat postingnya, berakhir dengan 25 byte. Mengingat itu adalah golf Pyth pertama saya, saya kira itu tidak terlalu buruk.
Penjelasan
sumber
CJam,
302927 byteCobalah online di juru bahasa CJam .
Pendekatannya sama dengan jawaban saya yang lain , yang merupakan port dari kode ini ke Pyth.
Bagaimana itu bekerja
sumber
Pyth,
3029 byteDisimpan 1 byte berkat @Jakube.
Demo langsung dan uji kasus.
sumber
Javascript (ES6), 175 byte
Satu garis!
"Terlalu sering menggunakan
v
penghargaan variabel , ada yang?"pembaruan: Sekarang hanya menggunakan variabel yang dipanggil
v
, untuk kebingungan total!Terima kasih @vihan karena telah menghemat 6 byte!
Terima kasih @Neil untuk menghemat 27 byte !!
Menentukan fungsi anonim. Untuk menggunakan, tambahkan
v=
sebelum kode untuk memberi fungsi nama, dan menyebutnya sepertialert(v("hello world"))
sumber
.slice(-3)
untuk menyimpan 6 byte, pada titik mana Anda dapat menggunakan"00"+v
untuk menyimpan byte lain. (Anda dapat menyatukan dengan templat tetapi panjang yang dihasilkan sama.).map(v=>(v<"V"?26:v.charCodeAt()-97).toString(3)).map(v=>("000"+v).slice(v.length))
kemudian menjadi.map(v=>(v<"V"?53:v.charCodeAt()-70).toString(3).slice(1))
.Julia,
149137 byteGolf pertamaku!
(sebagian) tidak diserang:
sumber
=
daripadain
untuk loop dan Anda dapat menggunakanb[1]
di tempatb[1:1]
. Anda juga tidak perlu jarak antara menutup paren danfor
.=
, tetapib[1]
mengembalikan karakter, yang tidak dapat ditambahkan ke string dengan*
.for
trick adalah bagus. Anda juga dapat memilikinya langsung setelah penawaran harga. Saya tidak menyadari parser yang fleksibel.end
.Javascript (ES6),
178,172, 170Diganti Math.floor dengan bitwise atau. Membuat fungsi anonim. Jika saya mengerti dengan benar, ini seharusnya sedikit memperbaiki noobishness saya (terima kasih Dennis!) Dan buat saya 2 byte lagi.
sumber
Julia,
169166 bytePenjelasan + tidak dikumpulkan:
sumber
Haskell, 160 byte
Ugh, ini terasa terlalu panjang, tapi setidaknya aku ... entah bagaimana mengalahkan Python. Dan Ruby.
sumber
Javascript (ES6),
141124120 bytePercaya atau tidak.... :-)
Seperti jawaban saya yang lain, ini adalah fungsi anonim, dan perlu ditugaskan ke variabel sebelum dapat digunakan. Coba di sini:
Tampilkan cuplikan kode
Saya pikir saya mungkin bisa mencukur beberapa byte dari jawaban saya sebelumnya dengan menggunakan teknik yang berbeda, jadi saya mulai dengan yang mirip dengan Tekgno dan melepaskan kepala saya dari sana. Saya menginisialisasi beberapa variabel di bagian argumen fungsi, dan sekali lagi memasukkan semuanya ke dalam
.map
fungsi. Kemudian saya menyadariString.fromCharCode
akan jauh lebih efisien di luar.map
. Setelah semua dikatakan dan dilakukan, saya telah mencukur lebih dari3045 byte!Sunting 1: Disimpan 17 byte dengan menyingkirkan
.replace
s, menggunakan teknik yang mirip dengan solusi Python xnor.Oke, mungkin sekarang saatnya untuk beralih ke tantangan lain ....
sumber
Python 2,
182180 BytesSolusi ini tidak ideal, karena penggantiannya menjadi sangat mahal .. Mencoba mencari cara untuk menghindarinya.
Inputnya seperti
"hello world"
.sumber
Mathematica, 162 byte
(Re) Menggunakan a
Rule
untuk mengkonversi daftar digit ke karakter dan kembali.sumber
Javascript (ES6), 179 byte
Alat peraga untuk mendukung
.match
regex.sumber
Ruby, 177
Membutuhkan setidaknya Ruby 1.9 untuk
each_char
metode inisumber
Jawa,
458449 byteItu membuat saya sedikit sedih untuk menentukan bahwa saya bisa mencukur 10 byte dengan tidak menggunakan Java 8 stream dan
map()
metode.Ini adalah versi golfnya:
Ini adalah versi yang jauh lebih sedikit golf. Ini dimaksudkan agar dapat dibaca, tetapi saya tidak membuat jaminan.
Program ini mengambil string untuk dikonversi sebagai argumen baris perintah. Jika Anda ingin memiliki spasi di input Anda, Anda harus mengelilinginya dengan tanda kutip ganda.
Saya ingin memberikan contoh menggunakan ini dari baris perintah, tetapi saya tidak dapat membuat kode ini bekerja di luar Eclipse. Saya tidak pernah belajar menggunakan Java dari baris perintah ^ _ ^; Anda mungkin dapat menjalankan ini di dalam IDE pilihan Anda tanpa terlalu banyak kesulitan.
sumber
Javascript (ES6),
181180 byteIni adalah fungsi anonim, jadi harus diberi nama sebelum dapat digunakan. (Misalnya
encrypt=t=>...
) Cobalah di sini:Tampilkan cuplikan kode
Saya mulai menggunakan beberapa variabel dan
for
bukan loop.map
. Saya kemudian bermain golf dengan segala cara yang mungkin tanpa mengubah algoritma, yang membuat saya sekitar 217 byte. Setelah melihat jawaban UndefinedFunction, saya berhasil menurunkannya menjadi 195, dan beberapa pemeriksaan jawaban Dendrobium menghasilkan 14 pegolf lagi.Sejauh yang saya ketahui, saya tidak bisa melangkah lebih jauh atau hasil saya akan secara praktis identik dengan Dendrobium (kecuali untuk menjadi satu karakter lebih pendek!). Adakah yang bisa menemukan tempat saya menyimpan satu arang? :-)
Seperti biasa, saran dipersilahkan dengan senang hati!
sumber
Matlab, 113 byte
Masukan melalui stdin.
Contoh:
sumber
Julia -
92876154 byteTidak Terkumpul:
Triknya mungkin membingungkan Anda. Mengurangkan 6 gerakan 'a' ke nol setelah mod. Menambahkan 9 * 65 sama dengan menambahkan 65 ke v1 + v2, yang merupakan bagian dari proses mengembalikan nilai ke nilai ascii mereka. Anda bisa mengganti
i=t%91+579
dengani=t%91-6
, dan kemudian menggantiN=(v1+v2)%91+32
denganN=(v1+v2+65)%91+32
untuk mendapatkan hasil yang sama, tetapi membutuhkan satu karakter tambahan.sumber