Diberikan daftar setidaknya dua kata (hanya terbuat dari huruf kecil), buat dan tampilkan tangga kata ASCII dengan bergantian arah menulis pertama ke kanan, lalu ke kiri, relatif ke arah awal dari kiri ke kanan .
Ketika Anda selesai menulis kata, ubah arah dan baru mulai menulis kata berikutnya.
Jika bahasa Anda tidak mendukung daftar kata, atau lebih nyaman bagi Anda, Anda dapat mengambil input sebagai serangkaian kata, dipisahkan oleh satu spasi.
Ruang putih terkemuka dan tertinggal diizinkan.
["hello", "world"]
atau "hello world"
hello
w
o
r
l
d
Di sini kita mulai dengan menulis hello
dan ketika kita sampai pada kata berikutnya (atau dalam kasus input sebagai string - spasi ditemukan), kita mengubah arah relatif ke kanan dan terus menulisworld
Kasus uji:
["another", "test", "string"] or "another test string" ->
another
t
e
s
tstring
["programming", "puzzles", "and", "code", "golf"] or "programming puzzles and code golf" ->
programming
p
u
z
z
l
e
sand
c
o
d
egolf
["a", "single", "a"] or "a single a" ->
a
s
i
n
g
l
ea
Kriteria menang
Kode terpendek dalam byte di setiap bahasa menang. Jangan biarkan berkecil hati oleh bahasa golf!
Jawaban:
Arang , 9 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan: Bekerja dengan menggambar teks mundur, transposing kanvas setelah setiap kata. 10 byte untuk input string:
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan: Gambar teks mundur, transpos kanvas untuk spasi.
sumber
C (gcc) ,
947874 byte-4 dari Johan du Toit
Cobalah online!
Mencetak tangga, satu karakter (dari input) sekaligus. Mengambil serangkaian kata yang dipisahkan oleh ruang.
sumber
*s==32
menjadi*s<33
untuk menyimpan byte.05AB1E ,
1916 byte-3 byte terima kasih kepada @Emigna .
Cobalah online.
Penjelasan umum:
Sama seperti @Emigna 's jawaban 05AB1E (pastikan untuk upvote dia btw !!), saya menggunakan builtin kanvas
Λ
.Namun opsi yang saya gunakan berbeda (itulah sebabnya jawaban saya lebih panjang ..):
b
(string untuk mencetak): Saya membiarkan string pertama dalam daftar tidak berubah, dan menambahkan karakter tambahan ke setiap string berikutnya dalam daftar. Misalnya["abc","def","ghi","jklmno"]
akan menjadi["abc","cdef","fghi","ijklmno"]
.a
(ukuran garis): Ini akan sama dengan string ini, jadi[3,4,4,7]
dengan contoh di atas.c
(arah untuk mencetak):,[2,4]
yang akan dipetakan ke[→,↓,→,↓,→,↓,...]
Jadi contoh di atas akan langkah demi langkah melakukan hal berikut:
abc
arah2
/→
.cdef
arah4
/↓
(di mana karakter pertama tumpang tindih dengan karakter terakhir, itulah sebabnya kami harus memodifikasi daftar seperti ini)fghi
arah2
/→
lagi (juga dengan karakter trailing / leading tumpang tindih)ijklmno
arah4
/↓
lagi (juga dengan tumpang tindih)Penjelasan kode:
sumber
€θ¨õšsøJ
.€θ¨õšsøJ
adalahõIvy«¤})
,õUεXì¤U}
danε¯Jθ줈}
(dua yang terakhir membutuhkan--no-lazy
). Sayangnya, semua itu memiliki panjang yang sama. Ini akan jauh lebih mudah jika salah satu variabel""
""
... " Apakah Anda mencariõ
, atau maksud Anda jikaX
/Y
/®
akan""
? Btw, 13 byter yang bagus di komentar jawaban Emigna. Cukup berbeda dari saya dan tbh-nya, dengan arah[→,↙,↓,↗]
yang telah Anda gunakan.õ
bukan variabel. Ya, maksud saya variabel yang menjadi default""
. Saya benar-benar melakukannyaõU
di awal salah satu snippet, jadi jika X (atau variabel lain) default""
, itu sepele akan menghemat dua byte. Terima kasih! Ya, ↙↗ agak baru, tapi aku punya ide untuk menyelingi tulisan yang benar dengan tulisan 2 panjang boneka dari jawaban Emigna.05AB1E ,
1413 byteDisimpan 1 byte berkat Grimy
Cobalah online!
Penjelasan
sumber
€Y¦
bisa jadi2.ý
(bukan itu akan menyimpan byte di sini). Dan ini adalah pertama kalinya saya melihat perilaku baru€
dibandingkan dengan peta biasa yang bermanfaat..ý
digunakan sebelumnya tetapi saya tidak pernah menggunakan diri saya sendiri jadi saya tidak memikirkannya.€
adalah peta reguler untuk saya dan saya sering menggunakannya, yang lain adalah peta "baru";)Kanvas ,
17121110 byteCoba di sini!
Penjelasan:
sumber
JavaScript (ES8),
91 7977 byteMengambil input sebagai array kata.
Cobalah online!
Berkomentar
sumber
p
untuk melacak akhir baris sangat cerdas +1Python 2 , 82 byte
Cobalah online!
sumber
brainfuck , 57 byte
Cobalah online!
Mengambil input sebagai string yang dipisahkan NUL. Perhatikan bahwa ini menggunakan EOF sebagai 0, dan akan berhenti bekerja ketika tangga melebihi 256 spasi.
Penjelasan:
sumber
.
karakter di baris 3 (dari versi komentar)? Saya mencoba bermain dengan input di TIO. Di Mac, saya beralih keyboard ke input teks Unicode dan mencoba membuat batas kata baru dengan mengetikoption+0000
tetapi tidak berhasil. Tahu kenapa tidak?-
bukan.
untuk penjelasan. Untuk menambahkan byte NUL di TIO, saya sarankan menggunakan konsol dan menjalankan perintah seperti$('#input').value = $('#input').value.replace(/\s/g,"\0");
. Saya tidak tahu mengapa jalan Anda tidak berhasilJavaScript, 62 byte
Cobalah online!
Terima kasih Rick Hitchcock , 2 byte disimpan.
JavaScript, 65 byte
Cobalah online!
sumber
t
dengana
, kemudian menghapust=
Aheui (esotope) ,
490458455 byteCobalah online!
Golf sedikit dengan menggunakan karakter lebar penuh (2 byte), bukan Korea (3 byte).
Penjelasan
Aheui adalah esolang yang seperti es. Berikut ini adalah kode dengan warna :? 1 bagian memeriksa apakah karakter saat ini adalah spasi atau tidak.
? 2 bagian memeriksa apakah kata-kata telah ditulis dari kanan ke kiri atau atas ke bawah.
? 3 bagian adalah kondisi break dari loop yang mengetik spasi.
? 4 bagian memeriksa apakah karakter saat ini adalah ujung garis (-1).
Bagian merah adalah inisialisasi tumpukan. Aheui menggunakan tumpukan (dari
Nothing
keㅎ
: 28 tumpukan) untuk menyimpan nilai.Bagian oranye mengambil input (
뱋
) dan memeriksa apakah itu ruang, dengan mengurangi dengan32
(kode ruang ASCII).Bagian hijau menambahkan 1 ke tumpukan yang menyimpan nilai panjang ruang, jika menulis kanan-ke-kiri.
Bagian ungu adalah lingkaran untuk mencetak ruang, jika menulis naik-turun.
Bagian abu-abu memeriksa apakah karakter saat ini
-1
, dengan menambahkan satu ke karakter saat ini.Bagian biru mencetak karakter saat ini, dan mempersiapkan karakter berikutnya.
sumber
Japt
-P
, 15 byteCobalah
sumber
bash, 119 karakter
Ini menggunakan urutan kontrol ANSI untuk memindahkan kursor - di sini saya hanya menggunakan save
\e7
and restore\e8
; tetapi pemulihan harus diawali dengan\n
untuk menggulir output jika sudah di bagian bawah terminal. Untuk beberapa alasan itu tidak berfungsi jika Anda belum melakukannya di bagian bawah terminal. * mengangkat bahu *Karakter saat
$c
ini diisolasi sebagai substring karakter tunggal dari string input$w
, menggunakanfor
indeks loop$i
sebagai indeks ke dalam string.Satu-satunya trik nyata yang saya gunakan di sini adalah
[ -z $c ]
yang akan kembalitrue
, yaitu string kosong, kapan$c
spasi, karena tidak dikutip. Dalam penggunaan bash yang benar, Anda akan mengutip string yang sedang diuji-z
untuk menghindari situasi ini. Ini memungkinkan kita membalik bendera arah$d
antara1
dan0
, yang kemudian digunakan sebagai indeks ke dalam susunan urutan kontrol ANSI,X
pada nilai non-spasi berikutnya$c
.Saya akan tertarik melihat sesuatu yang menggunakan
printf "%${x}s" $c
.Astaga, mari kita tambahkan spasi. Saya tidak bisa melihat keberadaan saya ...
sumber
Perl 6 , 65 byte
Cobalah online!
Blok kode anonim yang mengambil daftar kata dan mencetak langsung ke STDOUT.
Penjelasan
sumber
Arang , 19 byte
Masukan sebagai daftar string
Cobalah secara online (verbose) atau coba online (murni)
Penjelasan:
Lingkaran dalam rentang
[0, input-length)
:Jika indeksnya ganjil:
Cetak string pada indeks
i
ke arah bawah:Dan kemudian gerakkan kursor sekali ke kanan atas:
Lain-lain (indeks genap):
Cetak string pada indeks
i
ke arah yang benar:Dan kemudian gerakkan kursor sekali ke kiri bawah:
sumber
Python 2 ,
8988 byteCobalah online!
sumber
C # (Visual C # Interactive Compiler) , 122 byte
Cobalah online!
sumber
J ,
474543 byteCobalah online!
Saya menemukan pendekatan yang menyenangkan dan berbeda ...
Saya mulai bermain-main dengan pembalut kiri dan ritsleting dengan gerund siklik dan sebagainya, tetapi kemudian saya menyadari akan lebih mudah untuk hanya menghitung posisi setiap huruf (ini bermuara pada jumlah pemindaian dari array yang dipilih dengan benar) dan menerapkan perubahan
}
ke blank kanvas pada input yang diratakan.Solusi ditangani hampir seluruhnya oleh Amend
}
:; ( single verb that does all the work ) ]
garpu keseluruhan;
bagian kiri meratakan input, yaitu, menempatkan semua huruf ke dalam string yang berdekatan]
Bagian kanan adalah input itu sendiri(stuff)}
kami menggunakan bentuk amandemen gerund}
, yang terdiri dari tiga bagianv0`v1`v2
.v0
memberi kita "nilai baru", yang merupakan raze (yaitu, semua karakter input sebagai satu string), jadi kami gunakan[
.v2
memberi kami nilai awal, yang kami transformasikan. kami hanya ingin kanvas kosong dari ruang dimensi yang dibutuhkan.([ ' '"0/ [)
memberi kita satu ukuran(all chars)x(all chars)
.v1
memilih posisi mana yang akan kita masukkan karakter pengganti kita. Ini adalah inti dari logika ...0 0
di kiri atas, kita perhatikan bahwa setiap karakter baru adalah 1 di sebelah kanan posisi sebelumnya (yaitu,prev + 0 1
) atau satu ke bawah (yaitu,prev + 1 0
). Memang kita melakukan "len kata 1" kali, lalu "len kata 2" kali, dan seterusnya, secara bergantian. Jadi kita hanya akan membuat urutan yang benar dari gerakan-gerakan ini, kemudian memindai jumlahnya, dan kita akan memiliki posisi kita, yang kemudian kita kotak karena itulah cara Amend bekerja. Berikut ini hanyalah mekanisme dari ide ini ...([: <@(+/)\ #&> # # $ 1 - e.@0 1)
#:@1 2
menciptakan matriks konstan0 1;1 0
.# $
kemudian memanjang sehingga memiliki baris sebanyak input. misal, jika input mengandung 3 kata maka akan dihasilkan0 1;1 0;0 1
.#&> #
bagian kiri itu adalah larik panjang kata-kata yang dimasukkan dan#
disalin, sehingga menyalin0 1
"len kata 1" kali, lalu1 0
"len kata 2 kali", dll.[: <@(+/)\
apakah jumlah dan kotak pindai.sumber
T-SQL, 185 byte
Cobalah online
sumber
Retina , 51 byte
Cobalah online!
Pendekatan yang agak langsung yang menandai setiap kata lain dan kemudian menerapkan transformasi secara langsung.
Penjelasan
Kami menandai setiap kata lain dengan tanda titik koma dengan mencocokkan setiap kata, tetapi hanya menerapkan penggantian pada kecocokan (yang tidak diindeks nol) mulai dari kecocokan 1 lalu 3 dan seterusnya.
+(m
set beberapa properti untuk tahapan berikut. Nilai tambah memulai loop "sementara kelompok tahap ini mengubah sesuatu", dan tanda kurung buka menunjukkan bahwa tanda plus harus berlaku untuk semua tahap berikut sampai ada tanda kurung di depan backtick (yang merupakan semua tahap dalam kasus ini). Them
hanya memberitahu regex untuk memperlakukan^
sebagai juga cocok dari awal garis bukan hanya awal dari string.Regex yang sebenarnya cukup mudah. Kami cukup mencocokkan jumlah barang yang sesuai sebelum titik koma pertama dan kemudian menggunakan
*
sintaks pengganti Retina untuk memasukkan jumlah ruang yang benar.Tahap ini diterapkan setelah yang terakhir untuk menghapus titik koma dan spasi di akhir kata yang kami ubah menjadi vertikal.
sumber
Retina 0.8.2 , 58 byte
Cobalah online! Tautan termasuk kasus uji. Solusi alternatif, juga 58 byte:
Cobalah online! Tautan termasuk kasus uji.
Saya sengaja tidak menggunakan Retina 1 di sini, jadi saya tidak mendapatkan operasi kata-kata alternatif secara gratis; sebaliknya saya punya dua pendekatan. Pendekatan pertama membagi semua huruf dalam kata-kata alternatif dengan menghitung spasi sebelumnya, sedangkan pendekatan kedua menggantikan spasi alternatif dengan baris baru dan kemudian menggunakan spasi yang tersisa untuk membantunya membagi kata-kata alternatif menjadi huruf. Setiap pendekatan kemudian harus menggabungkan huruf vertikal terakhir dengan kata horizontal berikutnya, walaupun kodenya berbeda karena mereka membagi kata dengan cara yang berbeda. Tahap terakhir dari kedua pendekatan kemudian mengisi setiap baris sampai karakter non-spasi pertamanya disejajarkan di bawah karakter terakhir dari baris sebelumnya.
Perhatikan bahwa saya tidak menganggap bahwa kata-kata hanyalah huruf karena saya tidak harus.
sumber
PowerShell ,
101 8983 byte-12 byte berkat mazzy .
Cobalah online!
sumber
& $b @p
(setiap kata sebagai satu argumen), 3) menggunakan formulir yang lebih pendek untuknew line
konstanta. lihat 3,4 baris pada contoh inifoo
. lihat kodenya .Given a list of at least two words...
PowerShell ,
7465 byteCobalah online!
sumber
R , 126 byte
Cobalah online!
sumber
T-SQL, 289 byte
Ini berjalan pada SQL Server 2016 dan versi lainnya.
@ memegang daftar yang dibatasi ruang. @ Saya melacak posisi indeks dalam string. @ S melacak jumlah total ruang yang diindentasi dari kiri. @B melacak sumbu yang disejajarkan dengan string pada titik @I.
Hitungan byte menyertakan daftar contoh minimal. Script menelusuri daftar, karakter demi karakter, dan mengubah string sehingga akan ditampilkan sesuai dengan persyaratan. Ketika akhir string tercapai, string tersebut DICETAK.
sumber
JavaScript (Node.js) , 75 byte
Cobalah online!
Penjelasan dan ungolfed
sumber
Stax , 12 byte
Jalankan dan debug itu
sumber
Jelly , 21 byte
Cobalah online!
Sebuah program lengkap mengambil input sebagai daftar string dan secara implisit mengeluarkan untuk stdout kata tangga.
sumber
C (gcc) ,
9387 byteTerima kasih kepada gastropner untuk sarannya.
Versi ini mengambil array string yang diakhiri oleh pointer NULL.
Cobalah online!
sumber
Brain-Flak , 152 byte
Cobalah online!
Saya menduga ini bisa lebih pendek dengan menggabungkan dua loop untuk kata-kata aneh dan genap.
sumber
J,
3533 byteIni adalah kata kerja yang mengambil input sebagai string tunggal dengan kata-kata yang dipisahkan oleh spasi. Misalnya, Anda bisa menyebutnya seperti ini:
Outputnya adalah matriks huruf dan spasi, yang mana interpreter menampilkan dengan baris baru sesuai kebutuhan. Setiap baris akan diisi dengan spasi sehingga mereka memiliki panjang yang sama persis.
Ada sedikit masalah dengan kode: kode tidak akan berfungsi jika input memiliki lebih dari 98 kata. Jika Anda ingin memperbolehkan input yang lebih panjang, gantilah
_98
kode itu dengan_998
mengizinkan hingga 998 kata, dll.Izinkan saya menjelaskan bagaimana ini bekerja melalui beberapa contoh.
Misalkan kita memiliki matriks huruf dan spasi yang kita bayangkan adalah output parsial untuk beberapa kata, dimulai dengan kata horizontal.
Bagaimana kita bisa menambahkan kata baru sebelum ini, secara vertikal? Ini tidak sulit: cukup ubah kata baru menjadi matriks kolom tunggal huruf dengan kata kerja
,.
, lalu tambahkan output ke matriks kolom tunggal itu. (Kata kerja,.
mudah digunakan karena berfungsi sebagai fungsi identitas jika Anda menerapkannya pada matriks, yang kami gunakan untuk bermain golf.)Sekarang kita tidak bisa hanya mengulangi cara menambahkan kata seperti apa adanya, karena dengan begitu kita hanya akan mendapatkan kata-kata vertikal. Tetapi jika kita memindahkan matriks output di antara setiap langkah, maka setiap kata lainnya akan horisontal.
Jadi upaya pertama kita untuk solusi adalah memasukkan setiap kata ke dalam matriks satu kolom, kemudian lipat dengan menambahkan dan mentransposisi di antara mereka.
Tapi ada masalah besar dengan ini. Ini menempatkan huruf pertama dari kata berikutnya sebelum berbelok ke kanan, tetapi spesifikasinya membutuhkan pengubahan sebelum meletakkan huruf pertama, jadi hasilnya harus seperti ini:
Cara kami mencapai ini adalah membalikkan seluruh string input, seperti pada
kemudian gunakan prosedur di atas untuk membangun zig-zag tetapi berputar hanya setelah huruf pertama dari setiap kata:
Kemudian balikkan hasilnya:
Tapi sekarang kita punya masalah lain. Jika input memiliki jumlah kata ganjil, maka output akan memiliki kata vertikal pertama, sedangkan spesifikasi mengatakan bahwa kata pertama harus horisontal. Untuk memperbaikinya, solusi saya membuat daftar kata-kata persis 98 kata, menambahkan kata-kata kosong, karena itu tidak mengubah output.
sumber