Ada beberapa tantangan di situs ini yang meminta Anda untuk mencetak urutan, dan ini tidak terkecuali.
(Penjelasan berikut dari urutan untuk tantangan ini mengasumsikan simbol dalam urutan adalah 0
dan 1
.)
Definisi rekursif dari urutan Thue-Morse adalah itu
T_0 = 0
T_2n = T_n
T_2n+1 = 1 - T_n
Definisi yang lebih langsung adalah bahwa urutan dari 0
ke 2**m-1
dan 2**m to 2**(m+1)-1
merupakan pelengkap biner. Jadi 0
diikuti oleh 1
, 01
diikuti oleh 10
, 0110
diikuti oleh 1001
, dan, melompati sedikit, 0110100110010110
diikuti oleh 1001011001101001
.
Tantangannya adalah untuk menulis program atau fungsi yang mencetak urutan Thue-Morse untuk n
elemen pertama , di mana n
ada bilangan bulat non-negatif. Output dapat menggunakan dua simbol, seperti yang ditunjukkan pada contoh di bawah ini.
Contohnya
>>> tm_01(20)
01101001100101101001
>>> tm_ab(42)
abbabaabbaababbabaababbaabbabaabbaababbaab
>>> tm_paren(37)
())()(())(()())()(()())(())()(())(()(
>>> tm_space_star(12)
** * ** *
>>> tm_01(0)
# to show that this is a valid input
Aturan
Masukan akan berupa bilangan bulat non-negatif. Anda dapat menganggap semua input valid.
Output harus menjadi
n
elemen pertama dari urutan Thue-Morse, menggunakan simbol apa saja yang nyaman. Jika suka, Anda juga dapat menambahkan pemisah. Dalam contoh saya, saya belum. Catatan: Aturan ini memungkinkan daftar (seperti yang dari Python), seperti,
pemisah yang valid dan saya tidak keberatan memimpin atau mengikuti karakter, seperti[
dan]
dalam output.Ini adalah kode golf, sehingga jumlah byte terkecil menang.
Seperti biasa, jika masalahnya tidak jelas, beri tahu saya. Semoga berhasil dan bermain golf dengan baik!
Katalog
var QUESTION_ID=65549;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk";var OVERRIDE_USER=47581;var answers=[],answers_hash,answer_ids,answer_page=1,more_answers=true,comment_page;function answersUrl(index){return"http://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"http://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){if(c.owner.user_id===OVERRIDE_USER)answers_hash[c.post_id].comments.push(c)});if(data.has_more)getComments();else if(more_answers)getAnswers();else process()}})}getAnswers();var SCORE_REG=/<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;var OVERRIDE_REG=/^Override\s*header:\s*/i;function getAuthorName(a){return a.owner.display_name}function process(){var valid=[];answers.forEach(function(a){var body=a.body;a.comments.forEach(function(c){if(OVERRIDE_REG.test(c.body))body='<h1>'+c.body.replace(OVERRIDE_REG,'')+'</h1>'});var match=body.match(SCORE_REG);if(match)valid.push({user:getAuthorName(a),size:+match[2],language:match[1],link:a.share_link,});else console.log(body)});valid.sort(function(a,b){var aB=a.size,bB=b.size;return aB-bB});var languages={};var place=1;var lastSize=null;var lastPlace=1;valid.forEach(function(a){if(a.size!=lastSize)lastPlace=place;lastSize=a.size;++place;var answer=jQuery("#answer-template").html();answer=answer.replace("{{PLACE}}",lastPlace+".").replace("{{NAME}}",a.user).replace("{{LANGUAGE}}",a.language).replace("{{SIZE}}",a.size).replace("{{LINK}}",a.link);answer=jQuery(answer);jQuery("#answers").append(answer);var lang=a.language;lang=jQuery('<a>'+lang+'</a>').text();languages[lang]=languages[lang]||{lang:a.language,lang_raw:lang.toLowerCase(),user:a.user,size:a.size,link:a.link}});var langs=[];for(var lang in languages)if(languages.hasOwnProperty(lang))langs.push(languages[lang]);langs.sort(function(a,b){if(a.lang_raw>b.lang_raw)return 1;if(a.lang_raw<b.lang_raw)return-1;return 0});for(var i=0;i<langs.length;++i){var language=jQuery("#language-template").html();var lang=langs[i];language=language.replace("{{LANGUAGE}}",lang.lang).replace("{{NAME}}",lang.user).replace("{{SIZE}}",lang.size).replace("{{LINK}}",lang.link);language=jQuery(language);jQuery("#languages").append(language)}}
body{text-align:left!important}#answer-list{padding:10px;width:290px;float:left}#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="language-list"> <h2>Shortest Solution 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> <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> <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>
Jawaban:
Pyth, 6 byte
Cobalah online: Demonstrasi
Berdasarkan solusi dari @ThomasKwa dan variasi @FryAmTheEggman.
Ia menggunakan formular sebagai berikut:
i
digit -th di urutan Thue-Morse adalah:xor(digits of i in base 2)
.Penjelasan:
sumber
CJam,
179 byteatau
Uji di sini.
Penjelasan
Ini menggunakan definisi alternatif yang diberikan di Wikipedia, berdasarkan pada paritas jumlah
1
s dalam representasi biner darin
.Solusi alternatif digunakan
,
untuk mengubahn
secara eksplisit menjadi rentang[0 ... n-1]
sebelum menggunakan operator infiks untuk menghitung representasi biner dan XOR tanpa perlu blok.Solusi Bonus
Berikut adalah beberapa solusi berdasarkan definisi lain. Jika ada dua solusi, yang lebih pendek akan meledakkan memori dengan sangat cepat (karena precomputation menghasilkan
2^n
bit sebelum dipotong ken
).Sebagai sistem-L dengan
0 --> 01
dan1 --> 10
:Dengan meniadakan dan menambahkan bagian sebelumnya:
Menggunakan relasi perulangan yang diberikan dalam tantangan, menggunakan
divmod
dan XOR untuk membedakan antara dua definisi rekursif:(Meskipun, tentu saja, hubungan perulangan ini hanya cara yang berbeda untuk mengekspresikan urutan Thue-Morse sebagai paritas 1-bit dalam representasi biner dari
n
.)sumber
42
(dengan asumsi bitset) akan sangat tidak masuk akal.:^
membuatku bahagia. Pada catatan lain, sial, itu algoritma yang keren.:^}
?Dyalog APL,
87 byteIni adalah kereta monadik yang mengharapkan asal indeks 0 (
⎕IO←0
). Fungsi non-kereta setara adalah{≠⌿(⍵⍴2)⊤⍳⍵}
.Penjelasan:
Output adalah daftar yang dipisahkan oleh ruang dari
0
dan1
. Coba di sini .sumber
Mathematica,
3521 byteMathematica memiliki built-in untuk urutan Thue-Morse!
Jawaban asli:
sumber
LabVIEW, 15 Primview LabVIEW
sekarang sebagai gif super mewah dengan probe
sumber
J,
1211 byte@ MartinBüttner menyimpan satu byte.
Ini adalah fungsi monadik (artinya unary), digunakan sebagai berikut:
Penjelasan
Saya menggunakan definisi alternatif bahwa T n adalah paritas dari jumlah 1-bit dalam representasi biner dari n.
sumber
{.(,-)^:]
bekerja untuk 9 byte dengan beberapa aturan peregangan ( yang telah diizinkan ). Misalnya untuk5
itu output5 _5 _5 5 _5
. (Ditambahkan hanya sebagai komentar karena aturan yang berlaku.)Pyth,
1110 byteOutput sebagai daftar gaya-Python.
sumber
F
karena saya mencari 'kurangi'. Anda dapat memposting sebagai CW ...Japt ,
2911 byteCobalah online!
Output langsung sebagai array, yang menghemat sekitar 4 byte.
Tanpa penjelasan dan penjelasan
Sunting: Sekarang Anda dapat menggunakan kode 8-byte berikut (tidak valid; fitur yang diterbitkan setelah tantangan ini):
sumber
Haskell,
393635 byteCobalah online!
Cara kerjanya: mulai dengan
[0]
dan terapkan kali-x ++ invert x
fungsin
. Ambiln
elemen pertama dari daftar yang dihasilkan. Berkat kemalasan Haskell, hanyan
elemen pertama yang benar-benar dihitung. Catatan: yang pertama<*>
dalam konteks fungsi, yang kedua dalam konteks daftar.Dengan GHC v8.4 (yang tidak tersedia pada saat tantangan) ada solusi 34 byte:
Edit: -3 resp. -4 byte terima kasih kepada @Laikoni. -1 byte terima kasih kepada @ Ørjan Johansen.
sumber
(\x->x++map(1-)x)
dapat disingkat menjadi([id,(1-)]<*>)
atau(id<>map(1-))
dengan GHC 8.4.take<*>(iterate([id,(1-)]<*>)[0]!!)
Haskell, 54 byte
Kurang kompak daripada solusi nimi, tapi saya tidak ingin menyangkal Anda sepotong kode kebingungan fungsional. Berfungsi untuk pasangan benda apa pun; mis. Anda bisa mengganti
(f 0.f 1)
dengan(f 'A'.f 'B')
.Berdasarkan definisi bahwa 2 n digit pertama diikuti oleh urutan digit yang sama terbalik. Apa yang kami lakukan adalah membangun dua daftar berdampingan; satu untuk urutan, satu untuk kebalikannya. Kami terus menambahkan bagian yang semakin panjang dari satu daftar ke yang lain.
Implementasinya terdiri dari tiga definisi:
Fungsi
t
menerima nomor apa pun dan mengembalikan urutan Thue-Morse dari panjang itu. Dua fungsi lainnya adalah pembantu.f
mewakili salah satu daftar;f 0
adalah untuk urutan,f 1
untuk kebalikannya.g
menangani penambahan pengulangan yang semakin lama dari satu daftar ke yang lain.Biola: http://goo.gl/wjk9S0
sumber
Pari / GP , 33 byte
Cobalah online!
sumber
Burlesque, 21 byte
Contoh:
Penjelasan:
Tanpa
jri.+
bagian Anda akan kehabisan memori (karena itu akan menghitung urutan panjang morse jumlah yang sangat besar ). Tetapi karena Burlesque malas, hanya meminta elemen-n pertama akan berhasil.sumber
K5,
2713 byteMenghitung urutannya cukup mudah, masalahnya menghindari komputasi terlalu banyak. Kita dapat mengenali bahwa perluasan urutan yang mudah memberi kita urutan string yang merupakan kekuatan dua panjang berturut-turut. Mengambil basis log 2 dari input dan mengumpulkan akan memberi kita cukup untuk bekerja dengan dan kemudian kita dapat memotongnya ke ukuran yang sesuai:
Edit:
Solusi berbasis paritas:
Dalam aksi:
Perhatikan bahwa karena K5 tidak memiliki primitif convert-to-binary yang sewenang-wenang, saya harus menentukan, misalnya, decoding 64-bit. K5 tidak menggunakan matematika presisi arbitrer, jadi akan ada batasan ukuran input yang bisa kita tangani dalam hal apa pun.
sumber
Oktaf,
3331 byteDisimpan 2 byte berkat Thomas Kwa.
sumber
Perl 5,
6249 byteYa, bukan bahasa terbaik untuk yang satu ini, tapi saya masih suka caranya keluar. Membutuhkan 5,14+ untuk
/r
dansay
.Menggunakan definisi paritas, membutuhkan 5.12+ untuk
say
:sumber
Prolog (SWI), 115 byte
Kode:
Dijelaskan:
Contoh:
Cobalah online di sini
sumber
Retina ,
7069 byteMenggunakan definisi sebagai sistem-L dengan kata
0
dan produksi awal0 --> 01
dan1 --> 10
.Input diambil secara unary .
Anda dapat menjalankan kode dari satu file dengan
-s
bendera. Atau coba saja secara online.Penjelasan
Sandi
0;
input, di mana0
kata awal dan;
hanya pemisah.Yang
(
menunjukkan bahwa ini adalah awal dari suatu loop (yang berulang sampai loop berhenti mengubah string). Tahap ini sendiri berubah0
dan1
menjadia
danb
masing - masing (karenad
diperluas ke0-9
). Ini melakukan ini selama kata saat ini (yang panjangnya diukur dengan(.)+
lebih pendek dari input (yaitu selama kita tidak dapat membaca akhir string dengan mencocokkan sebanyak yang1
kita miliki dalam kata).Ganti
a
(siap untuk0
) dengan01
.Ganti
b
(siap untuk1
) dengan10
. Ini juga merupakan akhir dari perulangan. Loop berakhir setelah kondisi pada tahap transliterasi gagal, karena semua0
s dan1
s akan tetap tidak berubah dan dua tahap lainnya tidak akan menemukan apa pun yang cocok.Langkah terakhir adalah memotong kata hingga panjang input. Kali ini kita mengukur panjang input dengan
(.)+
di lookahead. Kemudian kami mencocokkan banyak karakter dari awal string.sumber
Ruby, 33
Panggil seperti ini:
Menggunakan fakta bahwa paritas bilangan biner membentuk urutan thue-morse.
Karakter pemisah adalah baris baru. Mengonversi angka
i
menjadi string biner, lalu menghitung jumlah semua kode ASCII, modulo 2.Jika baris baru bukan pemisah yang dapat diterima, berikut ini tidak memiliki pemisah untuk 2 byte tambahan:
sumber
MATL , 9 byte
Bahasa ini dirancang setelah tantangan .
Pendekatan 1: 13 byte
Ini membangun urutan dengan menggabungkan salinan blok ukuran yang dinegasikan.
Contoh
Penjelasan
Pendekatan 2: 9 byte
Ini menggunakan pendekatan yang sama dengan jawaban Alephalpha .
Contoh
Penjelasan
sumber
C,
8883 byteMenghitung paritas untuk setiap posisi individu.
Biola: http://goo.gl/znxmOk
sumber
Jelly , 4 byte
Perhatikan bahwa tantangan ini lebih tua dari Jelly.
Cobalah online!
Bagaimana itu bekerja
sumber
Matlab, 42
Saya menggunakan fakta bahwa itu sama dengan memulai dengan
0
dan kemudian mengulangi langkah menambahkan pelengkap dari seri saat ini,n
kali.sumber
𝔼𝕊𝕄𝕚𝕟, 11 karakter / 23 byte (tidak kompetitif)
Try it here (Firefox only).
Lingkaran kuat dengan yang ini.
sumber
Bash,
7166 byteBerdasarkan definisi bahwa 2 n digit pertama diikuti oleh urutan digit yang sama terbalik.
$1
sebagai parameter adalah jumlah digit yang diinginkan.Biola: http://goo.gl/RkDZIC
sumber
Batch, 115 + 2 = 117 byte
Berdasarkan jawaban Bash.
Membutuhkan tambahan
/V
dalam doa untuk memungkinkan penggunaan!
s.sumber
ES6, 53 byte
Rekursi tampak lebih sederhana daripada satu lingkaran.
sumber
Par , 8 byte
Penjelasan:
Menghasilkan sesuatu seperti:
sumber
Matematika ++ , 86 byte
Penggunaan
0.0\n
untuk 0 dan1.0\n
untuk 1sumber
Arcyóu ,
5055 byteSaya harus menambahkan 5 byte agar berfungsi dengan benar :(
Penjelasan (dengan kodesemu Pythonesque di sepanjang sisinya:
sumber
Gangguan Umum , 50 byte
Cobalah online!
sumber