pengantar
Tahun lalu adalah hari ulang tahunku (sungguh!) Dan sayangnya aku harus mengatur pestaku sendiri. Nah, sekarang Anda tahu, tidak bisakah Anda setidaknya membuat kue?
Tantangan
Diberikan bilangan bulat n
sebagai input, tulis program lengkap untuk menampilkan kue ulang tahun dengan n
lilin menyala.
Keluaran
Sepotong kue dengan satu lilin menyala adalah:
$
|
---
~~~
---
Dan sepotong kue dengan tiga lilin menyala adalah:
$ $ $
| | |
-------
~~~~~~~
-------
Saya yakin Anda bisa mengatasinya
Namun , untuk input0
, Anda harus menampilkan yang berikut:
Congratulations on your new baby! :D
Untuk input yang kurang dari 0
, Anda harus mengeluarkan kue tanpa lilin:
---
~~~
---
Tidak ada yang diizinkan untuk menjadi output ke STDERR.
Trailing newlines dan spasi diizinkan.
Kemenangan
Kode terpendek dalam byte menang.
Papan peringkat
var QUESTION_ID=57277;OVERRIDE_USER=30525;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 commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
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>
Jawaban:
Pyth,
7372716967 byteCobalah online .
Output untuk n <0 berisi 2 baris baru, seperti yang diizinkan dalam komentar . Untuk menghilangkannya, gunakan
sumber
CJam,
7675 byteCobalah online di juru bahasa CJam .
Bagaimana itu bekerja
sumber
Ruby, 120 byte
Revisi 1 (120 byte)
18 byte disimpan berkat manatwork
Revisi 0 (138 byte)
Untuk bilangan positif: ini diulang melalui string yang sesuai dengan setiap baris kue. Ini digunakan sebagai string pad untuk membenarkan string kosong dengan panjang 2 * n + 1. Ini menghindari setiap komplikasi dengan harus mencetak sejumlah karakter ganjil, ketika pengulangan alami sama dengan nada lilin (yaitu 2 karakter.)
n>0&&
Diperlukan untuk menghindari mengeluarkan satu kolom jika input nol.Untuk semua angka: "
n<=>0
" menemukan tanda input. Pesan bayi adalah output untuk n = 0, dan string kosong untuk positif n (sebagai output yang benar telah diberikan di atas.) Untuk negatif n, Ruby mengartikan -1 sebagai makna elemen terakhir dari array, dan menampilkan candleless kue.sumber
puts
?n=gets.to_i puts ['Congratulations on your new baby! :D',%w{\ $ \ | - ~ -}.map{|e|''.rjust 2*n+1,e},'--- ~~~ ---'][n<=>0]
''.rjust
→e.ljust
.e.just
: sangat pintar.R, 157
sumber
R,
228226220221 BytesSunting terakhir untuk memperbaiki kue tanpa lilin, selebar yang positif pada kasus negatif, terima kasih @CathG dan @jbaums atas umpan baliknya.
sumber
<-
bisa=
, dan bisa Anda gunakana=b='-~-'
.Error: unexpected '}'
JavaScript ES6, 136
Menggunakan lansiran untuk keluaran - font proporsional buruk dan hasilnya jelek. Dalam cuplikan di bawah ini lansiran dialihkan ke badan yang terpotong, memberikan hasil yang lebih baik.
Baris baru di dalam backticks signifikan dan diperhitungkan.
Tes menjalankan cuplikan di Firefox.
Kurang golf
sumber
$('div pre code')[2].innerHTML
;)R, 279 byte
Versi interaktif (286 byte):
Bukan versi interaktif (279 byte):
sumber
MATLAB / Oktaf,
194198195189171167 byteSelamat ulang tahun Beta Peluruhan! :)
Terima kasih kepada HamtaroWarrior karena telah memangkas 4 byte!
Contoh Berjalan
Saya menempatkan ini ke dalam file skrip bernama
happy_birthday.m
, kemudian menjalankannya beberapa kali di command prompt. Perhatikan bahwa ketika Anda memasukkan angka negatif, ada dua pengembalian carriage terkemuka, tetapi itu dibolehkan dalam tantangan ini:Kode dengan spasi dan penjelasan
Bagian tampilan di bagian akhir mungkin adalah bagian kode yang paling dikaburkan. Ini akan menampilkan matriks karakter 5 baris di mana dua baris pertama terdiri dari lilin dan tiga baris terakhir terdiri dari dasar kue.
Dasar untuk bagian atas layar adalah dua spasi dalam satu kolom diikuti oleh dua spasi lain dalam kolom lain dalam hal usia adalah negatif, atau
$,-
dalam kolom diikuti oleh dua spasi dalam kolom lain. Ini adalah matriks karakter 2 x 2. Dasar untuk bagian bawah layar adalah vektor kolom tunggal-,~,-
yang merupakan matriks karakter 3 x 1.Perintah tampilan pertama menangani dua baris pertama kue dengan menempatkan dua spasi di kolom pertama, diikuti pasangan kolom
$,-
atau kolom spasi jikan
negatif, yang diubah menjadin=1
, dan kolom dua ruang lainnya diulang untuk totaln
kali. Tiga baris berikutnya cukup mereplikasi-,$,-
vektor kolom untuk2*n + 1
kali untuk meluruskan lilin bersama dengan basis, sehingga melengkapi gambar.Cobalah online!
Anda dapat mencoba ini secara online menggunakan kompiler Octave IDEOne: http://ideone.com/4qXDdJ - namun, ada sedikit bug ketika membaca nilai dari input standar. Dengan demikian, skrip sedikit dimodifikasi di mana Anda harus mengubah nilai
n
di awal kode. Fork versi baru dari skrip dan ubah ini menjadi nilai integer apa pun yang cocok untuk Anda untuk melihat seperti apa hasilnya.sumber
' '.'
!JavaScript,
143153 Bytesfor(v in k=' $ 0 | 0---0~~~0---'.split(+!(n=+prompt(c=''))))c+=k[v].repeat(n<0?1:n)+'\n';alert(n>0?c:n?c.slice(8):'Congratulations on your new baby! :D')
Untuk melihat output dalam font mono space ganti 'alert' dengan 'console.log'
sumber
Moonscript, 141 byte
sumber
rs , 117 byte
Demo langsung dan uji kasus.
sumber
JavaScript ES6, 154 karakter
Dan satu lagi (154 juga)
Untuk melihat output dalam font monospace (dan memindahkan ouptut ke konsol) gunakan
sumber
Mouse ,
164161 byteMouse jelas bukan pilihan ideal untuk tugas ini, tapi itu menyenangkan.
Tidak Terkumpul:
Tumpukan hanya dapat berisi bilangan bulat.
!'
mengambil bilangan bulat dari tumpukan dan mencetak karakter ASCII dengan kode itu.sumber
CoffeeScript, 160 byte
Tidak Terkumpul:
Gunakan seperti:
Cobalah online: tautan (Berisi beberapa kode tampilan khusus, jadi semuanya terlihat sangat bagus ...)
Ups, hampir lupa! Selamat ulang tahun, @BetaDecay!
sumber
C, 392 byte
(kesalahan segmentasi dikenal jika tidak ada argumen yang diberikan)
Tidak ditambang dan ditempatkan terlalu banyak
sumber
A
. Saya memang melihat beberapa ruang lagi yang bisa dihapus, dan Anda bisa menghilangkannyai
dengan menggunakanc
variabel loop. Juga, setidaknya dengan gcc, termasuk stdio.h atau menentukan jenis pengembalian main () tidak diperlukan: kompiler mengeluh tentang hal itu, tapi hei, ini kode golf. ;)Powershell,
139134132126 bytesumber
$input
alih-alih$args[0]
(pertanyaan tidak mengatakan menggunakan argumen alih-alih stdin), dan Anda dapat menggunakan unary+
untuk mengonversi ke nomor:$n=+$input;
$args[0]
dapat dan harus menjadi int yang sebenarnya, memungkinkan kita untuk setidaknya menjatuhkan[int]
.if
dan menukarelse
untuk;exit
- 122 byte -if($n=$args[0]){$d=3;if($n-gt0){' $'*$n;' |'*$n;$d=$n*2+1}'-'*$d;'~'*$d;'-'*$d;exit}'Congratulations on your new baby! :D'
Ceylon,
322307260 byte300282278Yang asli belum golf (dengan asumsi kue negatif memiliki lebar 3 bukannya –2 · n + 1):
Ini menampilkan daftar kondisi dalam pernyataan if, setiap kondisi menentukan nilai yang dapat digunakan dalam kondisi berikut dan dalam tubuh. Karena mereka memiliki
exist
, kondisi hanya terpenuhi ketika nilai-nilai tidak nol, dan dengan demikian kompiler mengetahui nilai-nilai tidak nol untuk kode berikut. (Jika tidak ada yang dimasukkan (EOF), readline mengembalikan null. Jika parseInteger hits non-integer, itu juga mengembalikan null. Program kami kemudian tidak melakukan apa-apa. Karena perilaku untuk kasus-kasus itu tidak didefinisikan, saya rasa ini tidak apa-apa.)Kami juga memiliki
<=>
operator, yang memetakan keComparable.compare
metode, dan mengembalikanComparison
objek, yaitu salah satu dariequal
,smaller
danlarger
. Kompiler tahu bahwa mereka mengurasComparison
tipe, jadi tidak adaelse
klausa yang diperlukan dalamswitch
pernyataan kami .The
repeat
metode kelas String melakukan apa yang diharapkan. Ini sebenarnya diwarisi dari metode yang sama-nama di antarmuka Iterable (seperti string, di samping hal-hal lain, hanya daftar karakter).Mengganti pengidentifikasi saya dengan satu huruf dan menghapus spasi putih yang tidak dibutuhkan menghasilkan 322 karakter:
Mengganti rangkaian
print
dengan\n
s eksplisit (dan satu tunggalprint
) membawanya ke 307:Saya mencoba alias mengimpor
repeat
sebagair
, tetapi tidak membantu (deklarasi impor menambahkan 40 karakter, dan kami hanya dapat menyimpan 25 dengan menggantirepeat
denganr
).Apa yang sedikit membantu, adalah menggunakan
n.sign
alih-alihn<=>0
. Sementara dua ekspresi ini memiliki panjang tekstual yang sama, mereka memiliki berbagai jenis: yang terakhir adalah tipeComparison
yang disebutkan sebelumnya (yang memiliki tiga nilaismaller
,larger
danequal
), mantan salah satu memiliki tipeInteger
, dengan nilai-nilai-1
,1
,0
... dan karenaInteger
memiliki lebih banyak nilai, kita juga perluelse
klausa. Ini sepanjang 300 karakter:Di sini dengan spasi putih:
Kita dapat mengamankan lebih banyak dengan mengundurkan diri tentang pernyataan peralihan dan penggunaan kita
if
, yang datang ke 282 karakter (= byte):Diformat:
Kita dapat mengamankan byte lain dengan menukar case di sekitar, karena
>
lebih pendek dari==
. "Gangguan" lain adalah yang diulangrepeat(n)
- kita dapat mendefinisikan fungsi lokal (penutup, ia mengingatn
dari blok yang mendefinisikan) dengan nama yang lebih pendek:Ini adalah cara yang lebih singkat untuk menulis ini:
Kita bisa menggunakan
function
alih-alih tipe pengembalian untuk inferensi tipe, tetapi ini tidak lebih pendek. Ini memberi kita 278 byte:Diformat:
Sebenarnya, menggunakan operator
then
danelse
bukanif
pernyataan memungkinkan kita untuk menyimpan beberapa panggilanprint
(dan beberapa kawat gigi):Ini hanya 261 byte:
shared void run(){if(exists t=process.readLine(),exists n=parseInteger(t)){String r(String s)=>s.repeat(n);print(n>0thenr(" $")+"\n"+r(" |")+"\n"+r("--")+"-\n"+r("~~")+"~\n"+r("--")+"-"else(n<0then"---\n~~~\n---"else"Congratulations on your new baby! :D"));}}
(Saya menggunakan
run
alih-alihb
untuk nama fungsi karena cara ini dapat dijalankan denganceylon run
tanpa melewati nama fungsi.)Repositori Github saya memiliki versi berkomentar tentang ini .
sumber
Python 2, 158 byte
sumber
golflua, 113 karakter
Contoh dijalankan:
sumber
Python 2, 150 byte
Dekat dengan Python penulis :(
sumber
Perl,
139127117 byteTidak memerlukan opsi '-n' atau '-p'.
Revisi 3 (dengan terima kasih kepada Dom Hastings di bawah):
Revisi 2:
Revisi 1:
Berikut adalah versi revisi 3 yang tidak memiliki baris baru kosong di input negatif - 132 byte.
sumber
"Congratulations..."
dan jika Anda mengganti' $',' |','-','~','-'
dengansplit 0,' $0 |0-0~0-'
Anda bisa drop kurung mereka juga. Simpan lainnya diganti$n=<>;$n==0
dengan($n=<>)==0
. Anda juga?1:
bisa||
seperti yang Anda katakan$n==0
(yaitu 1) atau perhitungan Anda. Semoga itu bisa membantu!||
sangat membantu - itu mengingatkan saya$=
pada dasarnyachomp
input, menghilangkan persyaratan untuk tes nilai 0 tertentu. Saya tidak yakin apa yang Anda maksud dengan$n=<>;$n==0
- golf saya tidak memilikinya, dan mengingat saya menangani input = 0 case sebagai input ke dalammap{}()
, saya tidak yakin bagaimana ini akan berlaku? Ngomong-ngomong, mengambil komentar Anda dan menggunakan$=
sebagai variabel saya, ini telah di-golf hingga 117 parbytes. Terima kasih banyak!$n=<>;
di awal dan kemudian$n==0
di belakangmap{}...
jadi saya pikir Anda bisa memeriksanya,($n=<>)==0
tetapi jika Anda menggunakan$=
Anda mungkin bisa menyusut lebih banyak! Saya selalu lupa yang mana$-
atau$=
tidak bisa negatif jadi saya tidak ingin menyebutkannya dan salah! :)Pip, 74 + 1 = 75 byte
Mengambil usia sebagai argumen baris perintah. Membutuhkan
-n
bendera.Repositori Github untuk Pip
Argumen baris perintah disimpan di
a
. Kami membelah"-~-"
menjadi daftar karakter danY
mengelompokkannya ke dalam variabely
. Sisa dari program ini adalah ekspresi ternary yang besar:a?
Jika
a
benar (yaitu bukan nol):a<0?yX3
Jika
a
negatif, kembalikany
dengan setiap elemen diulang 3 kali:["---";"~~~";"---"]
a
positif):(s.^"$|")Xa
Pisahkan
"$|"
menjadi daftar karakter, tambahkan spasi (s
) ke masing-masing, dan ulangi setiapa
kali elemen yang dihasilkanyX2*a+1
Ulangi setiap elemen
y
2*a+1
kaliAL
Tambahkan dua daftar
a
nol), kembalikan string ucapan selamatDi akhir program,
-n
bendera memastikan bahwa daftar dicetak dengan elemen-elemen pada garis yang berbeda, sehingga menampilkan kue yang berlapis dengan baik.Berikut langkah-langkah untuk input
2
:Selamat ulang tahun!
sumber
Perl, 144 byte
143 byte kode, ditambah satu byte tambahan untuk
-n
switch untuk menangkap stdin.sumber
print"-~-"=~s!.!$&x($_*2+1).$/!ger
untuk kue?-p
ini juga akan berfungsi:$_=$_!=0?($_>0?' $'x$_.$/." |"x$_:""x($_=1))."-~-"=~s!.!$/.$&x($_*2+1)!ger:"Congratulations on your new baby! :D"
SpecBAS, 164
Gunakan pintasan tanda kutip untuk pindah ke baris baru
Diformat agar mudah dibaca
sumber
Python 3, 169 byte
sumber
Julia, 143 byte
Cukup mudah. Tidak Terkumpul:
sumber
Lua, 299 Bytes
sumber
attempt to compare string with number
), tetapi menambahkan0+
sebelumio.read()
memperbaikinya untuk saya. Anda juga dapat menyimpan beberapa byte dengan menetapkanprint
danstring.rep
ke variabel karakter tunggal.Mathematica, 164 Bytes
Benar-benar melewatkan kue tanpa lilin untuk n <0, menambahkan 15 karakter tambahan
sumber
pb , 567 byte
Saya punya beberapa penyesalan.
Ada beberapa cara agar ini bisa lebih baik. Misalnya, setelah mengetahui bahwa inputnya negatif, saya kemudian melanjutkan untuk menyimpulkan angka negatif yang mana. Ini tidak perlu, dan mungkin suatu hari saya akan menyelam kembali ke kode ini untuk menghentikannya.
Jangan mencoba menjalankan ini dalam mode "watch" pbi, jika Anda memasukkan negatif, ia akan macet ketika mencoba mencetak
chr(-1)
.Inilah
versiversi yangdijelaskan dimana saya membuat catatan saat menulis program. Jika Anda ingin lebih memahami cara kerjanya ... semoga berhasil, dan beri tahu saya jika Anda mengetahuinya.sumber
ScriptCS (script C #), 221 byte
Jelas ini tidak akan memenangkan hadiah apa pun, tapi ...
sumber