Sasaran: Menulis program atau fungsi yang mencetak string input dalam bentuk sinusoidal.
Sinusoid ASCII
Berikut adalah satu periode sinusoid:
.......
... ...
.. ..
. .
. .
. .
. . .
. .
. .
. .
.. ..
... ...
.......
Perhatikan bahwa ada tepat satu titik di setiap kolom.
- Setiap karakter dalam string input akan menggantikan titik dalam bentuk di atas, dari kiri ke kanan.
- Spasi dalam input harus dihasilkan seperti karakter normal, sebagai ganti sebuah titik.
- Karakter awal berhubungan dengan titik paling kiri pada gambar di atas.
- Ini hanya satu periode, input bisa lebih lama dari jumlah titik di atas.
Memasukkan
- Input adalah string ASCII yang hanya berisi karakter antara ASCII desimal 32 (spasi) dan ASCII desimal 126 (Tilde ~).
- Input akan selalu menjadi satu baris saja (tanpa linebreak).
- Input dapat diambil melalui STDIN, parameter fungsi, argumen baris perintah, atau yang serupa.
Keluaran
- Keluaran harus dicetak persis seperti dalam kasus uji yang diberikan.
- Spasi pada garis dibolehkan sepanjang panjang garis dengan spasi tersebut tidak melebihi panjang garis terpanjang (yang memiliki karakter terakhir di atasnya).
- Tidak ada garis depan / belakang yang diizinkan.
Uji kasus
- Memasukkan:
.................................................
Keluaran:
.......
... ...
.. ..
. .
. .
. .
. . .
. .
. .
. .
.. ..
... ...
.......
- Memasukkan:
Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It's 100% free, no registration required.
Keluaran:
ng Puzz ion and siasts stratio
mmi les est an thu and egi n r
ra & qu sw en c r eq
g e o o u
o C a r e d n i
r o l e r
P d s s z , e
e i i z g e d
t u o e .
G e e p l r
ol ng f g fe f
f S cha or min rs. 00%
tack Ex program It's 1
- Memasukkan:
Short text.
Keluaran:
t.
tex
t
r
o
h
S
- Memasukkan:
The quick brown fox jumps over the lazy dog
Keluaran:
brown
ick fox
qu j
u
e m
h p
T s
o
v
er
th dog
e lazy
Mencetak gol
Ini adalah kode-golf , sehingga program atau fungsi terpendek dalam byte menang.
sin
fungsi untuk mereproduksinya tetapi posisinya sedikit mati.)Jawaban:
Pyth, 59 byte (57 karakter)
Demonstrasi.
Tabel pencarian biner dikodekan di dalam
, yang memiliki nilai 3912. Ini dikonversi menjadi biner, memberi[1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0]
. Ini diperlakukan sebagai perbedaan antara ketinggian berurutan. Dengan mendahului 6, membentuk semua awalan dan memetakan masing-masing ke jumlahnya, kuartal pertama gelombang dihasilkan.sM._+6jC\2
mengevaluasi[6, 7, 8, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12]
seperti yang dijelaskan di atas. Kemudian, kode menyatukan pada kebalikan dari string ini untuk membentuk paruh pertama dari gelombang, dan kemudian kurangi dari 12 untuk memberikan seluruh gelombang.Kemudian, kami membentuk garis dari setiap karakter input diikuti oleh 12 spasi. Baris ini diputar ke kanan oleh parameter ketinggian gelombang yang sesuai dengan lokasi itu, dan kemudian garis ditransposisikan dan digabungkan pada baris baru.
Kemudian, kami menanggalkan garis kosong awal dan akhir. Namun, kami tidak dapat menghapus memimpin atau mengekor garis kosong yang memiliki spasi dari input. Ini diimplementasikan dengan mengganti spasi di input dengan tab (
C9
), yang tidak bisa di input, menghapus garis kosong, dan mengubah tab kembali menjadi spasi.sumber
Python 2, 156 byte
Penjelasan
Seluruh kode hanya membuat blok spasi (
o
) dan mengganti spasi yang tepat dengan huruf-huruf inputt
.Variabel
l
menyimpan daftar offset dari atas. Sehinggan
karakter ke-4t
harus on linel[n]
.Bytearray
o
berfungsi sebagai string yang bisa berubah, karena string tidak berubah dalam python.-~h
sama sepertih+1
tetapi menghemat ruang karena saya tidak perlu tanda kurung.sumber
Java,
219209199 byteSaya masih pemula di sini, dan berharap bahwa itu sesuai dengan aturan untuk memperkenalkan sub-fungsi (ketika byte dari fungsi ini dihitung, tentu saja). Jika tidak, saya akan mencoba untuk mengubah
sin
fungsi menjadi beberapa pencarian array pintar ...sumber
char[]
. Di sini, itu akan menyingkirkan yang()
onlength
dan menghilangkancharAt()
juga. Jika saya membacanya dengan benar, Anda juga dapat menggunakanprint()
daripadaprintln()
menyimpan lebih banyak pasangan....a<24?s(24-a):-s(a-24);
dan menyebutnya dengans(c%48)
.Perl, 222 byte
Membutuhkan
-E
untuksay
, menyimpan posisi sebagai integer dilemparkan ke angka biner dan membalik array mungkin tidak efisien byte-bijaksana. Saya juga yakin ada banyak penghematan yang harus dilakukan, jadi saya akan terus mencari-cari.Contoh output:
sumber
JavaScript,
251243224220217Implementasi yang benar-benar sederhana: ia menggunakan string karakter untuk mewakili posisi-y dari setiap karakter pada wave (diimbangi dengan
a
, yang merupakan kode ASCII 97). Itu kemudian beralih melalui semua baris yang mungkin; jika nilai-y dari baris saat ini sama dengan posisi-y pada gelombang, ia menulis karakter dari string. Ada juga pembersihan di akhir untuk menghapus baris jika ternyata benar-benar kosong.Perhatikan bahwa output akan tampak miring di
alert()
jendela jika tidak menggunakan font monospace, Anda dapat mengubahnyaconsole.log()
untuk memverifikasi output benar.EDIT1:
++
dan--
ada.EDIT2: Penghapusan baris kosong sekarang dilakukan dalam loop yang sama dengan yang lain, menghemat 17 karakter. Tidak perlu tanda kurung itu, untuk tambahan 2 karakter.
EDIT3: Tidak perlu mendeklarasikan bentuk gelombang sebagai variabel, menyimpan 4 karakter.
EDIT4: Seperti yang ditunjukkan oleh Dom Hastings dalam komentar, jumlah byte termasuk carriage return serta karakter baris baru, memperbarui jumlah byte untuk semua revisi untuk mengecualikan carriage return.
EDIT5: Disimpan 3 byte milik Dom Hastings. Saya belum menerapkan
o.splice
perbaikan karena gagal menghapus garis kosong (setidaknya pada akhirnya).sumber
if(o[i++].trim().length<1)o.splice(--i,1)
dengano.splice(i-(t=!o[i++].match(/\s/)),t)
, untuk -4,s=prompt() o=[]
dengans=prompt(o=[])
:, -1 danfor(y=0,i=0;y<13;++y){o[i]=""
denganfor(y=i=0;y<13;++y){o[i]=""
, -2. Mungkin untuk menggabungkan loop Anda juga untuk menghemat lebih banyak ... Satu hal lagi, perlu dicatat juga bahwa saya hanya memiliki 220 untuk jumlah byte Anda saat ini, jadi 225 Anda mungkin windows\r\n
bukan hanya\n
yang saya anggap dapat Anda abaikan. (tolong koreksi saya jika saya salah) ...for(s=prompt(),y=0;y<13;y++,v.trim()&&console.log(v))for(v="",x=0;x<s.length;x++)v+=y=="gfedccbbbaaaaaaabbbccdefghijkklllmmmmmmmlllkkjih".charCodeAt(x%48)-97?s[x]:" "
for(s=prompt(y=0);y<13;y++,v.trim()&&console.log(v))for(v="",x=0;x<s.length;x++)v+="gfedccbbbaaaaaaabbbccdefghijkklllmmmmmmmlllkkjih".charCodeAt(x%48)-97-y?" ":s[x]
Matlab,
133, 130 byteThe one liner:
Dan versi yang diperluas:
Satu liner mengambil input dari konsol (
stdin
) dan 130 byte. Versi yang diperluas menggantikan input konsol dengan definisi fungsi (+1 byte) tetapi jauh lebih nyaman digunakan untuk kasus uji dalam satu lingkaran:Deskripsi:
Indeks garis setiap karakter dihitung selama setengah periode, kemudian dicerminkan dan digabungkan untuk memiliki periode penuh.
Kami membuat latar belakang kosong karakter spasi (panjangnya sama dengan string input. Kami menempatkan setiap karakter sesuai dengan posisinya di baris yang relevan. Jika string input lebih panjang dari satu periode,
mod
operator (modulo) membungkusnya sehingga kami tidak t keluar dari ikatan ketika meminta nomor baris.Kasus cobaan:
Simpan versi fungsi
textsine.m
di bawah jalur Anda, lalu jalankan:akan menampilkan:
jika Anda ingin menguji versi satu kapal dengan masukan dari
stdin
, masukan Anda telah dimasukkan sebagai salah satu tunggalstring
, sehingga Anda harus melampirkan masukan Anda antara'
karakter. Contoh:Terima kasih
Luis Mendo
telah mencukur 3 byte ;-)sumber
s=input('');
tetap bekerja.Scala 377 karakter
potongan pertama. mungkin bisa mendapatkan formula yang lebih baik untuk menerjemahkan
x
key
sumber
Common Lisp, 205 byte
Tes
Lihat http://pastebin.com/raw.php?i=zZ520FTU
Komentar
Cetak garis keluaran demi baris, menghitung indeks dalam string yang harus dicetak menggunakan fungsi sinus terbalik
asin
. Outputnya tidak sama persis dengan input yang diharapkan dalam pertanyaan, tetapi karena OP mengakui bahwa output contoh bukan sinus yang sebenarnya, saya kira ini tidak apa-apa. Setidaknya, selalu ada hanya satu karakter yang ditulis untuk setiap kolom.sumber
Python 2, 172 byte
Ini tidak sebagus jawaban Alex L , tapi cukup dekat. Mengambil input dari input standar dan berfungsi terbaik dalam
.py
file.Saya memutuskan untuk membangun output yang ditransposisikan (setiap kolom adalah satu baris) dan kemudian mengubah hasilnya, karena dalam python transpos dari sebuah matriks adalah
map(*m)
.l
: Representasi biner dari9960000
(setelah memangkas"0b"
daribin
) adalah100101111111101001000000
. Ini adalah "langkah" dari gelombang sinus setiap kolom, mulai dari karakter terakhir dari titik terendah. Saya menyalin daftar ini, meniadakan setiap angka, dan menempelkannya di ujungnya sendiri untuk membentuk apa yang secara efektif merupakan turunan dari fungsi.s
: Ini adalah variabel yang melacak baris mana (kolom dalam transpos) karakter selanjutnya dimasukkan ke dalam.o
: Hasil akhir, dialihkani
: Melacak periode gelombang sinus. Mulai pukul 9 karenal
sedikit bergeser.Dalam
for
lingkaran, saya membuat daftar 13 spasi (saya menggunakan bytearrays tetapi daftar karakter ternyata memiliki pernyataan cetak yang lebih pendek), lalu gantis
karakter ke-5 dengan karakter input. Tambahkanb
ke akhiro
, tambahkan langkah yang sesuais
, dan kenaikani
.Saya berharap
print
pernyataan itu akan sesederhana itu\n'.join(*zip(o))
, tetapi tidak ada keberuntungan.zip(*o+['\n'*13])[::-1]
menambahkan kolom baris baru dan kemudian membalikkan dan mentransposisi semuanya (tanpa membalikkan, gelombang sinus terbalik),sum(...,())
menggabungkan tuple bersama menjadi satu tupel karakter, dan kemudian''.join(...)
menggabungkan karakter dan mencetaknya.Hal-hal lain yang saya coba adalah membuat array spasi 12 karakter dan memasukkan karakter baru ke tempat yang sesuai, dan mengganti
l+=[-c for c in l];
dengan semacam matematika dengan semacam perkalian dari1
dan-1
dengan hasil pengindeksan kel
, tetapi tidak ada yang bisa saya kemukakan. dengan akhirnya menjadi lebih pendek.sumber
Mathematica, 131 byte
Itu 131 karakter, termasuk tiga untuk
i=foo;
. Itu tampaknya cara yang masuk akal untuk mengambil input; Saya bisa langsung memasukkannya ke dalam definisic
dan menyelamatkan beberapa pukulan, tetapi itu terasa tidak adil.Ini cukup mudah - bahkan bisa dibaca. Ini membagi string menjadi daftar karakter, dan kemudian menempatkan karakter-karakter itu ke dalam array yang jarang pada posisi yang ditentukan dari
Table
(setiap titik dalam array tidak memberikan karakter default ke spasi). Garis-garis dirakit secara terpisah, kemudian baris baru ditaburkan di antara mereka. The StringJoin terakhir menjahit semuanya.NB: Seperti beberapa solusi lain, ini mungkin tidak benar-benar valid karena menghasilkan sinusoid nyata daripada contoh buatan tangan (indah).
Tes:
sumber