Tantangan
Diberikan string sebagai input, mainkan program Fourier yang menampilkan string itu.
Di Fourier tidak ada cara mudah untuk menghasilkan string: Anda harus melalui setiap kode karakter dan menampilkannya sebagai karakter.
Fourier
Bahasa ini didasarkan pada akumulator, variabel global yang diinisialisasi ke 0 pada awal program. Ini digunakan oleh hampir setiap operator dalam bahasa ini. Hanya beberapa yang tidak mengubah nilai akumulator.
Karakter keluar
a
Mengambil nilai akumulator sebagai kode ASCII dan mengeluarkan karakter. Tidak mengubah nilai akumulator.
Jika akumulator lebih besar dari 255, program akan mengembalikan kesalahan. Demikian juga jika akumulator kurang dari 0.
Nomor keluar
o
Menghasilkan nilai akumulator. Tidak mengubah nilai akumulator.
Meningkatkan
^
Tambah akumulator satu per satu.
Mengurangi
v
Kurangi akumulator dengan satu.
Menambahkan
+x
Menetapkan akumulator ke nilai akumulator plus nilai x.
Mengurangi
-x
Menetapkan akumulator ke nilai akumulator dikurangi nilai x.
Berkembang biak
*x
Mengatur akumulator ke nilai akumulator dikalikan dengan nilai x.
Membagi
/x
Menetapkan akumulator ke nilai akumulator dibagi dengan nilai x. (Perhatikan bahwa ini adalah pembagian bilangan bulat, sehingga 1/6
menghasilkan 0
)
Jumlah
n
Atur akumulator ke integer n.
Catatan
Di sini, x
dan n
dapat setiap bilangan bulat dari 0
ke 2^32-1
inklusif.
Informasi lebih lanjut
Anda hanya harus menggunakan operator yang dijelaskan di atas. Karena itu, program Fourier yang Anda keluarkan tidak valid jika menggunakan salah satu dari yang berikut ini (perhatikan bahwa operator berikut diizinkan untuk mendapatkan hadiah):
- Ulangi loop
- Pernyataan jika
- Variabel
- Acak
- Modulo
- Input Pengguna
- Lebih besar / kurang dari operator
- Operator kesetaraan
- Hapus layar
- Waktu tunda
- Fungsi tanggal
Program Anda bisa berupa program penuh atau fungsi, menerima input melalui STDIN, file atau argumen fungsi. Anda juga dapat mengambil input langsung dari Internet.
Perhatikan bahwa jika ada vv
dalam kode Anda, Anda harus menggantinya dengan -2
. Hal yang sama berlaku untuk ^^
menggantikannya +2
.
Contohnya
Jika inputnya 7n
, maka program yang diharapkan adalah:
55a110a
Tetapi Anda dapat menyimpan satu byte dengan
55a*2a
Cara lain adalah
7o110a
Menggunakan nomor keluar.
Demikian pula jika inputnya Hello
, maka program yang diharapkan adalah:
72a101a108a108a111a
Anda dapat menurunkannya dengan 3 byte (karena keluaran tidak mengubah akumulator):
72a101a108aa111a
Tapi tunggu, kita bisa menggunakan operator tambahan, menghemat 2 byte:
72a101a+7aa+3a
Memformat
Karena saya akan menggunakan leaderboard Stack Snippet Martin Büttner, bisakah Anda memformat judul seperti:
# <Language name>, <length of total output> bytes
Kemudian, Anda dapat meletakkan apa pun yang Anda inginkan di bawah judul.
Kemenangan
Anda harus memposting panjang program Fourier (dihasilkan oleh kode Anda) untuk menampilkan file teks ini dan file teks ini . Skor Anda adalah panjang gabungan dari kedua program Fourier dalam byte (karakter non-ASCII tidak digunakan dalam Fourier sehingga tidak benar-benar membuat perbedaan).
Orang dengan skor terendah menang. Jika ada seri, program terpendek dalam byte akan menang.
Karunia
Hadiah 500 rep ini adalah untuk jawaban baru yang memanfaatkan string menggunakan salah satu fungsi Fourier. Itu termasuk variabel, loop dan jika pernyataan dll. Jawaban baru ini tidak akan diterima.
Papan peringkat
Lihat bagian pemformatan di atas:
var QUESTION_ID=55384;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> <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>
sumber
Jawaban:
Python, 14307118 byte
601216 untuk Hamlet + 13705902 untuk Genesis = 14307118
Pasti ada beberapa senarios di mana solusi ini tidak optimal, seperti untuk
1111
, di mana ia akan menghasilkan1111o
sebagai lawan11oo
. Namun, saya pikir itu hampir optimal.Sunting: Disimpan beberapa byte dengan meningkatkan
0o0o
ke0oo
.Nama file yang berisi input diterima pada STDIN, output ke STDOUT.
Hasil diverifikasi dengan penerjemah resmi.
sumber
> <>, 14310665 byte
601398 untuk dusun + 13709267 untuk genesis
Ini masih dalam proses dan membutuhkan banyak waktu untuk menyelesaikannya.
sumber
Java, 14307140 byte
Hamlet - 601.218
Kejadian - 13.705.922
Idenya di sini adalah melakukan semua pekerjaan di muka, dengan membuat peta karakter-> karakter. Kemudian Anda bisa melewati dan mengambil string terpendek.
Sedikit pengecualian harus dibuat untuk angka, jadi saya periksa mereka di loop utama. Ini masih cepat, dan menangani test case yang lebih besar dalam beberapa detik. Saya mungkin dapat mengubah bagian ini untuk beberapa byte lagi, tapi saya cukup yakin itu mendekati optimal.
Input adalah nama file sebagai argumen. Output ditulis ke file
inputFilename_out.4
, dan jumlah karakter dikirim ke STDOUT.Ini adalah 1737 bytes untuk tiebreak, benar-benar tidak dikenali. Saya bisa bermain golf banyak jika diperlukan, tetapi masih akan sedikit besar.
sumber
01
, saya percaya itu keluaran01o
, yang tidak benar.else
klausa loop utama, Anda memilih antara menggunakan nilai aktual akumulator dan nilai karakter karakter sebelumnya. Anda tidak dapat membuat pilihan yang terakhir jika keduanya berbeda, karena itu berarti Anda menggunakano
waktu sebelumnya, dan akumulator tidak mengandung nilai karakter sebelumnya.PHP, 14307118 byte
601.216 (Hamlet) + 13.705.902 (Alkitab)
Output Fourier untuk Hamlet
Ia bekerja sebagai berikut:
sumber