Diberi kata yang hanya terdiri dari huruf kecil, lakukan hal berikut:
- Untuk setiap huruf, dapatkan faktorisasi utama dari posisinya dalam alfabet.
- Untuk setiap faktor prima, p , gambar berlian dengan panjang sisi p dan tempelkan huruf di tengah berlian.
- Berlian terbesar adalah di tengah, berlian berikutnya yang lebih kecil (dari terbesar ke terkecil) bergantian antara pergi ke bawah atau atas.
Catatan: Untuk huruf a gunakan panjang sisi 1.
Contoh: kucing
- c : 3 = 3
- a : 1 = 1
- t : 20 = 5 * 2 * 2
Diagram:
.
. .
. t .
. .
.
.
. .
. . .
. . . .
. . . . .
. c . .a. . t .
. . . . .
. . . .
. . .
. .
.
.
. .
. t .
. .
.
Contoh: anjing
- d : 4 = 2 * 2
- o : 15 = 5 * 3
- g : 7 = 7
Diagram:
.
. .
. . .
. . . .
. . . .
. . . . .
. . . . . .
. d . . o . . g .
. . . . . .
. . . . .
. . . . .
. . . . . .
. d . . . .
. . . . .
. . . .
. .
. o .
. .
. .
.
-20% bonus jika program Anda menghasilkan file teks yang disebut "[kata-Anda] .txt". Kemudian masukkan kata nyata (atau frasa, dibuat huruf kecil tanpa spasi) yang panjangnya paling sedikit 20 huruf dan belum ada orang lain yang memilih, dan tempelkan output antara a <pre>
dan a </pre>
dalam jawaban Anda.
Jawaban:
Matlab,
466393 - 20% = 314,4 byteGolfed: (Bisa menghemat lebih banyak byte, juga karena bantuan @ AndreasDeak!)
Ini harus bekerja di Octave (opensource) juga, tetapi hanya dengan banyak peringatan. Gunakan versi ini jika Anda ingin mencobanya dalam oktaf (keluaran ke konsol, bukan file):
Tidak digabungkan dan dijelaskan:
Kata yang diminta: (Dan di sini sebagai file: (perkecil banyak): supercalifragilisticexpialidocious.txt )
sumber
A=A(find(sum(A,2)),find(sum(A)));
cukup untuk melepas bantalan dalam satu langkah?<pre>
tag. Mengapa Anda tidak mencobanya?sort(factor())
? MATLABfactor
sepertinya sudah disortir. Dan Anda mungkin mendefinisikan variabel untukmax(f)
, karena Anda tampaknya menggunakan jumlah yang sama dua kali.Funciton , non-kompetitif, 29199 byte
Saya menikmati tantangan ini karena menyoroti kurangnya beberapa fungsi perpustakaan yang sangat berguna. Saya akan memasukkan semua fungsi tersebut di sini (dan dalam hitungan byte) karena saya menulisnya setelah tantangan ini diposting.
Sumber penuh dalam satu file
Penjelasan
Seperti biasa, dapatkan rendering yang lebih baik dengan mengeksekusi
javascript:(function(){$('pre,code').css({lineHeight:5/4});})()
di konsol browser Anda.①
ɹ
⇄
MundurSeperti yang Anda mungkin atau mungkin tidak tahu, Funciton dilengkapi dengan pustaka yang penuh fungsi untuk daftar , yang merupakan nilai yang dikodekan dalam bilangan bulat tunggal, serta pustaka terpisah untuk urutan yang dievaluasi malas , yang menggunakan ekspresi lambda (fungsi anonim) di Agar malas. Tentu saja ada juga perpustakaan untuk fungsi penanganan string.
Untuk tantangan ini, saya membutuhkan fungsi untuk membalik string, dan fungsi untuk membalik urutan malas-dievaluasi. Yang mengejutkan, saya hanya punya satu untuk daftar - persis yang tidak saya butuhkan. Jadi di sini adalah fungsi terbalik untuk urutan malas (
ɹ
) dan untuk string (⇄
):Urutan lazy yang digunakan
ʬ
, yaitu "menambahkan elemen ke akhir urutan malas". String yang digunakanʃ
(substring) dan‼
(string concatenate).②
Ṗ
PrimesMeskipun saya bisa melakukan faktorisasi prima dengan hanya mencoba untuk membagi n oleh faktor-faktor dalam rangka, saya memutuskan saya ingin fungsi perpustakaan yang menghasilkan bilangan prima. Fungsi berikut mengambil bilangan bulat n dan mengimplementasikan Saringan Eratosthenes untuk menghasilkan semua bilangan prima hingga n . Ini melakukan ini sebagai urutan malas, sehingga hanya akan menghasilkan bilangan prima sebanyak yang Anda benar-benar evaluasi.
Fungsi helper
Ṗp
,, mengambil:Penghitung berjalan yang terus menurun sampai mencapai 0.
Saringan, yang memiliki bit yang ditetapkan untuk setiap nomor yang sudah diketahui tidak prima. Awalnya, bit paling signifikan mewakili angka 2, tetapi kami menggeser hak ini dengan setiap iterasi.
Angka n yang menunjukkan angka apa yang diwakili oleh bit terendah ayakan; ini bertambah setiap iterasi.
Pada setiap iterasi, jika bit saringan terendah adalah 0, kami telah menemukan bilangan prima n . Kami kemudian menggunakan rumus yang sudah saya jelaskan di Isi baris, kolom, dan diagonal dari kisi NxN untuk mengatur setiap bit ke- n dalam ayakan sebelum pindah ke iterasi berikutnya.
Factor
Ḟ
Faktorisasi utamaIni cukup mudah. Lakukan iterasi melalui bilangan prima hingga n dan lihat mana yang membaginya n . Jika seseorang membagi n , ingat untuk melanjutkan dengan prime yang sama sehingga kami mengembalikannya beberapa kali jika membaginya dengan n beberapa kali. Ini mengembalikan urutan kosong untuk nomor yang kurang dari 2.
④
◇
◆
Hasilkan berlianFungsi ini menghasilkan berlian tunggal yang diberi karakter dan jari-jari. Hanya menggunakan karakter untuk menempatkannya di tengah berlian.
Ini banyak menggunakan urutan malas. Begini cara kerjanya:
Hasilkan urutan bilangan bulat dari 0 hingga r (inklusif).
Untuk setiap bilangan bulat seperti α , hasilkan string yang terdiri dari ( r - α ) spasi (
…
), diikuti oleh titik, diikuti oleh ruang α - kecuali α = r , yang dalam hal ini menghasilkan satu ruang lebih sedikit dan menambahkan huruf. Kami sekarang memiliki bagian kiri atas berlian.Untuk masing-masing string ini, tambahkan salinan lain dari string yang sama, tetapi dengan karakter terbalik (
⇄
) dan kemudian karakter pertama dihapus (>> 21
). Kami sekarang memiliki bagian atas berlian.Ambil urutan ini dan tambahkan urutan yang sama, tetapi terbalik (
ɹ
) dan dengan elemen pertama dihapus (ʓ
). Kami sekarang memiliki seluruh berlian.Sekarang kami memiliki string yang membentuk berlian, tetapi kami membutuhkan sedikit informasi lebih lanjut. Kita perlu tahu di mana bagian tengah vertikal berlian itu. Awalnya ini tentu saja r , tetapi setelah kita menambahkan berlian lain ke atas dan bawah ini, kita perlu melacak posisi berlian "tengah" sehingga kita dapat secara vertikal menyelaraskan tumpukan berlian lainnya dengan benar . Hal yang sama berlaku untuk tingkat horizontal berlian (perlu ketika menambahkan berlian ke atas dan bawah). Saya juga memutuskan untuk melacak surat itu; Saya memerlukannya karena jika tidak, fungsi
⬗
(yang akan kita bahas di bagian selanjutnya) harus memiliki empat parameter, tetapi Funciton hanya mengizinkan tiga.Kami menggunakan daftar API (
›
menambahkan elemen ke bagian depan daftar) untuk membuat struktur yang mengandung [ x , y , c , q ], di mana x adalah koordinat x dari pusat horizontal berlian, y adalah y- koordinat baseline, c adalah huruf dan q adalah urutan malas dari string. Struktur ini akan digunakan untuk memuat semua tahap peralihan mulai sekarang.⑤
⬗
Menambahkan berlian secara vertikalFungsi ini mengambil tumpukan berlian yang ada, jari-jari, dan boolean yang menunjukkan apakah akan menambahkan berlian baru ke atas (benar) atau bawah (salah).
Ini juga cukup mudah; gunakan
‹
untuk membongkar struktur; gunakan◇
untuk menghasilkan berlian baru; gunakanɱ
(peta) untuk menambahkan spasi ke awal dan akhir setiap string di berlian baru sehingga semuanya memiliki lebar yang sama; tambahkan (ʭ
) string baru ke yang lama (jika bawah) atau yang lama ke yang baru (jika atas); dan akhirnya digunakan›
untuk membangun struktur yang berisi semua nilai baru. Khususnya, jika kita menambahkan ke bawah, y tidak berubah, tetapi jika kita menambahkan ke atas, y harus meningkat sebesar♯(r << 1)
( r adalah jari-jari berlian baru).⑥
❖
Tumpukan gabungan secara horizontalIni adalah fungsi terbesar dari semuanya. Saya tidak akan menyangkal bahwa itu cukup fiddly untuk mendapatkan ini dengan benar. Dibutuhkan dua tumpukan dan menggabungkannya secara horizontal dengan tetap menghormati perataan vertikal yang benar.
Begini cara kerjanya.
Pertama, untuk setiap tumpukan, buat urutan tak terbatas (
⁞
) string, yang masing-masing berisi spasi (…
) sesuai dengan lebar tumpukan itu.The y nilai dari tumpukan memberitahu kita mana yang kebutuhan untuk “bergerak turun” dan seberapa banyak. Susun urutan ruang yang sesuai, terpotong (
ȶ
) hingga panjang yang tepat ( y1 - y2 atau y2 - y1 sesuai kebutuhan).Sekarang tentukan panjang masing-masing urutan string (
ɕ
), yang memberitahu kita tingginya. Cari tahu mana yang lebih tinggi.Tambahkan urutan ruang tak terbatas ke kedua tumpukan.
Gunakan zip (
ʑ
) untuk menyatukannya. Untuk setiap pasangan string, menyatukan mereka (‼
) bersama dengan ruang ekstra di antaranya.Kemudian gunakan
ȶ
untuk memotong hasil itu ke ketinggian tertinggi. Dengan melakukan ini terlambat, kita tidak perlu peduli yang mana dari mereka yang membutuhkan padding.Akhirnya, hasilkan struktur lagi. Pada titik ini, kita tidak lagi membutuhkan karakter dalam berlian, jadi kita atur ke 0. Nilai x hanya dijumlahkan dan ditambah (sehingga lebar tumpukan masih dapat dihitung sebagai
♯(x << 1)
). Nilai y diatur ke yang lebih tinggi dari keduanya.⑦
↯
Ulangi karakter dalam stringIni adalah fungsi lain yang berguna yang akan saya tambahkan ke perpustakaan. Diberikan string, itu memberi Anda urutan malas berisi setiap kode karakter.
and
ing string dengan 2097151 mengembalikan karakter pertama.>>
ing dengan 21 menghapusnya. Kami memeriksa 0 dan −1 untuk alasan yang dijelaskan di halaman esolang ; ini tidak relevan dengan tantangan ini, tetapi saya ingin fungsi perpustakaan menjadi benar.⑧
⬖
Konversi karakter menjadi tumpukan berlianFungsi ini mengambil satu karakter dan mengembalikan struktur untuk tumpukan vertikal yang mewakili satu karakter itu.
Fungsi ini menarik karena kami membutuhkan berlian untuk ditambahkan secara bergantian ke bagian bawah dan atas. Begini cara saya melakukannya:
Pertama, kurangi 96 (jadi
'a'
1), dapatkan faktor prima (diḞ
atas), gunakanɗ
untuk menambahkan elemen 1 jika urutannya kosong, lalu balikkan (ɹ
) pesanan.Lepaskan elemen pertama dan panggil
◆
untuk memulai tumpukan.Sekarang, gunakan
⸗
untuk menghasilkan urutan malas yang hanya bergantian angka 0 dan 1 tanpa batas.Gunakan
ʑ
(zip) untuk itu dan faktor prima lainnya. Untuk setiap faktor utama, geser ke kiri sebesar 1 danor
0/1 ke atasnya. Kami sekarang memiliki urutan yang mengkodekan bilangan prima dan informasi atas / bawah.Terakhir, gunakan
ʩ
(lipat kiri / agregat). Nilai awal adalah tumpukan yang kami hasilkan dari elemen pertama di atas. Untuk setiap nilai ν , panggil⬗
(tambahkan berlian baru) dengan tumpukan sebelumnya, perdana (ν >> 1
) dan apakah atas atau bawah (ν & 1
).⑨ Program utama
Di sini kita melakukan pekerjaan utama.
Pertama, petakan (
ɱ
) di atas karakter dalam string input (↯
) dan ubah masing-masing menjadi setumpuk berlian menggunakan⬖
. Lepaskan elemen pertama dari itu, dan lipat (ʩ
) di atas yang lain untuk menyatukan semuanya (❖
). Terakhir, bongkar struktur yang digunakan‹
untuk sampai ke urutan string dan gabungkan semuanya (ʝ
) menggunakan 10 (baris baru) sebagai pemisah.Contoh output
Memasukkan:
Output (butuh 9 detik untuk menghitung; tidak dapat memposting di sini karena batas ukuran).
sumber