Ini adalah kentang:
@@
@@@@
@@@@@@
@@@@@@
@@@@
@@
Lebih umum, kentang ukuran N didefinisikan sebagai bentuk berikut:
Jika N adalah genap, itu adalah 2 @
simbol berpusat , diikuti oleh 4 @
simbol berpusat , diikuti oleh 6 @
simbol berpusat , semuanya hingga @
simbol berpusat N ; kemudian, @
simbol berpusat N , diikuti oleh simbol berpusat N-2 @
, sampai ke 2.
Jika N aneh, kentang ukuran N dihasilkan dengan cara yang sama seperti yang dijelaskan di atas, tetapi kita mulai dengan 1 @
simbol, bukan 2 .
Sebuah kentang dikupas dengan mulai di sudut kanan atas, dan menghapus satu @
tanda setiap langkah, dengan cara berlawanan arah jarum jam. Misalnya, mengupas kentang ukuran-3 terlihat seperti ini:
@
@@@
@@@
@
@@@
@@@
@
@@
@@@
@
@@
@@
@
@@
@@
@@
@
@
@
@
Tantangan
Tulis sebuah program, yang, diberi input integer, menampilkan semua langkah mengupas kentang sebesar itu.
Trailing whitespace / newlines diizinkan.
Mencetak gol
Ini adalah kode-golf ; kode terpendek dalam byte menang.
Contoh Uji Kasus
N = 2
@@
@@
@
@@
@@
@
N = 7
@
@@@
@@@@@
@@@@@@@
@@@@@@@
@@@@@
@@@
@
@@@
@@@@@
@@@@@@@
@@@@@@@
@@@@@
@@@
@
@@
@@@@@
@@@@@@@
@@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@@@
@@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@@
@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@@
@@
@@
@@@@
@@@@@@
@@@@@@
@@@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@
@@@@@
@@@
@
@@
@@@
@@@@@
@@@@@
@@@
@
@
@@@
@@@@@
@@@@@
@@@
@
@@@
@@@@@
@@@@@
@@@
@
@@
@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@
@@@
@
@@
@@@@
@@@@
@@@
@
@@
@@@@
@@@@
@@
@
@@
@@@@
@@@@
@@
@@
@@@@
@@@@
@
@@
@@@@
@@@
@
@@
@@@
@@@
@
@
@@@
@@@
@
@@@
@@@
@
@@
@@@
@
@@
@@
@
@@
@@
@@
@
@
@
@
Katalog
Berdasarkan Apakah nomor ini prima?
<style>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: bold; } table td { padding: 5px; }</style><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><script>var QUESTION_ID = 101224; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 12012; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://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 "https://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); } }</script>
Jawaban:
Perl, 129 byte
128 byte kode +
-n
bendera.Anda perlu
-nE
bendera untuk menjalankannya:Penjelasan: (Saya akan memerinci lebih banyak ketika saya punya waktu sebentar)
Bagian pertama
$p=($r=$"x$n++."@"x$_.$/).$p.$r,$_-=2while$_>0;
,, menghasilkan kentang awal: dimulai dari garis tengah kentang, dan menambahkan dua baris pada setiap iterasi: satu sebelum string sebelumnya, satu setelah. Perhatikan bahwa itu$"
adalah spasi, dan karena$n
tidak diinisialisasi, itu dimulai pada 0, dan$/
merupakan baris baru.Perhatikan banyak hal tentang
say$_=$p;
yang mencetak kentang awal saat menyimpannya$_
(yang nantinya akan lebih mudah dimanipulasi).Akhirnya,
say y/A/ /r while s/(^| )A(.*\n? *)@/$1 $2A/m||s/@( *\n?.*)A/A$1 /||s/@/A/
kupas kentangnya. Posisi terakhir di mana a@
dihapus mengandungA
(sewenang-wenang, itu bisa berupa simbol apa saja). Jadi setiap iterasi terdiri dalam menemukanA
, menggantinya dengan spasi, dan sementara itu menggantikan yang berikutnya@
dengan aA
. Itu dilakukan berkat dua regex:s/(^| )A(.*\n? *)@/$1 $2A/m
ketikaA
ada di sisi kiri kentang (A(.*\n? *)@
memungkinkan untuk pergi di kanan atau ke bawah), dans/@( *\n?.*)A/A$1 /
ketikaA
berada di sisi kanan (@( *\n?.*)A
memungkinkan untuk naik atau di sebelah kiri).s/@/A/
mengganti yang pertama@
denganA
(itulah inisialisasi). Karena kita selalu memilikiA
string, kita perlu menggantinya dengan spasi saat mencetaknya, itulah yangy/A/ /r
terjadi.Hanya untuk mata , versi animasi terlihat cukup bagus: (untuk dijalankan di terminal, kira-kira kode yang sama tetapi dengan
clear
dansleep
)sumber
Befunge,
319254 byteMotivasi untuk algoritma ini adalah untuk mencoba dan menghindari percabangan sebanyak mungkin, karena satu jalur eksekusi umumnya lebih mudah untuk bermain golf. Dengan demikian kode terdiri dari hanya dua loop: loop luar iterasi di atas frame dari proses peeling, dan loop dalam rendering kentang untuk setiap frame.
Rendering loop pada dasarnya hanya menghasilkan urutan karakter, karakter untuk setiap iterasi ditentukan oleh formula yang agak rumit yang mengambil nomor bingkai dari proses peeling dan indeks urutan output dan mengembalikan salah satu
@
, spasi, atau baris baru, seperti yang dipersyaratkan.Cobalah online!
sumber
Python 3.5.1, 520 byte
Penjelasan
Ide dasar: Berganti-ganti antara iterasi setiap baris dan menghapus karakter paling kiri dan iterasi setiap baris menghapus karakter paling kanan saat masih ada yang
@
tersisa.Secara keseluruhan upaya yang menyedihkan pada prosedur langsung.
sumber