Siapa yang tidak suka film aksi dengan mobil berisik, terutama yang banyak tabrakan? Siapa yang tidak suka foto aksi dalam seni ascii?
Adegannya adalah:
Dua mobil mulai di sisi yang berlawanan dari jalan lurus (dengan 60 ruang antara). Mereka mulai mengemudi satu sama lain dengan kecepatan konstan. Mobil ke kiri drive pada 1 ruang per detik, dan yang ke kanan drive pada 2 ruang per detik.
Jelas, mobil-mobil tidak dapat saling melewati, jadi untuk n ≥ 20
, adegan akan menjadi dua mobil yang jatuh dengan kap di posisi di mana kecelakaan itu terjadi.
Sebagai seorang pecinta film, saya ingin menghentikan adegan itu sesekali, hanya untuk menikmati keindahannya.
Diberikan bilangan bulat n
(argumen fungsi atau STDIN), mewakili jumlah detik dari awal adegan, tampilkan adegan pada saat itu.
Ini adalah adegan awal, dengan 60 spasi di antara roda depan:
__ __
_/ \_ _/ \_
o o o o
ini adalah adegan setelah 11 detik:
__ __
_/ \_ _/ \_
o o o o
dan seperti inilah rupanya setelah tabrakan (perhatikan bahwa kap mesin sudah menyala setelah tabrakan):
__ __
_/ \/\/ \_
o oo o
Saya hanya tertarik menonton dua mobil menabrak, jadi spasi, baris baru, ++ tidak masalah.
Ini adalah kode golf, jadi kode terpendek dalam byte menang. Jawaban yang ditambahkan nanti masih bisa menang jika lebih pendek dari jawaban yang diterima saat ini.
/ \
dan turun_ _
?Jawaban:
CJam,
6866 byteCobalah online
Siapa pun yang melihat awal kode pasti akan
liKe
melakukannya!Penjelasan:
sumber
Labyrinth ,
394386 bytesSaya dengan bangga memperkenalkan ...
... Labyrinth esolang dua dimensi baru saya! Kode di atas tidak golf dengan sangat baik (ada 161 ruang dan 25 NOP, jadi tata letak yang lebih baik dapat mempersingkat ini banyak), tapi setidaknya saya berhasil menunjukkan bahwa bahasa tersebut dapat digunakan untuk tugas-tugas non-sepele. :)
Bagaimana itu bekerja
Pertama, ikhtisar singkat bahasa:
"
adalah NOP yang bukan dinding dan dapat membantu untuk mengisi jalur tertentu dalam kode. Berbeda dengan banyak bahasa 2D lainnya, ujung-ujungnya tidak membungkus.@
mengakhiri program.>v<^
yang akan menggeser baris atau kolom kode sumber secara siklus dengan satu sel. Baris atau kolom mana yang terpengaruh tergantung pada bagian atas tumpukan. Jika baris atau kolom IP sendiri bergeser, ia akan bergerak dengan bergeser. Ini memungkinkan untuk melompat dari satu tepi kode sumber ke yang lain.Sekarang untuk tantangan khusus ini, berikut adalah ide umum dari algoritma:
/ \_o oo o
) ke tumpukan tambahan.__
atau/\
berikutnya.__ __ _/ \
dan dua ruang utama) ke tumpukan tambahan.20
, sebut saja N ini .Akhirnya, mari kita lihat beberapa bagian kode. IP dimulai di sudut kiri atas, pada perintah grid shifting. Bagian atas tumpukan utama adalah
0
(yang digunakan sebagai indeks relatif), sehingga baris pertama digeser ke kiri, yang juga memindahkan IP ke ujung kanan grid. Sekarang baris pertama dijalankan dari kanan ke kiri, yang mendorong set karakter tetap pertama ke tumpukan tambahan:Pergeseran baris ini berguna untuk bermain golf saat Anda ingin memulai dengan sejumlah besar kode linier.
Selanjutnya kita membaca input dan mendorong kap yang benar:
Bit di sebelah kiri dengan tiga NOP mengirimkan hasil negatif di sepanjang cabang atas dan hasil non-negatif di sepanjang cabang bawah. Di sebelah kanan mereka disatukan kembali.
Sekarang ikuti bagian linier besar lainnya (yang mungkin bisa banyak bermain golf dengan trik pengalihan baris lainnya):
Ini mendorong sisa mobil ke tumpukan tambahan.
Selanjutnya, kami menghitung
min(20, input)
, yang mirip dengan cabang pertama:Akhirnya, kita memiliki loop yang berjalan tiga kali untuk mencetak garis. Setiap iterasi dari loop berisi dua loop kecil (3x3) untuk mencetak spasi, serta dua bagian untuk mencetak 6 karakter dari stack tambahan:
Satu trik bagus yang ingin saya perhatikan adalah
.{.{.
pada ujung kanan. Ini adalah jalan buntu, jadi selain dari.
pada akhirnya kode dieksekusi dua kali, sekali maju dan sekali mundur. Ini memberikan cara yang rapi untuk memperpendek kode palindrom (tangkapannya adalah Anda perlu memastikan IP mengambil belokan yang benar ketika keluar dari jalan buntu lagi).sumber
Python 2.7,
167164159 BytesIni mengambil input dari stdin.
Demo di sini
Menguji ini -
sumber
(n,20)[n>20]
sederhanamin(n,20)
.(' \_',' \/')[s<1]
dengan' \\\\_/'[s<1::2]
.l
perlu? Bisakah Anda lakukanfor e in [' _',"_/ ","o "]:
dan hapusl
semuanya?l
tidak perlu sekarang. Saya harus menggunakannya dalam versi sebelumnya. Terima kasih :)R, 191 Bytes
Tentang sebaik yang saya bisa dapatkan sekarang. Mengambil detik dari STDIN dan kucing ke STDOUT.
Penjelasan
Tes
sumber
formals()
. :)CJam, 120 byte
Demo
Tidak Disatukan:
Demo
sumber
J
memiliki nilai 19,K
memiliki nilai 20, menyimpan karakter masing-masing untuk konstanta tersebut. Jika Anda membutuhkan array dengan satu elemen, Anda bisa menggunakana
operator untuk membungkus elemen, daripada menggunakan sepasang tanda kurung.PHP,
160155 byteKode ditampilkan di sini pada 3 baris agar sesuai dengan tata letak kotak kode. Baris baru itu tidak diperlukan.
Kode yang tidak dipisahkan:
Ia mendapatkan jumlah detik dari baris perintah (argumen pertama):
Opsi PHP CLI
-d error_reporting=0
diperlukan untuk menyembunyikan beberapa pemberitahuan yang ditampilkan oleh PHP tentang konstanta yang tidak terdefinisi (str_repeat
,_
) yang dikonversi menjadi string (2 byte disimpan untuk setiap pemberitahuan).Satu byte tambahan dapat disimpan di PHP 7 dengan menekan inisialisasi
$f
penggunaan pertama ($m=($f=str_repeat)(...)
); itu tidak dikompilasi di PHP 5.Kasing uji dan beberapa teknik yang digunakan untuk mengecilkan kode dapat ditemukan di github .
Memperbarui:
@ ismail-miguel memeras inisialisasi
$left
dan$c
dimasukkan ke dalam argumenecho
penghematan 4 byte (lihat komentar di bawah).Dengan menukar urutan variabel
$m
dans
diinisialisasi saya menyingkirkan sepasang tanda kurung dan menyimpan 1 byte lebih.sumber
$f=str_repeat;$m=$f(' ',$r=60-3*($s=min(max($argv[1],0),20)));echo$l=$f(' ',$s)," __ $m __\n{$l}_/ \\",$r?_.$m._:'/\\',"/ \\_\n{$l}o o{$m}o o\n";
$f=str_repeat;echo$l=$f(' ',$s=min(max($argv[1],0),20))," __ ",$m=$f(' ',$r=60-3*$s)," __\n{$l}_/ \\",$r?_.$m._:'/\\',"/ \\_\n{$l}o o{$m}o o\n";
o o
ke dalam variabel tetapi memiliki panjang yang sama atau lebih buruk.\n
dengan baris baru nyata. Saya lupa tentang itu. Dan itu dihitung sebagai masingJavaScript (ES6), 121 byte
Menggunakan string template, 2 baris baru di dalam string signifikan dan dihitung.
Untuk menyimpan byte, hasilkan dengan
alert
, bahkan jika font proporsional yang digunakan dalamalert
tidak cocok untuk seni ASCII dan hasilnya jelek untuk n> = 20 (crash).Tes menjalankan cuplikan di FireFox
sumber
Python 2, 148 byte
Ini menggunakan kode pelarian ANSI untuk menempatkan kursor di tempat yang tepat untuk menggambar mobil. Kemudian memeriksa untuk melihat apakah inputnya 20, jika itu, kembali dan menarik pada kap mobil.
Mengambil int dari stdin, output ke stdout.
Tidak Disatukan:
sumber
Pyth, 67 byte
Cobalah di sini .
sumber
C,
180191168 byteungolfed:
program uji:
keluaran:
Saya bisa bermain golf ini dengan cukup keras. Saya pikir saya mulai dengan hampir 300 byte.
Tapi saya tidak tahu apakah ini masih memenuhi semua persyaratan. Seperti yang dapat Anda lihat setelah 21 detik, mobil pertama mendorong mobil kedua ke kanan. Saya perlu menambahkan beberapa byte jika ini tidak diizinkan.Edit: perbaiki. Ini harus lebih realistis daripada Sharknado ;-)
Sunting: Saya dapat secara signifikan mempersingkat solusi saya dengan melihat kedua halaman
printf
manual. Jika Anda menggunakan '*' Anda dapat memberikan panjang bidang langsung ke printf, tanpa perlu membuat format-stringsprintf
sebelumnya.sumber
> <> ,
538276 byteSaya sudah menjatuhkan ukurannya BANYAK, saya kagum bahwa saya berhasil menurunkan ukurannya menjadi setengahnya. Yang lama ada di bawah. Yang satu ini tidak seefisien kinerja bijaksana karena lebar grid, kebanyakan dari baris pertama.
Anda dapat mengujinya di sini . Masukkan jumlah waktu yang berlalu di "Initial Stack", bukan "Input"!
Ini versi lama.
sumber
Jawa, 258 Karakter
Tidak Golf
Hasil
sumber
Python 2, 102 byte
Cukup mudah. Untuk setiap baris mobil, kami mencetak
n
spasi, baris itu,60-3*n
spasi, dan baris lagi. Untuk menghentikan mobil, daripada melakukanmin(n,20)
, itu adalah salah satu karakter yang lebih pendek untuk membatasi ruang pertama dengan[:20]
, dan yang kedua baik-baik saja karena kali negatif string adalah string kosong.Untuk naik fender, kami hanya melakukan a
replace
. Karena__
juga muncul di atap, kita perlu sedikit konteks untuk mengidentifikasi fender, jadi kami memeriksa yang/
berikut.sumber
Jawa,
270267 byteCukup yakin ada cara yang lebih baik / lebih pendek untuk melakukan ini, tetapi otak saya tidak terlibat dengan benar.
Untuk n = 19:
Untuk n = 20:
Tidak disatukan
sumber
PHP 7, 140 byte
Pemakaian:
Simpan sebagai ANSI di
file.php
(harus ada karakter dengan lebar nol$o
) dan jalankan:dengan
x
sebagai jumlah detik.Dan versi yang berfungsi tanpa mengubah pelaporan kesalahan ( 148 byte ):
sumber
Javascript, 193 byte
Itu bukan pemenang, tapi itu sesuatu
http://jsfiddle.net/yb703y0p/2/
sumber