Latar Belakang
Musim panas telah berakhir di belahan bumi utara, dan banyak dari kita merindukan matahari, pantai, ombak lautan ... Tantangan ini bertujuan menyemangati mereka dengan mengingatkan mereka pada laut.
Tantangan
Inilah laut:
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
** ****** ****** ****** ****** ****
Lautan terbuat dari 5 kali pola gelombang ini:
**
****
*****
** **
** **
* *****
Perhatikan bahwa polanya adalah 16 karakter, dan laut adalah 5 kali polanya = 80 karakter.
Yang dapat Anda cetak ke terminal menggunakan baris perintah ini:
perl -e 'print " ** \n **** \n ***** \n ** ** \n ** ** \n* *****\n"'
Atau yang ini:
perl -e 'print " "x12, "*"x2, " "x2, "\n", " "x8, "*"x4, " "x4, "\n", " "x5, "*"x5, " "x6, "\n", " "x3, "*"x2, " "x3, "*"x2, " "x6, "\n", " "x1, "*"x2, " "x6, "*"x2, " "x5, "\n", "*"x1, " "x10, "*"x5, "\n"'
(Yang kedua harus memudahkan Anda untuk mendapatkan pola yang tepat)
Tugas Anda adalah menampilkan laut di terminal, dan menjadikannya seperti ombak bergerak ke kanan: ia perlu bergeser ke kanan dengan kecepatan 1 karakter masing-masing 100 ms (= 10 kali setiap detik). Tidak ada karakter yang harus dicetak setelah kolom ke-80, tetapi ketika gelombang paling kanan menghilang, yang baru muncul di sebelah kiri.
Ini adalah contoh dari output:
waktu = 0,0s
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
** ****** ****** ****** ****** ****
waktu = 0,1s
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
*** ****** ****** ****** ****** ***
waktu = 0.2s
* ** ** ** ** *
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
**** ****** ****** ****** ****** **
waktu = 0,3 detik
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
***** ****** ****** ****** ****** *
waktu = 0,4 dtk
** ** ** ** **
* **** **** **** **** ***
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
****** ****** ****** ****** ******
Tentu saja, setiap output harus menggantikan yang sebelumnya.
Anda dapat menjalankan kode ini ke terminal unix untuk melihat bagaimana tampilannya dengan animasi:
perl -M5.010 -MTime::HiRes=sleep -E '@arr=([($")x12,($n="*")x2,($")x3],[($")x8,($n)x4,($")x4],[($")x5,($n)x5,($")x6],[($")x3,($n)x2,($")x3,($n)x2,($")x6],[($")x1,($n)x2,($")x6,($n)x2,($")x5],[($n)x1,($")x10,($n)x5]);while(++$j){for$i(0..5){for$k(0..15) {$out[$i][16*$_+$k]=$arr[$i][($k-$j)%16]for 0..4}}say"\e[H",$/,join$/,map{join"",@$_}@out;sleep 0.1}'
(Perhatikan bahwa kode ini tidak golf dengan sangat baik: Saya baru saja membuatnya cukup ringkas untuk nyaman dijalankan di terminal.)
Kriteria menang
Ini codegolf, jadi kode terpendek dalam byte menang.
Jawaban:
MATL ,
4140 byteContoh dijalankan:
Atau coba di MATL Online! (kecepatan aktual mungkin tergantung pada beban server).
Bagaimana itu bekerja
sumber
JavaScript (ES6) + HTML,
151143 + 10 =161153 bytesumber
a
?a
memegang pola gelombang binary-encoded dan diputar pada setiap frame. Jadi, itu tidak bisa di-hardcode: perlu disimpan dalam variabel.HTML + CSS, 70 +
181175 = 245 byteMerek penggunaan
text-shadow
,rtl
teks dan CSS keyframe animasi.sumber
C #
450444425417 Bytes399 tanpa
using System.Linq;
tapi saya yakin itu akan curang ...Sunting: Disimpan 25 Bytes berkat @Cyoce
Golf:
Tidak Disatukan:
sumber
(a)=>
. Danwhile(true)
bisafor(;;)
s
lambda saya pikir Anda dapat menghapus{}
danreturn
\r
daristring.Join
(setidaknya pada Windows berfungsi, tidak mengujinya dengan Mono) Anda juga dapat menyimpan 1 byte dengan memasukkanp++
ke dalamfor
loop seperti inifor(;;p++)
if (p==16)...
) Anda juga dapat memasukkannya ke dalam tajuk loop seperti inifor(;;p=++p%16)
. Simpan 1 byte lebih banyak dengan mendeklarasikanp
dalam loop (for(int p=0;;p=++p%16)
)V,
989773 byteTerima kasih kepada @ nmjcman101 untuk menghemat 24 byte!
Ini mengandung banyak unsintables, jadi inilah xdd hexdump:
Sunting
Digunakan
y$
sebagai ganti<C-v>$y
Banyak perubahan
{
dan}
untuk menyimpan beberapa byteò
alih-alih register untuk membuat loop tak terbatas (untuk beberapa alasan saya harus menyertakan aò
pada akhirnya agar bisa bekerja)*
di bagian bawahMini-Penjelasan
saya menggunakan
<alt-n>
untuk membuat salinan string. Misalnya,<alt-5>*
(sepertinya iniµ5
) membuat5
salinan*
dalam mode sisipkan. Ini saya temukan lebih pendek daripada menyalin string dan menggunakan regex untuk melakukan penggantian yang diperlukan. Setelah membuat satu gelombang, saya tempel untuk membuat gelombang lainnya. Akhirnya, saya menggunakan loop secara rekursifò
untuk membuat infinite loop (dengan penundaan100ms
).Gif
Sebagian besar kode didedikasikan untuk menciptakan gelombang, jadi saya masih mencoba golf ini. Perhatikan bahwa kode ini tidak akan berfungsi pada TIO karena TIO hanya menampilkan output setelah kode selesai dieksekusi. Jadi, inilah gif (maaf untuk kualitas rendah, saya harus menggunakan situs web untuk mengonversi
.mov
menjadi.gif
, juga>_
yang terus muncul di sebelah kanan adalah ikon Terminal di dok mac saya):sumber
5j
(dalam konteks$<C-V>5j
) bisa saja}
, danp
setelah|
harusP
yang akan memperbaiki statis*
di kiri bawah.qm[CODE]@mq@m
di akhir hanya denganò[CODE]
. Kode di antaraò
akan berulang sampai melanggar (mirip dengan makro Anda), dan pada akhir program secaraò
implisit ditutup.Batch, 424 byte
Beberapa garis memiliki spasi tambahan. Membutuhkan terminal 80 kolom standar. Waktunya tidak terlalu akurat, tetapi itu yang terbaik yang dapat Anda lakukan di Batch.
sumber
Racket
395374373367364351 byteMenggunakan perpustakaan eksternal untuk pembersihan layar
Edit: Disimpan 21 byte dengan tidak mendefinisikan
w
dan menggarisbawahi fungsi.Sunting2: Disimpan 1 byte dengan menghapus spasi.
Sunting3: Disimpan 6 byte dengan mengganti nama
loop
menjadip
, terima kasih @rnso!Sunting4: Menempatkan substring di biarkan menyimpan 3 byte.
Sunting5: Hapus
#lang racket
, yang tidak diperlukan dalam juru bahasa.Golf: 351 byte
Menggulir (tidak jelas): 272 byte
Tidak Disatukan:
sumber
simplescreenrecorder
denganavconv
mengkonversi mp4 ke gif.rotmul
benar-benar menerimaw
sebagai parameter.PowerShell 3.0,
183182173 byteMembutuhkan PS 3.0 untuk operator shift biner. Ramping menjadi 173 byte dengan bantuan AdmBorkBork !
sumber
.PadLeft
, memindahkan$o
deklarasi ke dalam[convert]
panggilan, dan menghilangkan tanda kutip di sekitar angka dalam-replace
ops. Membuat Anda turun ke 175 -for(){0..5|%{("{0:D16}"-f+[Convert]::ToString(([uint16]$o=$w[$_]),2))*5-replace0,' '-replace1,'*'
+
di"{0:D16}"-f+[Convert]
? Itu tidak berfungsi tanpanya, tapi aku tidak bisa mengerti apa yang dilakukannya.[convert]::ToString()
mengembalikan string. The+
kekuatan cast ke[int]
sehingga-f
picks up jenis parameter yang benar untukD16
bekerja.+'1'
seperti operasi aritmetika yang valid tanpa hasil penjumlahan pertama, dilemparkanstring
keint
dan dikembalikan? Scott yang hebat!Bash + coreutils,
172148 byte24 byte disimpan berkat @zeppelin , terima kasih banyak
Baris pertama mendekompres pola berikut yang terbuat dari 6 gelombang berurutan:
Kemudian, loop slide jendela lebar 80-byte melalui pola itu.
sumber
*> <> ,
251250251 byte (tidak bersaing)Catatan:
"H;0["
seharusnya memiliki ascii27
setelahnya[
.Coba di sini! (setel penundaan ke 0ms)
Saya tidak percaya akhirnya berhasil membuat ini. Ini menggunakan
I
danD
instruksi, yang menambah atau mengurangi tumpukan yang dipilih. Ini menunjukkan bahwa mungkin saja melakukan ini dengan murni> <> (kurang tidur) atau jawaban kompetitif>> <>, meskipun mungkin jauh lebih sulit untuk dilakukan.Versi penerjemah online berbeda hanya untuk menghapus output menggunakan carriage return.
Ini adalah non-bersaing karena
I
,D
,C
, danR
petunjuk lebih muda dari tantangan. Ini mungkin dapat dilakukan tanpa instruksi tersebut, tetapi akan sangat sulit / lama.Sunting: Saya sebenarnya berhasil menghapus satu byte, tetapi saya juga perhatikan saya mengukur ukuran yang salah, jadi saya benar-benar mendapatkan satu byte.
Saya akan melakukan yang terbaik untuk memecah langkah dan menjelaskan apa yang terjadi di sini ...
Penjelasan
Daftar Isi
Inisialisasi
Di sini kita membangun 6 garis yang membangun gelombang. Kita harus mengulangi setiap string 5 kali untuk menjadi panjang yang benar.
Kita mulai dengan 6 ini, satu untuk setiap baris gelombang:
Dan kita memasuki loop utama setelah inisialisasi melalui
09.
.Salin Stack Saat Ini 4 Kali
Ini adalah fungsi sederhana yang hanya mengambil tumpukan saat ini, dan menyalinnya 4 kali. Jadi "a" akan menjadi "aaaaa".
Salin Tumpukan
Ini menyalin tumpukan saat ini, menambahkan salinan ke tumpukan saat ini.
Mempersiapkan
Akan melewati awal
<
dan membalikkan baris pertama menjadil:&0v
seperti itu urutan dieksekusi setelah<
perubahan arah IP.Dari sini panjangnya akan disebut sebagai
n
dan0
sebagaii
.Loop
Membersihkan
Loop Utama
Di sinilah kode berjalan selamanya, terus-menerus menggambar ulang gelombang di antara 100ms tidur.
Mempersiapkan
Loop
sumber
PHP, 128 byte
Tidak dapat menganimasikan lebih dari satu baris, tetapi menggulir.
Tambahkan
,0
ke array untuk baris kosong di antara iterasi. Jalankan dengan-r
.sumber
Mathematica, 213 byte
Saya tidak melihat cara apa pun untuk bermain golf pola gelombang di Mathematica selain hanya mulai dengan daftar string untuk setiap baris. Saya mulai
i
jadi0
dan menjadwalkan tugas untuk menambahnya setiap0.1
detik. SayaDynamic
sekutu menampilkan hasil sebagai berikut:StringRepeat
setiap baris 5 kali.Characters
.RotateRight
setiap daftar karakter olehi
.Grid
.sumber
C (unix),
231191 byteIni hanya akan berfungsi pada lingkungan unix. Juga, mohon alasan bahwa tidur hanya menerima bilangan bulat ... jadi sebenarnya penundaan 1 detik antara frame.
Versi tidak disatukan:
Versi golf:
sumber
Javascript (ES6),
152147145 bytesumber
setInterval(a=>{...},100,6)
, dan 4 lagi denganf+=" *"[[...][a]&1<<(i+x)%16]
.Perl 6,
140138137123120 byteSolusi lama:
sumber
Python 3,
240239230 byte-1 byte terima kasih kepada @redstarcoder
-9 byte terima kasih kepada @PascalvKooten
sumber
print("\x1b[0;H")
juga bekerja untuk saya selama -1 byte.' **'
dengan' '*13+'**'
dan Anda dapat memiliki lekukan 1 karakter sementara itu, tidak perlu menjadi 4 karakter.Racket 295 byte
Tidak Disatukan:
Pengujian:
Keluaran:
(Tampilan file gif ini lebih lambat dari output aktual).
sumber
Python 2,
207202 byteBiasanya saya adalah pengembang C #, jadi ini mungkin belum sepenuhnya golf ...
sumber
C #, 327 byte
Kurang lebih versi porting dari solusi saya di Python ...
sumber
Perl, 110 byte
Membutuhkan
-E
tanpa biaya tambahan. Ini mengandung karakter yang tidak patut dicetak.Buat data di atas menggunakan hexdump reversibel di bawah ini. Jalankan
xxd -d > sea.pl
di linux atau terminal yang kompatibel, rekatkan di bawah ini dan tekan Ctrl+ d, kemudian jalankanperl -E "$(cat sea.pl)"
.Pemakaian
Untuk menyalin / menempel dengan mudah, silakan gunakan di bawah ini:
Penjelasan
Solusi yang cukup mudah yang menyimpan gelombang sebagai string di awal, yaitu
unpack
diedit ke biner, setiap bagian digabungkan,0
s dikonversi menjadi spasi dan1
s dikonversi menjadi*
s. Sekarang kita memiliki seluruh string sehingga kita memasukkan saturedo
lingkaran yang mencetak seluruh string, lalu kita menunggu 0,1 detik dan untuk setiap baris dalam string, kita memindahkan karakter terakhir ke awal string.sumber
Mathematica 171 Bytes
Gelombang itu sendiri adalah data, jadi saya menyimpan versi terkompresi dari seluruh gelombang dalam kode saya. Saya dapat menyimpan satu gelombang dengan lebih kompak
\fð߀ᣀ恠耟
menggunakan representasi biner itu, tetapi jumlah karakter overhead dari uncompressing terlalu tinggi *.Ini kodenya:
Berikut adalah kode yang saya gunakan untuk membuat versi terkompresi dari data wave:
Berikut adalah kode yang saya lebih suka gunakan untuk menyimpan data biner berulang terkompresi seperti gelombang ini:
Seperti yang Anda lihat, overhead untuk mengubah data terkompresi kembali menjadi string terlalu mahal untuk masalah khusus ini, meskipun satu gelombang dapat disimpan dengan cara ini dengan 7 karakter UTF dan 15 byte.
Berikut adalah kode untuk menentukan urutan karakter UTF untuk menyimpan satu gelombang (seperti di atas).
sumber
Ruby
269217189185 Bytes-28 Bytes berkat @manatwork
-5 Bytes berkat @ropata
Normal
Golf
sumber
do … end
→{ … }
dan hapus baris baru setelah{
dan sebelum}
; hapus spasi di antarasystem
dan parameternya; hapus,
elemen terakhir array setelah literal;.each
→.map
dan hapus ruang di antara itu dan blok kodenya; menghapus ruang di depanputs
;0..80
→0,80
(ini juga bug saat Anda berekspresi menghasilkan string sepanjang 81 karakter);p=p+1==16?0: p+1
→p=-~p%16
.do … end
→{ … }
, masih perluloop
kata kunci. Ini adalah yang terpendek yang saya dapatkan: pastebin.com/cg3gxnm4b=' '
(5 spasi kosong) di atas kemudian mengubah ekspresi output menjadi' '*12+'** ', ' '*8+'**** ',b+'***** '+b,' ** ** '+b,' ** **'+b,'*'+b+b+'*****'
... (tapi SE tidak menunjukkan spasi berulang dengan benar dalam komentar ini!)HTML + JS + jQuery, 10 + 233 = 243 byte
JavaScript hanya menggeser setiap baris dengan 1 dan mengubah teks setiap 100 ms.
sumber