Diberikan masukan dari daftar kata-kata, output kata-kata dengan surat-surat mereka diatur secara diagonal:
p
r
o
p g
u r
z a
a z m
n l m
d e i
c s n
o g
d
g e
o
l
f
(Di atas harus menjadi output untuk input programming puzzles and code golf
.)
Tepatnya, setiap kata dimulai pada kolom pertama dan tiga baris di bawah kata sebelumnya, dan setiap huruf berturut-turut memindahkan satu kolom ke kanan dan satu baris ke bawah.
Input dapat diberikan sebagai string kata tunggal, dipisahkan dengan tepat satu spasi, atau daftar / array kata. Kata-kata hanya akan terdiri dari huruf kecil a-z
,, dan akan selalu setidaknya satu karakter.
Outputnya bisa berupa string tunggal, array baris, atau array array karakter. Memimpin atau mengikuti spasi tidak diizinkan, kecuali untuk satu baris baru.
Kasus uji lebih lanjut:
a bcd efgh i j
a
b
c
d
e
f
g
i h
j
x
x
verylongword short
v
e
r
s y
h l
o o
r n
t g
w
o
r
d
Karena ini adalah kode-golf , kode terpendek dalam byte akan menang!
Jawaban:
Vim,
85, 76, 66, 52 penekanan tombol / byteKetika saya pertama kali melihat tantangan ini, saya berpikir, "Ini sempurna untuk vim!" Dan ketika saya mencobanya semuanya menjadi salah. Ini dia, dalam semua itu kemuliaan berantakan berantakan:
Cobalah online, berkat penerjemah V yang kompatibel (sebagian besar).
Penjelasan:
Pada awalnya saya pikir saya bisa melakukan versi 37 byte yang sangat sederhana ini:
Sayangnya, itu tidak sesederhana itu. Mari kita bawa baris demi baris:
Ini memungkinkan fitur yang disebut 'pengeditan virtual'. Ini memungkinkan kursor untuk pindah ke kolom yang belum ada. Jawaban ini pada dasarnya tidak mungkin tanpanya.
Sekarang kita perlu memisahkan kata-kata ke baris yang berbeda. Jadi kami akan mengganti setiap ruang dengan 3 baris baru. Karena ini adalah perintah ex, kita dapat menjalankannya secara bersamaan dengan perintah ex terakhir kita
:se ve=all
dengan memisahkan keduanya dengan sebuah bar.Sekarang buffer terlihat seperti ini:
Di sinilah kesenangan dimulai. Kami menyiapkan makro rekursif tradisional dengan:,
qq
dan kemudian menyebutnya:Lalu kami menyelesaikan makro rekursif dengan
@qq@q
. Pada titik ini, kita memiliki semua diagonal, kita hanya perlu melakukan sedikit pembersihan.sumber
Turtlèd ,
2826 byteYa ampun, saya tampaknya mengalahkan bahasa yang dirancang khusus untuk bermain golf. ini hari yang menyenangkan.
Cobalah online!
Penjelasan
(tulis berarti menulis ke sel di grid, char menunjuk berarti char di input pointer menunjuk ke)
perhatikan spasi tambahan.
Input juga membutuhkan ruang tambahan. mengingat python dapat mengambil daftar, ini sangat mirip dengan mengambil daftar di Turtlèd
sumber
MATL , 28 byte
Input adalah array sel string, dengan koma sebagai pemisah opsional:
atau
Cobalah online! Atau verifikasi semua kasus uji: 1 , 2 , 3 , 4 .
Penjelasan
Pertimbangkan input berikut sebagai contoh:
Anda dapat melihat hasil sebagian (menumpuk konten) menyisipkan simbol komentar
%
di setiap titik dalam kode. Misalnya, melihat konten tumpukan setelah fungsi keempat (&n
).sumber
JavaScript (ES6),
11810984 byteMengambil input sebagai array kata. Mengembalikan array array karakter.
Versi alternatif, 109 byte
Mengembalikan string.
Tampilkan cuplikan kode
sumber
Common Lisp,
673668597 byteSolusi yang mengerikan, saya tahu. Saya mungkin akan mengedit ini lagi setelah tidur.
Pemakaian:
Ini memotong setiap kata dalam daftar yang disediakan dan menambahkan karakter yang sesuai ke baris saat ini. Padding yang sesuai disediakan oleh saya di bawah penggunaan
format
.Catatan: Saya baru mengenal Common Lisp, tetapi saya cukup tahu untuk menyadari bahwa ini dapat menggunakan banyak peningkatan.
sumber
C #, 336 Bytes:
Golf:
Tidak Disatukan:
Pengujian:
sumber
Func<string[], string>
dan buat berbagai perubahan lain untuk 297 bytes=>{int i=0,x=0,y=0,r=0,l=s.Length,q=2*(s.Max().Length+l)+1,j;var a=new char[q,q];for(;i<l;i++){y=r;for(j=0;j<s[i].Length;)a[y++,x++]=s[i][j++];x=0;r+=3;}var o="";for(;x<q;x++){var t="";for(y=0;y<q;)t+=a[x,y++];o+=t==string.Join("",Enumerable.Repeat('\0',q))?"":(t.TrimEnd('\0')+"\n");}return o;};
namun Anda perlu menambahkan 18 byte untukusing System.Linq;
i
danj
ke deklarasi int di atas dan memindahkan beberapa++
sehingga mereka digunakan pada penggunaan terakhir variabelPython 2, 146 byte
Catatan: lekukan untuk dua baris terakhir adalah
<space>
dan<tab>
, yang menyimpan satu byte karena saya tidak perlu menggandakan indentasi.Input harus dimasukkan sebagai array string seperti:
["hello", "world"]
atau['hello', 'world']
. Output adalah array array karakter.Mungkin ada cara yang lebih baik untuk melakukan ini ...
EDIT Terima kasih kepada Doorknob karena menunjukkan braket kotak yang hilang. Saya menempatkannya
*k...
di baris ketiga.sumber
Mathematica, 146 byte
Saya kecewa dengan bytecount ini, tapi oh well.
Menentukan fungsi anonim yang mengambil daftar kata (misalnya
{"this","that","these"}
) dan mengembalikan array karakter dua dimensi. Untuk melihat dalam bentuk kisi, tambahkan a//Grid
di bagian akhir.Mengonversi string ke array, menambahkan garis ekstra, mentransposisi array, menambahkan perubahan yang diperlukan, lalu mentranspos lagi.
Contoh hasil (diformat sebagai kisi):
sumber
Jelly , 24 byte
Cobalah online!
Bagaimana?
sumber
Python 2, 182 byte
Agak panjang, tetapi di sisi positif, ia mengembalikan string tanpa spasi putih di setiap baris, dan tidak ada spasi putih atau kembali di akhir; kendala yang tidak dipatuhi beberapa entri lainnya.
Daftar kata-kata diteruskan ke fungsi; beberapa 'kosong' ditambahkan ke daftar ini dan kemudian algoritma memetakan baris, pasangan kolom ke wordNumber, characterNumber dalam daftar yang diperluas. (Ini adalah sedikit kebalikan dari strategi yang biasa terlihat dalam solusi lain).
Jika kita membolehkan mengekor ruang putih di semua baris kecuali yang terakhir, kita dapat melakukan sedikit lebih baik (163 byte):
sumber
q / kdb +,
13010994908684 byteLarutan:
Contoh:
Penjelasan (ungolfed):
Inti dasarnya adalah membuat sekelompok string dengan panjang yang sama dari string input, membalik (rotate) mereka, kemudian menambahkan spasi yang sesuai untuk mendapatkan sesuatu yang terlihat seperti ini:
yang dibalik lagi, dan dicetak ke stdout.
Berikut ini adalah rincian konsep ini:
Catatan:
Beberapa cara untuk mengurangi beberapa (11) byte mudah jika kita benar - benar ingin:
f:
dan membiarkannya sebagai fungsi anonim-1
dan;
dan kembali daftar string daripada mencetak ke stdoutSuntingan:
rtrim
untuk mencari panjang max ke pad, kebutuhan dihapus untuk menyimpanC
variabelmax count each
mematikan fungsi lambdaa
yang dibuat sekali dan digunakan dua kaliraze
ke fungsi lambda untuk menyimpan araze each
(+)
sebagai singkatan untukflip
sumber
Arang ,
169 byteJawaban pertama saya tentang Arang. Terima kasih kepada @DLosc untuk saran
P
danM
alih-alih menggunakanS
danJ
(Langsung) untuk kembali ke awal baris (dan tiga ke bawah).Cobalah online (verbose) atau Coba online (murni) .
Penjelasan:
Loop sementara masih ada input-string berikutnya:
Cetak string ini tanpa menggerakkan kursor ke arah kanan bawah:
Dan kemudian pindahkan tiga posisi ke bawah untuk iterasi berikutnya:
sumber
θ
variabel tersebut mewakili input pertama, jadi saya hanya menetapkan input tes ke variabel itu di header dan kemudian menulis sisa kode, sehingga Anda dapat menyingkirkanα
variabel dan beralih ke item yang dipisahkanθ
. Cobalah online! (Non-bersaing karena ruang terdepan.)Japt
-Rx
,171613 byteMengambil input sebagai array kata. Jika membuntuti spasi putih pada setiap baris diizinkan maka 4 karakter terakhir dapat dihapus untuk mengikat dengan solusi Charcoal.
Cobalah atau jalankan semua test case
Penjelasan
sumber
K4 , 58 byte
Larutan:
Contoh:
Penjelasan:
String pad kanan sehingga panjangnya sama, transpos, gabung dengan
" "
, pad kiri untuk menghasilkan diagonal, lalu pad kanan untuk mengoreksi panjang dan transpos kembali. Mengambil daftar string dan mengembalikan daftar string. Mungkin golf tetapi masih lebih pendek dari solusi q / kdb + saya.sumber
Perl 6 , 73 byte
Cobalah online!
Argumen input adalah daftar kata-kata. Outputnya adalah array dari array karakter.
sumber
PHP , 100 byte
Cobalah online!
sumber