Terima kasih kepada @KritixiLithos karena membantu saya mengatasi tantangan ini!
V adalah bahasa pemrograman yang saya tulis sehingga saya bisa menggunakan dan memperluas vim untuk tantangan kode-golf. Komitmen pertama adalah pada 3 Maret 2016, artinya hari ini V berumur satu tahun! Woo hoo
Selama tahun pertama keberadaan V, ada 176 komitmen dari empat kontributor berbeda, 140 jawaban dari 12 pengguna yang berbeda , dan terlalu banyak operator duplikat yang rusak untuk dihitung . Ini memiliki juru bahasa online , yang disediakan oleh @ Dennis, yang telah dijalankan hampir 8.000 kali sejak Desember .
Mari kita tantangan untuk merayakan ulang tahun V! Karena sebagian besar fitur dalam V dirancang dengan manipulasi string dan ascii-art dalam pikiran, sepertinya wajar bahwa setiap tantangan merayakan V harus tentang seni ascii. Jadi tantangan Anda untuk hari ini adalah mengambil kata sebagai input, dan membentuk kembali kata itu dalam bentuk huruf V. Misalnya, input "Halo" harus memberikan V berikut:
Hello olleH
Hello olleH
Hello olleH
Hello olleH
Hello olleH
HellolleH
HellleH
HeleH
HeH
H
Berikut adalah beberapa detail tentang seperti apa penampilan V Anda. Jika string input panjangnya n karakter, maka V harus berupa n*2
garis yang tinggi. Baris pertama harus terdiri dari:
<input string><(n*2) - 1 spaces><input string reversed>
Pada setiap baris baru, satu spasi ditambahkan ke awal, dan kedua sisi string bergerak ke satu sama lain, menghilangkan karakter yang tumpang tindih. Sampai baris terakhir, yang hanya merupakan karakter input pertama. Trailing whitespace pada setiap baris dapat diterima, dan trailing newline juga diperbolehkan.
Anda dapat mengasumsikan bahwa input akan selalu dapat dicetak ASCII tanpa spasi di dalamnya, dan Anda dapat mengambil input dan output dengan metode yang masuk akal. Berikut ini beberapa contoh input:
Happy:
Happy yppaH
Happy yppaH
Happy yppaH
Happy yppaH
Happy yppaH
HappyppaH
HapppaH
HapaH
HaH
H
Birthday:
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
BirthdayadhtriB
BirthdadhtriB
BirthdhtriB
BirthtriB
BirtriB
BiriB
BiB
B
V!:
V! !V
V! !V
V!V
V
~:
~ ~
~
Tentu saja, karena ini adalah kode-golf , celah standar dilarang dan tujuan Anda adalah menulis program sesingkat mungkin untuk menyelesaikan tugas ini. Selamat bermain golf!
Untuk apa nilainya, saya memiliki titik lemah untuk jawaban vim, jadi poin bonus imajiner untuk menggunakan vim atau V, meskipun bahasa apa pun dapat diterima. :)
Jawaban:
MATL ,
2114 byteMATL mengucapkan selamat ulang tahun V!
Cobalah online!
Penjelasan
Pertimbangkan inputnya
panjangnya
n=5
. Kode menghitung konvolusi 2D dari string ini dengan matriks ukuran identitas2*n
,Hasil konvolusi, dikonversi menjadi char dan dengan char 0 ditampilkan sebagai spasi, adalah
Kemudian kolom
[1, 2, ..., 2*n-1, 2*n, 2*n-1, ..., 2, 1]
dipilih dari matriks char ini, menghasilkan hasil yang diinginkan:Kode yang dikomentari
sumber
V ,
24, 23, 20 byteCobalah online!
Jauh lebih pendek sekarang bahwa V memiliki operator 'mundur' .
Tidak terlalu mengesankan dibandingkan dengan bahasa golf lainnya yang telah menjawab, tetapi itu harus dilakukan. Hexdump:
Penjelasan:
Pada titik ini, buffer terlihat seperti ini:
Tidak, kami akan membangun segitiga secara rekursif.
Di sinilah saya bisa memamerkan salah satu fitur favorit saya dari V. Banyak perintah memerlukan argumen. Sebagai contoh,
>
perintah akan membuat indentasi sejumlah variabel baris tergantung pada argumen:tetapi sebagian besar perintah akan dipaksa untuk diakhiri dengan argumen default (biasanya baris saat ini) jika berada di akhir program dan tidak ditentukan. Sebagai contoh, apa yang sebenarnya dijalankan oleh V untuk loop rekursif kami adalah:
Yang kedua
ò
secara implisit diisi. Yang keren adalah bahwa perintah yang berakhir secara implisit menerapkan beberapa lapisan dalam, jadi meskipun kita hanya menulis>
, V secara implisit akan memberikan_
argumennya, dan itu akan membuat indentasi baris saat ini.sumber
Brainfuck , 152 byte
Ini adalah kesempatan yang sangat penting, saya memutuskan untuk memecahkan penerjemah BF ol dan memberikan ini putaran.
Dengan Komentar
Cobalah online!
sumber
> <> , 221 byte
Aku menghabiskan cara terlalu banyak waktu untuk hal ini. Selamat ulang tahun, V!
Anda dapat mencobanya secara online , tetapi jauh lebih menyenangkan untuk mendapatkan juru bahasa ini dan menjalankannya menggunakan
--play
benderayang menghasilkan animasi di bawah ini.
Contoh
(Dibutuhkan sedikit di bawah dua menit)
Penjelasan
Karena bagian yang menarik dari jawaban ini adalah membungkusnya dalam
V
bentuk, di sini ada penjelasan yang sesuai dengannya. Kami menggunakan versi nomor baris berikut untuk referensi.Terkadang panah (→ ↓ ←) digunakan untuk menunjukkan arah pencapaian potongan.
Inisialisasi
Baris pertama akan mendorong 2n ke [0,1], meninggalkan n pada tumpukan dan menambahkan satu spasi. Selanjutnya, kita naik dan membungkus ke baris kedua di sebelah kanan, di mana kita akan mulai ke kiri. Ada loop untuk menambahkan n + 1 spasi. Ini berfungsi sebagai berikut.
Setelah ini selesai, ia memantul ke baris 3. Di sana dua elemen tumpukan teratas (0 dan spasi) dihapus (
~~
) dan kami melompat keX
lokasi [10,1] (a1.
), terus ke kanan. Kami bertemu di/
, membungkus ke baris 7 dan memulai loop program utama.Loop utama ( 2n kali dilakukan)
Ini adalah kondisi loop. Pada awalnya, tumpukan dibalik untuk dicetak. Kemudian kita mendapatkan penghitung dari [1,0] (
01g
) dan menyimpan versi yang dikurangi (:1-01p
). Dengan membungkus dan menabrak ke kanan, kita menemukan persyaratan untuk mengakhiri program. Jika kita tidak berhenti, kita langsung ke lingkaran pencetakan pertama.Lingkaran pencetakan pertama (setengah kiri)
Kita mulai dengan panjang di atas tumpukan dan menjalankan kode berikut selama elemen atas bukan 0.
Ini akan mencetak tumpukan tanpa membuangnya. Jika loop berakhir, kita melompat ke kanan pada baris 5, mempersiapkan loop pencetakan berikutnya.
Persiapan setengah tepat
Ini adalah salah satu bagian tersulit yang pas. Di bawah ini adalah versi yang dilucuti dari semua pembungkus arah untuk menunjukkan apa yang terjadi.
Kami kemudian mendorong panjang dari apa yang akan dicetak dan memulai loop pencetakan kedua (dengan duplikat awal bukan bagian dari loop).
Lingkaran pencetakan kedua (setengah kanan)
Kode yang dieksekusi sepenuhnya sama dengan di loop pencetakan pertama, dengan
o}
ditempatkan sedikit lebih jauh karena ada lokasi yang tersedia. Setelah selesai, kami memiliki beberapa hal yang harus dilakukan sebelum kami dapat memverifikasi invarian loop utama lagi. Setelah~
jalur 9 dijalankan, kita membungkus secara vertikal, berakhir di bagian kode berikut.Pertama
ao
akan mencetak baris baru. Kemudian kami bangkit dan tiba di tempat yang sama persis setelah inisialisasi, yaitu melompat keX
.sumber
Brain-Flak , 486 + 1 = 489 byte
Selamat Ulang Tahun V dari Brain-Flak!
Juga Terima kasih kepada 0 ' yang menyediakan beberapa kode yang digunakan dalam jawaban ini
+1 karena
-c
bendera yang diperlukan untuk masuk dan keluar ASCIICobalah online!
Ini tanpa diragukan lagi adalah hal tersulit yang pernah saya lakukan di Brain-Flak.
Brain-Flak terkenal mengerikan dalam menduplikasi dan membalikkan string dan tantangan ini tidak lain adalah menduplikasi dan membalikkan string.
Saya berhasil mendapatkan potongan ini hampir bekerja hanya dalam waktu kurang dari satu jam kerja keras, tetapi menambahkan dalam beberapa ruang terakhir ternyata menjadi salah satu hal paling sulit yang pernah saya lakukan di Brain-Flak.
Penjelasan
Ide dasarnya adalah bahwa kita akan membuat bagian atas V terlebih dahulu dan setiap iterasi menghapus dua karakter dari tengah dan menambahkan spasi ke awal.
Dalam praktiknya ini menjadi sangat sulit.
Algoritma yang ada ada untuk menyalin dan membalikkan jadi saya menggunakan salah satu dari mereka untuk membuat salinan kode terbalik pada offstack. Setelah saya selesai melakukan itu, saya meletakkan
2n-1
spasi di atas tumpukan asli dan memindahkan backstack kembali ke onstack untuk membuat sandwich.Sekarang kita memiliki baris teratas. Sekarang kami ingin menghapus dua karakter dari awal dan menambahkan spasi ke depan. Ini ternyata menjadi bagian yang paling sulit. Alasan untuk ini adalah bahwa kita perlu menyimpan dua nilai dasarnya, satu untuk kedalaman potongan saat ini dan satu untuk kedalaman ke pusat V di mana penghapusan harus terjadi.
Ini sulit.
Karena semua duplikasi dan pembalikan yang terjadi pada kedua tumpukan digunakan penuh sepanjang waktu. Benar-benar tidak ada tempat di tumpukan ini untuk menaruh apa pun. Bahkan dengan semua Magic Stack Ketiga di dunia Anda tidak bisa mendapatkan jenis akses yang Anda butuhkan untuk menyelesaikan masalah ini.
Jadi bagaimana cara memperbaikinya? Singkatnya, kita tidak benar-benar; kita mengabaikan spasi untuk saat ini dan menambalnya nanti kita akan menambahkan nol pada kode untuk menandai ke mana ruang-ruang yang dimaksudkan untuk pergi tetapi selain itu kita tidak akan benar-benar melakukan apa pun.
Jadi pada setiap iterasi, kami membuat salinan iterasi terakhir dan meletakkannya di offstack. Kami menggunakan kedalaman yang kami simpan untuk membaginya menjadi dua sehingga kami memiliki bagian kiri dari V di tumpukan kanan dan setengah kanan dari V di tumpukan kiri. Kami menghapus dua elemen dan menambal keduanya kembali bersama. Kami menambahkan baris baru untuk ukuran yang baik dan memulai iterasi berikutnya. Setiap kali kedalaman ke pusat V berkurang satu dan ketika mencapai nol kita menghentikan loop.
Sekarang kita memiliki sebagian besar V yang dibangun. Namun kami kekurangan ruang yang tepat dan V kami saat ini sedikit (baca: sepenuhnya) terbalik.
Jadi kami balikkan. Untuk membalikkannya ke tumpukan lain kita harus memindahkan setiap elemen satu per satu. Saat kita bergerak elemen kita memeriksa nol. Jika kita menemukan satu, kita harus meletakkan ruang kembali di tempatnya. Kami membuang nol dan menambahkan banyak spasi. Bagaimana kita tahu berapa banyak? Kami melacak; membalik tumpukan tidak seperti menggandakan atau membalikkan adalah tugas yang sangat tidak intensif sehingga kita benar-benar memiliki memori untuk menyimpan dan mengakses penghitung tambahan untuk melacak berapa banyak ruang yang akan ditambahkan. Setiap kali kita menambahkan beberapa spasi, kita mengurangi penghitung dengan satu. Penghitung harus mencapai nol pada baris baru terakhir (bagian atas V) dan dengan demikian kami siap mencetak.
Terakhir kami membersihkan beberapa hal yang berkeliaran dan mengakhiri program untuk output implisit.
sumber
-r
benderanya?-r
benderanya, saya perlu membalikkannya di lain waktu. Sudah terlambat di mana saya berada tetapi saya pikir saya akan berusaha mencoba golf ini turun secara substansial besok. Jika saya dapat memperbaiki masalah spasi saya pasti akan menggunakan-r
bendera.Jelly ,
1512 byteCobalah online!
Bagaimana itu bekerja
sumber
Python 3 , 65 byte
Cobalah online!
Python 2 , 65 byte
Cobalah online!
sumber
JavaScript (ES6),
1081069894 bytesumber
n*2
dengan ukurann*4
(termasuk baris baru di akhir setiap baris). Saya kemudian menghitung karakter yang akan muncul di setiap sel.f=
dans=>
.f=
hanya bagian dari cuplikan, bukan jawabannya. Karena itu, ini tidak termasuk dalam jumlah byte.Retina ,
5147 byteSelamat ulang tahun dari bahasa pemrosesan string sesama!
Hitungan byte mengasumsikan penyandian ISO 8859-1.
Cobalah online!
Penjelasan
Ini menambahkan
n
spasi (di manan
panjang string), dengan mencocokkan ujung string, mengambil panjang string dengan$.`
, dan mengulangi spasi yang berulang kali$*
.Kami menduplikasi seluruh string (dipisahkan oleh umpan baris), dengan mencocokkan ujung string lagi dan memasukkan string itu sendiri
$`
.Ini membalikkan baris kedua dengan mencocokkan dari kanan ke kiri (
r
), lalu mencocokkan satu karakter pada satu waktu (.
) tetapi memastikan bahwa mereka semua berdekatan (\G
). Dengan cara ini, pertandingan tidak dapat melewati linefeed. Ini kemudian digunakan dalam sort-stage. Dengan menggunakan mode urut ($
) tetapi mengganti setiap kecocokan dengan string kosong, tidak ada penyortiran yang sebenarnya dilakukan. Tetapi karena^
opsi, pertandingan dibalik di akhir, membalikkan seluruh baris kedua.Tahap ini untuk output dan juga mempengaruhi sisa program.
{
membungkus tahap-tahap yang tersisa dalam satu lingkaran yang diulang sampai tahap-tahap itu gagal untuk mengubah string (yang akan terjadi karena tahap terakhir tidak akan cocok lagi). The;
menonaktifkan output pada akhir program. The*
bergantian tahap ini menjadi kering-run yang berarti bahwa panggung diproses dan hasilnya dicetak, tapi setelah string sebelumnya dipulihkan.Panggung itu sendiri hanya menghapus linefeed dan karakter sebelumnya. Yang memberi kita satu baris dari output yang diinginkan (dimulai dengan baris pertama).
Akhirnya, tahap ini mengubah setiap baris menjadi yang berikutnya. Ini dilakukan dengan memasukkan spasi di depan karakter non-spasi pertama, menghapus karakter terakhir di baris pertama, serta karakter pertama di baris kedua. Proses ini berhenti setelah hanya ada satu karakter non-spasi yang tersisa di baris pertama, yang sesuai dengan baris terakhir dari output.
sumber
s///
karakter tambahan yang ditambahkan, pembalikan string yang lebih panjang dan operasi lain yang tidak memiliki kualitas yang baik dari Retina. Baca bagus. +105AB1E , 12 byte
Cobalah online!
Penjelasan
Atau untuk jumlah byte yang sama dari arah lain.
Penjelasan
sumber
Japt,
22201614 + 2 byteJapt berharap V bertahun-tahun lebih sukses bermain golf!
Membutuhkan
-R
bendera. Uji secara online!Penjelasan
Ini memanfaatkan
ç
danî
fungsi yang saya tambahkan beberapa hari yang lalu:Teknik Dennis adalah satu byte lebih panjang:
sumber
GNU sed ,
110100 +1 (r flag) = 101 byteSunting: 9 byte lebih pendek berkat Riley
Sebagai bahasa manipulasi string lain, sed mengucapkan V yang terbaik!
Cobalah online!
Penjelasan: mengasumsikan input adalah test case terakhir ('V!'). Saya akan menunjukkan ruang pola pada setiap langkah untuk kejelasan, mengganti spasi dengan 'S.
sumber
Python, 110 byte
Cobalah online!
Saya yakin ini tidak optimal, tetapi setidaknya cukup Pythonic:
sumber
Jolf, 31 byte
Jolf dengan bangga mengucapkan selamat ulang tahun kepada V!
Coba di sini!
␅
harus 0x05.Penjelasan
sumber
Arang , 29 byte
Selamat ulang tahun V, dari bahasa ASCII-art sesama seni Anda yang mengecewakan-lama-untuk-ini!
Cobalah online!
Penjelasan
Strategi kami: cetak setengah kiri dari V, mulai dari bawah dan pindah ke kiri atas; lalu mencerminkannya.
(Kalau saja Charcoal memiliki slicing string ... sayangnya, tampaknya belum diimplementasikan.)
sumber
CycleChop
, yang dapat digunakan untuk mengekstrak kepala string, sehingga menghemat 4 byte. Namun, ada pendekatan yang lebih baik yang menghemat 9 byte. Beberapa lebih banyak penghematan yang saya pikir juga bekerja pada saat itu:Reflect
default ke kanan mencerminkan, menyimpan byte lebih lanjut, dan salah satu variabel sudah ditentukan untuk input pertama, menghemat dua byte.Pip ,
3225 byteMengambil string input sebagai argumen baris perintah. Cobalah online!
Penjelasan
sumber
R dengan paket stringi, 225 Bytes
Jika Anda menjalankan R dalam kode interaktif, setelah menempelkan jawaban saya, masukkan saja apa saja. Anda akan memerlukan paket R stringi untuk diinstal (saya harap ini tidak melanggar aturan).
Penjelasan:
Ide dasarnya adalah menambahkan spasi ke sisi kiri, lalu memotongnya menjadi panjang yang tepat. Setelah itu, rekatkan dengan versi terbalik sebagai sisi kanan. Ini adalah versi fungsi yang lebih panjang dan dapat dibaca manusia:
sumber
Ruby,
928985 byteProses saya adalah menghapus karakter pertama dari bagian kanan setiap baris setelah membalikkan bagian pertama. Seperti ini:
Saya tidak terbiasa mencoba golf, jadi beri tahu saya jika ada yang bisa saya lakukan untuk membuatnya lebih pendek.
sumber
Batch,
186185 byteBaris 1 dan 6 memiliki ruang tambahan. Sunting: Disimpan 1 byte berkat @ ConorO'Brien.
sumber
@set
dan hapus@echo off
, masukkan@
seperlunya.set
s akan menyelamatkan saya cukup byte untuk membuatnya berharga.Haskell , 76 byte
v
adalah fungsi utama, mengambilString
argumen dan memberikanString
hasil.Cobalah online!
Catatan:
i
adalah argumen / input awal.s
awalnyai
denganlength i
spasi ditambahkan.v i
panggilanr s
, kemudian bergabung dengan garis hasil.r
mengembalikan daftarString
garis.t
adalahs
dengan karakter terakhir dipotong.r t
menghasilkan garis-garis kecuali yang pertama, dikurangi ruang awal pada setiap baris.sumber
v
. : Dunlines.r.((++)<*>(' '<$))
.Jelly , 13 byte
Cobalah online!
Bagaimana?
sumber
Ruby,
8583 bytesunting: menghapus kelebihan spasi putih
Sebenarnya saya merasa sangat sulit untuk bermain golf di Ruby. Setelah menambahkan spasi, itu diperluas ke potongan kode yang cukup mudah dibaca:
sumber
s=ARGV[0];(s+=' '*s.size).size.times{|i|puts s+s[i..-2].reverse;s=' '+s[0..-2]}
MATLAB (R2016b),
223183 byteGolf Code pertama kali. Kiatnya diterima!
Output Program:
Sunting:
Disimpan 40 byte berkat Luis Mendo.
sumber
's'
dariinput
. Juga, saya tidak mengerti mengapa Anda menggunakanevalc(disp(...))
, tapi saya pikir Anda bisa menggunakancell2mat
cara iniflip
lebih pendek dariend:-1:1
, lihat di siniPHP,
959285807877 byteCatatan: menggunakan pengkodean IBM-850
Jalankan seperti ini:
Penjelasan
Tweaks
str_pad
default ke spasi, yang kita butuhkan)substr
~"0"
kasus ini (ASCII 207), karena semua input dapat diasumsikan dapat dicetak ascii (Thx @Titus)sumber
echo$s,strrev($s=" $s"^$s^$s),~§;
menghemat 5 byte.~$s[$i++]
sudah cukup (input dapat dicetak ASCII, dan begitu juga$s
)JavaScript (ES6),
169157 byte(-10 byte terima kasih kepada Conor O'Brien)
Solusi rekursif. Saya baru mengenal JavaScript, jadi harap bersikap lembut! Setiap tips bermain golf sangat dihargai. :)
Dan, tentu saja, ulang tahun yang sangat bahagia untuk Anda
V
!Cuplikan Tes
Tampilkan cuplikan kode
sumber
s.split("")
bisa diubah menjadi[...s]
, dana.join("")
bisaa.join
diikuti oleh sepasang backtick. Anda dapat menyimpan 3 byte tambahan dengan mengganti[r='repeat']
dan[r]
dengan pengulangan biasa, sama denganslice
.CJam , 26 byte
Selamat ulang tahun dari teman lama Anda CJam!
Cobalah online!
Penjelasan
sumber
PowerShell,
126 byte,124 byteSebut saja dengan parameter tunggal, seperti
.\V.ps1 Hello
.Sunting: 2 byte disimpan dengan tip dari AdmBorkBork
sumber
$l=($s="$args")|% Le*;
Pyke , 14 byte
Cobalah online!
sumber
JavaScript (ES6), 94 byte
Uji kasus
Tampilkan cuplikan kode
sumber
J, 44 Bytes
sumber
|."0 1
ke|."{
(disimpan 2 byte)