Memvisualisasikan kata-kata

20

Diberi kata yang hanya terdiri dari huruf kecil, lakukan hal berikut:

  1. Untuk setiap huruf, dapatkan faktorisasi utama dari posisinya dalam alfabet.
  2. Untuk setiap faktor prima, p , gambar berlian dengan panjang sisi p dan tempelkan huruf di tengah berlian.
  3. 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.

geokavel
sumber
Contoh Anda tampaknya menggunakan berlian dengan ukuran p + 1 titik ...
Jaykul
3
@Jaykul Pertanyaan bagus. Panjang sisi ditentukan oleh jumlah spasi di antara titik-titik.
geokavel

Jawaban:

8

Matlab, 466 393 - 20% = 314,4 byte

Golfed: (Bisa menghemat lebih banyak byte, juga karena bantuan @ AndreasDeak!)

function q(W);function z=g(l,c);[x,y]=ndgrid(abs(-l:l));z=0*y;z(~x&~y)=c;z(x+y==l)=46;end;w=W-96;n=numel(w);R=n*26;C=1;A=zeros(2*R);for k=1:n;f=sort(factor(w(k)));C=C+max(f)+1;d=-1;r=R;for F=fliplr(f);v=-F:F;while norm(A(r+v,v+C));r=r+d;end;A(r+v,v+C)=g(F,W(k));d=-d;end;C=C+max(f);end;A=A(find(sum(A,2)),find(sum(A)));f=fopen([W,'.txt'],'w');for k=1:size(A,1);fprintf(f,[A(k,:),'\n']);end;end

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):

function q(W);function z=g(l,c);[x,y]=ndgrid(abs(-l:l));z=0*y;z(~x&~y)=c;z(x+y==l)=46;end;w=W-96;n=numel(w);R=n*26;C=1;A=zeros(2*R);for k=1:n;f=sort(factor(w(k)));C=C+max(f)+1;d=-1;r=R;for F=fliplr(f);v=-F:F;while norm(A(r+v,v+C));r=r+d;end;A(r+v,v+C)=g(F,W(k));d=-d;end;C=C+max(f);end;A=A(find(sum(A,2)),find(sum(A)));disp([A,'']);end

Tidak digabungkan dan dijelaskan:

function q(W)
function z=g(l,c) %get a square matrix for one prime factor
[x,y]=ndgrid(abs(-l:l));
z=0*y;
z(~x&~y)=c;    %character in the middle
z(x+y==l)=46;  %dots
end;
w=W-96;                %convert word to the corresponding indices                  
n=numel(w);
R=n*26;                %keeps track of the main row 
C=1;                   %keeps track of the current column
A=zeros(2*R);          %make a 'canvas' matrix that is way to big 
for k=1:n;
    f=sort(factor(w(k)));          %get all the factors of current character
    C=C+max(f)+1;                  %update current column
    d=-1;                          %search direction
    r=R;
    for F=fliplr(f);              
        v=-F:F;
        while norm(A(r+v,v+C));    %go up or down until there is enough space to write the prime factor
            r=r+d;
        end;
        A(r+v,v+C)=g(F,W(k));     %insert all the prime factors
        d=-d;
    end;
    C=C+max(f);
end;
A=A(find(sum(A,2)),find(sum(A))); %truncate all the unneccessary padding
f=fopen([W,'.txt'],'w');     %write to file
for k=1:size(A,1);
    fprintf(f,[A(k,:),'\n']);
end;

end

Kata yang diminta: (Dan di sini sebagai file: (perkecil banyak): supercalifragilisticexpialidocious.txt )

                       . . .                   
                      . . . . . .                  
                     . . . . . .                 
                    . . . . . .                
                   . . . . . .               
                  . . . . . .              
                 . . . . . .             
                . . . . . .            
               . . . . . .           
              . . . . . . .          
             . . . . . . . .         
            . . . . . . . . . t. . . . .        
           . . . . . . . . . . . . . . . . . . . . . . . . .       
          . . . . . . . r. . l. . r. . . . l. . . . . x. . . . l. . . . .      
         . . . . . hal. . . . . . . . . . . . . . . . . . . hal. . . . . . . . .     
        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    
       . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   
      . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
    . s .. u .. p .. e .. r .. c .. a .. l .. aku .. f .. r .. a .. g .. aku .. aku .. aku .. s. t .. aku .. c .. e .. x .. p .. aku .. a .. l .. aku .. d .. o .. c .. aku .. o .. u .. s .
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  
       . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   
        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    
         . . . . . hal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . hal. . . . . . . . d. . . . . . . . .     
          . . . . . . . . . l. . . . f. . . . . . . . l. . . . . . . . . x. . . . . . l. . . . . . . . . . . . .      
           . . . . . r. . . . saya . . . r. . . saya . . . saya . . . . . saya . . . . saya . . . saya . . . . saya . . . . .       
            . . . . . . . . . . . . . . . . . . . . t. . . . . . . . . . . . . . . . . . .        
             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o. . . . o. . . . .         
              . . . . . hal. . . . . . . . . . . . . hal. . . . . . . . . . . .          
               . . . kamu . . . . . x. . . . . . . . kamu . .           
                . . . . . . . . . . . . . . . .            
                 . . . . . . . . . . .             
                  . . . . . . . .              
                   . . . . . .               
                    . . . . . .                
                     . . . . . .                 
                      . . . . . .                  
                       . . .                   
cacat
sumber
Tidakkah A=A(find(sum(A,2)),find(sum(A)));cukup untuk melepas bantalan dalam satu langkah?
Andras Deak
Saya benar-benar mendapatkan hasil yang sempurna ketika saya menempelkan teks keluaran di antara dua <pre>tag. Mengapa Anda tidak mencobanya?
geokavel
Apakah Anda yakin perlu sort(factor())? MATLAB factorsepertinya sudah disortir. Dan Anda mungkin mendefinisikan variabel untuk max(f), karena Anda tampaknya menggunakan jumlah yang sama dua kali.
Andras Deak
1
@geokavel Saya yakin Anda melihatnya sebaliknya :) Dari [Alkitab] (en.wikipedia.org): MATLAB -> "Rilis awal - 1984", GNU Octave -> Rilis awal - 1988 ". Bagaimana apakah Mathworks memungkinkan produk komersialnya disalin hingga ke detail sekecil itu? Atau jika Anda hanya bermaksud mengapa itu masih menguntungkan: Saya yakin kotak alat dan fitur MATLAB yang tersedia membanjiri Octave (walaupun sintaksis Oktaf terkadang lebih kaya! Belum lagi kecepatan (saya pikir)
Andras Deak
1
@geokavel Seperti yang dikatakan AndrasDeak: Oktaf adalah tiruan dari Matlab, tetapi sayangnya bukan yang sempurna, karena pengembang juga mencoba meningkatkan bahasa. Di sini versi yang sedikit dimodifikasi yang juga berfungsi pada penerjemah online: goo.gl/Jk7mpV
flawr
6

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.

ɹ Mundur

Seperti 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 ( ):

              ╓───╖             ╔════╗ ┌────╖        ╓───╖
              ║ ɹ ║             ║ 21 ╟─┤ >> ╟──┐     ║ ⇄ ║
              ╙─┬─╜             ╚════╝ ╘═╤══╝  │     ╙─┬─╜      ┌──┐
          ┌─────┴─────┐                ┌─┴─╖   ├───────┴────────┤  │
        ┌─┴─╖ ┌───╖   │                │ ⇄ ║   │   ╔════╗ ┌───╖ │  │
      ┌─┤   ╟─┤ ɹ ╟─┐ │                ╘═╤═╝   │   ║ −1 ╟─┤ ≠ ╟─┴┐ │
      │ └─┬─╜ ╘═══╝ │ │                ┌─┴─╖ ┌─┴─╖ ╚════╝ ╘═╤═╝  │ │
      │   │   ┌───╖ │ │                │ ‼ ╟─┤ ? ╟──────────┤    │ │
      │   └───┤ ʬ ╟─┘ │                ╘═╤═╝ ╘═╤═╝  ╔═══╗ ┌─┴─╖  │ │
      │       ╘═╤═╝   │                ┌─┴─╖ ╔═══╗  ║ 0 ╟─┤ ≠ ╟──┘ │
      │ ╔═══╗ ┌─┴─╖   │              ┌─┤ ʃ ╟─╢ 1 ║  ╚═╤═╝ ╘═══╝    │
      └─╢ 0 ╟─┤ ? ╟───┘              │ ╘═╤═╝ ╚═══╝    │            │
        ╚═══╝ ╘═╤═╝                  │   └────────────┘            │
                │                    └─────────────────────────────┘

Urutan lazy yang digunakan ʬ, yaitu "menambahkan elemen ke akhir urutan malas". String yang digunakan ʃ(substring) dan (string concatenate).

Primes

Meskipun 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.

                                       ╓───╖
                                       ║ Ṗ ║
                                 ╔═══╗ ╙─┬─╜
                                 ║ 0 ║ ┌─┴─╖
                                 ╚═╤═╝ │ ♭ ║
                          ╔═══╗ ┌──┴─╖ ╘═╤═╝
                          ║ 2 ╟─┤ Ṗp ╟───┘
                          ╚═══╝ ╘══╤═╝
    ┌──────────────┐               │
    │              ├─────────────────────────────────────────┐
    │            ┌─┴─╖                                       │
    │          ┌─┤ · ╟────────────────────────────┐   ╓┬───╖ │
    │          │ ╘═╤═╝                            ├───╫┘Ṗp ╟─┤
    │          │   │           ╔═══╗ ┌────╖     ┌─┴─╖ ╙─┬──╜ │
    │          │   │           ║ 1 ╟─┤ >> ╟─────┤ · ╟───┴─┐  │
    │          │   │  ┌───╖    ╚═══╝ ╘══╤═╝     ╘═╤═╝     │  │
    │          │ ┌─┴──┤ ♯ ╟─────┐    ┌──┴─╖ ┌───╖ │       │  │
    │          │ │    ╘═══╝ ┌─┐ │ ┌──┤ Ṗp ╟─┤ ♭ ╟─┴─┐     │  │
    │          │ │          ├─┘ └─┤  ╘══╤═╝ ╘═══╝ ┌─┘     │  │
    │          │ │        ╔═╧═╕ ┌─┴─╖ ┌─┴─╖     ┌─┴─╖     │  │
    │          │ └────────╢   ├─┤ · ╟─┤ ? ╟─────┤ · ╟─┐   │  │
    │          │ ┌───╖    ╚═╤═╛ ╘═╤═╝ ╘═╤═╝     ╘═╤═╝ │   │  │
    │        ┌─┴─┤ ♭ ╟─┐ ┌──┴─╖   │   ┌─┴─╖       │   │   │  │
    │        │   ╘═══╝ └─┤ Ṗp ╟───┘ ┌─┤ ? ╟───────┘   │   │  │
    │ ┌───╖  │  ╔════╗   ╘══╤═╝     │ ╘═╤═╝           │   │  │
  ┌─┴─┤ ÷ ╟──┘  ║ −1 ║   ┌──┴─╖   ╔═╧═╗ │            ┌┴┐  │  │
  │   ╘═╤═╝     ╚══╤═╝ ┌─┤ >> ╟─┐ ║ 0 ║              └┬┘  │  │
  │   ┌─┴─╖ ┌────╖ │   │ ╘════╝ │ ╚═══╝               │   │  │
  │   │ × ╟─┤ << ╟─┘ ┌─┴─┐    ╔═╧═╗                   │   │  │
  │   ╘═╤═╝ ╘══╤═╝  ┌┴┐ ┌┴┐   ║ 1 ╟───────────────────┴─┐ │  │
  └─────┘     ┌┴┐   └┬┘ └┬┘   ╚═══╝                     ├─┘  │
              └┬┘    │   └──────────────────────────────┘    │
             ┌─┴─╖ ┌─┴──╖                                    │
             │ ÷ ╟─┤ << ╟─┐                                  │
             ╘═╤═╝ ╘════╝ ├──────────────────────────────────┘
              ┌┴┐         │
              └┬┘         │
      ╔════╗ ┌─┴──╖       │
      ║ −1 ╟─┤ << ╟───────┘
      ╚════╝ ╘════╝

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 utama

                             ╓───╖
                             ║ Ḟ ║
                             ╙─┬─╜
                       ┌───────┴──────┐
                       │ ┌───╖ ┌────╖ │
                       └─┤ Ṗ ╟─┤ Ḟp ╟─┘
                         ╘═══╝ ╘═╤══╝
                                 │
               ┌────────────────────────────────────────────┐
               │                                     ╓┬───╖ │
       ┌───────┴─┐     ┌───────────────────────┐   ┌─╫┘Ḟp ╟─┘
       │ ╔═══╗ ┌─┴─╖ ┌─┴─╖ ┌───┐ ┌────╖      ┌─┴─╖ │ ╙────╜
       │ ║ 0 ╟─┤   ╟─┤ · ╟─┘┌┐ └─┤ Ḟp ╟──┐ ┌─┤ · ╟─┴──┐
       │ ╚═══╝ └─┬─╜ ╘═╤═╝  └┤   ╘═╤══╝  ├─┘ ╘═╤═╝    │
       │       ┌─┴─┐ ┌─┴─╖ ╔═╧═╕ ┌─┴─╖ ┌─┴─╖ ┌─┴──╖ ┌─┴─╖
       │       │   └─┤ · ╟─╢   ├─┤ ? ╟─┤ · ╟─┤ ÷% ╟─┤ · ╟─┐
       │       │     ╘═╤═╝ ╚═╤═╛ ╘═╤═╝ ╘═╤═╝ ╘═╤══╝ ╘═╤═╝ │
       │       │    ┌──┴─╖   │   ┌─┴─╖ ┌─┴─╖   └──────┘   │
       │       │    │ Ḟp ╟───┘ ┌─┤ ? ╟─┤ ≤ ║              │
       │     ┌─┴─╖  ╘══╤═╝     │ ╘═╤═╝ ╘═╤═╝              │
       └─────┤ · ╟─────┘     ╔═╧═╗ │   ╔═╧═╗              │
             ╘═╤═╝           ║ 0 ║     ║ 2 ║              │
               │             ╚═══╝     ╚═══╝              │
               └──────────────────────────────────────────┘

Ini 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 berlian

Fungsi ini menghasilkan berlian tunggal yang diberi karakter dan jari-jari. Hanya menggunakan karakter untuk menempatkannya di tengah berlian.

                                   ┌───╖
             ┌─────────────────────┤ ♯ ╟───────────┬─────────┐
             │ ┌───╖ ╔═══╗   ┌───┐ ╘═══╝           │         │
             └─┤ ♫ ╟─╢ 0 ║   │ ┌─┴─╖               │         │
               ╘═╤═╝ ╚═══╝   │ │ ʭ ╟───┐           │         │
               ┌─┴─╖   ┌─────┘ ╘═╤═╝   │           │         │
               │ ɱ ╟───┤ ┌───╖ ┌─┴─╖ ╔═══╗   ╓───╖ │         │
               ╘═╤═╝   └─┤ ɹ ╟─┤ ʓ ╟─╢ 1 ║ ┌─╢ ◇ ╟─┤         │
                 │ ╔═══╗ ╘═══╝ ╘═══╝ ╚═══╝ │ ╙───╜ │         │
                 │ ║ 0 ║                   │     ┌─┴─╖       │
                 │ ╚═╤═╝                   │     │ ♭ ║       │
               ╔═╧═╕ │   ╔════╗            │     ╘═╤═╝       │
           ┌───╢   ├─┘ ┌─╢ 21 ║          ┌─┴─╖   ┌─┴─╖     ┌─┴─┐
           │   ╚═╤═╛   │ ╚════╝ ┌────────┤ · ╟───┤ · ╟─┐ ┌─┴─╖ │
           │   ┌─┴─╖ ┌─┴──╖ ┌───┘        ╘═╤═╝   ╘═╤═╝ ├─┤ = ║ │
           │ ┌─┤ ‼ ╟─┤ >> ║ │              │     ┌─┴─╖ │ ╘═╤═╝ │
           │ │ ╘═══╝ ╘═╤══╝ │              │   ┌─┤ ? ╟─┘   │   │
           │ │   ┌───╖ │ ┌──┘              │   │ ╘═╤═╝     │   │
           │ └─┬─┤ ⇄ ╟─┘ │     ┌─────┐     │   │ ┌─┴─╖     │   │
           │   │ ╘═══╝ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ └─┤ · ╟──┬──┘   │
           │   └───────┤ · ╟─┤ ? ╟─┤ · ╟─┤ ‼ ║   ╘═╤═╝  │      │
           │           ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝   ┌─┴─╖  │      │
           │             └─────┘     └─┬───┘ ┌───┤ … ║  │      │
           │               ┌─────┐     │     │   ╘═╤═╝  │      │
           │            ╔══╧═╗ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ╔═╧══╗ │      │
           │            ║ 32 ║ │ … ╟─┤ ‼ ╟─┤ ‼ ║ ║ 32 ║ │      │
           │            ╚════╝ ╘═╤═╝ ╘═══╝ ╘═╤═╝ ╚════╝ │      │
           │                   ┌─┴─╖       ╔═╧══╗       │      │
           │               ┌───┤ − ╟───┬─┐ ║ 46 ║       │      │
           │             ┌─┴─╖ ╘═══╝   │ │ ╚════╝       │      │
           └─────────────┤ · ╟─────────┘ └──────────────┘      │
                         ╘═╤═╝                                 │
                           └───────────────────────────────────┘

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 vertikal

Fungsi ini mengambil tumpukan berlian yang ada, jari-jari, dan boolean yang menunjukkan apakah akan menambahkan berlian baru ke atas (benar) atau bawah (salah).

                 ┌─────────────────────────────────────────────────┐
               ┌─┴─╖         ┌───────────────────────────┐ ┌───╖ ┌─┴─╖
           ┌───┤ · ╟─────────┘ ╔═══╗ ┌───────────────┐   ├─┤ ‹ ╟─┤ ‹ ║
           │   ╘═╤═╝           ║ 1 ║ │ ╓───╖         │   │ ╘═╤═╝ ╘═╤═╝
           │     │             ╚═╤═╝ └─╢ ⬗ ╟─┐       │ ┌─┴─╖ │   ┌─┴─╖
           │     │ ┌───╖ ┌───╖ ┌─┴──╖  ╙─┬─╜ │       └─┤ · ╟─┘ ┌─┤ ‹ ╟─┐
           │   ┌─┴─┤ + ╟─┤ ♯ ╟─┤ << ║    │   │         ╘═╤═╝   │ ╘═══╝ │
           │   │   ╘═╤═╝ ╘═══╝ ╘═╤══╝    │ ┌─┴─╖         │     │       │
           │   │   ┌─┴─╖         └───────┴─┤ · ╟───┐   ┌─┴─╖   │       │
           │   └───┤ ? ╟─┐                 ╘═╤═╝ ┌─┴───┤ · ╟─┐ │       │
           │       ╘═╤═╝ ├───────────────────┘   │     ╘═╤═╝ │ │       │
           │ ┌───╖ ┌─┴─╖ │               ┌─────┐ │ ┌───╖ │   │ │       │
           └─┤ › ╟─┤ › ║ │       ┌───╖ ┌─┴─╖   │ └─┤ − ╟─┘   │ │       │
             ╘═╤═╝ ╘═╤═╝ │     ┌─┤ ‼ ╟─┤ ‼ ║   │   ╘═╤═╝     │ │       │
               │   ┌─┴─╖ │     │ ╘═╤═╝ ╘═╤═╝ ┌─┴─╖ ┌─┴─╖     │ │       │
               ┌───┤ · ╟─┘     │ ┌─┴─╖   ├───┤ · ╟─┤ … ║     │ │       │
     ┌───┐     │   ╘═╤═╝       └─┤ · ╟───┘   ╘═╤═╝ ╘═╤═╝     │ │       │
     │ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖         ╘═╤═╝         │  ╔══╧═╗     │ │       │
     │ │ ʭ ╟─┤ ? ╟─┤ › ╟─┐ ╔═══╗ ╔═╧═╕         │  ║ 32 ║     │ │       │
     │ ╘═╤═╝ ╘═╤═╝ ╘═══╝ │ ║ 0 ╟─╢   ├─────────┘  ╚════╝     │ │       │
     │ ┌─┘   ┌─┴─╖       │ ╚═══╝ ╚═╤═╛                       │ │       │
     │ └─┬───┤ ʭ ╟─┐   ┌─┴─╖     ┌─┴─╖                       │ │       │
     │ ┌─┴─╖ ╘═══╝ ├───┤ · ╟─────┤ ɱ ║                       │ │       │
     └─┤ · ╟───────┘   ╘═╤═╝     ╘═╤═╝                       │ │       │
       ╘═╤═╝             │       ┌─┴─╖                       │ │       │
         │               └─────┬─┤ ◇ ╟───────────────────────┘ │       │
         │                     │ ╘═══╝                       ┌─┴─╖     │
         │                     └─────────────────────────────┤ · ╟─────┘
         │                                                   ╘═╤═╝
         └─────────────────────────────────────────────────────┘

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 horizontal

Ini 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.

                           ┌──────────────────────────────────┬───────────────────────┐
                           │     ┌──────────────────┐       ┌─┴─╖                   ┌─┴─╖
                           │     │    ┌───────────┐ └───────┤ · ╟───┬───────────────┤ · ╟─────────────┐
                           │     │  ┌─┴─╖         │         ╘═╤═╝   │               ╘═╤═╝             │
                           │     │  │ ‹ ╟───┐     │         ┌─┴─╖ ┌─┴─╖               │               │
                           │     │  ╘═╤═╝ ┌─┴─╖   └─────────┤ · ╟─┤ · ╟─────────┐     │               │
                           │     │    ├─┐ │ ‹ ╟───┐         ╘═╤═╝ ╘═╤═╝         │     │               │
                           │     │    └─┘ ╘═╤═╝ ┌─┴─╖ ╓───╖ ┌─┴─╖   │           │     │               │
                           │     │          │   │ ‹ ╟─╢ ❖ ╟─┤ ‹ ║   │           │     │               │
                           │     │          │   ╘═╤═╝ ╙───╜ ╘═╤═╝ ┌─┴─╖ ┌─┐     │     │               │
                           │     │          │     │           └───┤ ‹ ║ └─┤     │     │               │
                           │     │          │     │               ╘═╤═╝ ┌─┴─╖   │     │               │
                           │     │          │     │                 └───┤ ‹ ║   │     │               │
                           │     │          │     └─────────────────┐   ╘═╤═╝   │     │               │
                           │     │          │                     ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖             │
                           │     │          │      ┌──────────────┤ · ╟─┤ · ╟─┤ · ╟─┤ · ╟──────┐      │
                           │     │          └──────┤              ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝      │      │
                           │   ┌─┴─╖             ┌─┴─╖            ┌─┴─╖   │     │     │        │      │
                           │ ┌─┤ · ╟─────────────┤ · ╟────────────┤ · ╟───┘     │     │        │      │
                           │ │ ╘═╤═╝             ╘═╤═╝            ╘═╤═╝         │     │        │      │
                           │ │   │                 │         ┌────╖ │         ┌─┴─╖   │        │      │
       ╔═══╗ ┌────╖        │ │   │                 │       ┌─┤ << ╟─┴─────────┤ · ╟─┐ │        │      │
       ║ 1 ╟─┤ << ╟────────┘ │   │                 │       │ ╘═╤══╝           ╘═╤═╝ │ │        │      │
       ╚═══╝ ╘═╤══╝ ╔════╗   │   │               ┌─┴─╖     │ ┌─┴─╖              │   │ │     ┌──┴──┐   │
             ┌─┴─╖  ║ 32 ╟─┐ │   │ ┌─────────────┤ · ╟───┐ │ │ ♯ ║              │   │ │   ┌─┴─╖ ┌─┴─╖ │
             │ ♯ ║  ╚════╝ │ │   └─┤ ┌───╖       ╘═╤═╝   │ │ ╘═╤═╝ ┌───╖ ╔════╗ │   │ │ ┌─┤ ? ╟─┤ < ║ │
             ╘═╤═╝   ┌───╖ │ │     └─┤ − ╟─────────┴─┐   │ │   └───┤ … ╟─╢ 32 ║ │   │ │ │ ╘═╤═╝ ╘═╤═╝ │
               └─────┤ … ╟─┘ │       ╘═╤═╝         ┌─┴─╖ │ └───┐   ╘═╤═╝ ╚════╝ │   │ │ │ ┌─┴─╖   ├───┘
                     ╘═╤═╝   │ ┌───╖ ┌─┴─╖ ┌───────┤ · ╟─┴─┐ ╔═╧═╗ ┌─┴─╖ ┌──────┘   │ │ └─┤ · ╟───┘
                       │   ┌─┴─┤ ʭ ╟─┤ ȶ ║ │ ┌───╖ ╘═╤═╝   │ ║ 1 ║ │ ⁞ ║ │ ┌────────┘ │   ╘═╤═╝
                     ┌─┴─╖ │   ╘═╤═╝ ╘═╤═╝ └─┤ > ╟───┴─┐   │ ╚═══╝ ╘═╤═╝ │ │   ┌──────┘     └────┐
                     │ ⁞ ║ │   ┌─┴─╖ ┌─┴─╖   ╘═╤═╝     │ ┌─┴─╖ ┌───╖ │   │ │ ┌─┴─╖ ┌───╖ ┌───╖ ┌─┴─╖
                     ╘═╤═╝ └───┤ ? ╟─┤ · ╟─────┴─┐     │ │ − ╟─┤ ȶ ╟─┴─┐ │ │ │ + ╟─┤ ♯ ╟─┤ › ╟─┤ › ║
                     ┌─┴─╖     ╘═╤═╝ ╘═╤═╝       │     │ ╘═╤═╝ ╘═╤═╝   │ │ │ ╘═╤═╝ ╘═══╝ ╘═╤═╝ ╘═╤═╝
┌────────────────────┤ · ╟───────┴───┐ └─┐     ┌─┴─╖   └───┘   ┌─┴─╖   │ │ └───┘           │     │
│                    ╘═╤═╝         ┌─┴─╖ │   ┌─┤ · ╟───────────┤ · ╟───┘ │                       │
│ ┌────────────────┐   │   ┌───────┤ · ╟─┘   │ ╘═╤═╝           ╘═╤═╝     │                       │
│ │ ╔════╗ ┌───╖ ┌─┴─╖ └───┤ ┌───╖ ╘═╤═╝     │   │               │     ┌─┴───┐                   │
│ │ ║ 32 ╟─┤ ‼ ╟─┤ · ╟───┐ └─┤ ʭ ╟───┘       │   │             ┌─┴─╖ ┌─┴─╖ ┌─┴─╖                 │
│ │ ╚════╝ ╘═╤═╝ ╘═╤═╝   │   ╘═╤═╝     ┌─────┘   │             │ ʭ ╟─┤ · ╟─┤ ? ╟─┐               │
│ │        ┌─┴─╖ ╔═╧═╕ ╔═╧═╕ ┌─┴─╖   ┌─┴─╖       │             ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ │               │
│ │        │ ‼ ╟─╢   ├─╢   ├─┤ ʑ ╟───┤ ʭ ║     ┌─┴─╖             └─────┘     │   │               │
│ │        ╘═╤═╝ ╚═╤═╛ ╚═╤═╛ ╘═╤═╝   ╘═╤═╝ ┌───┤ · ╟─────────────────────────┘   │               │
│ └──────────┘     │   ╔═╧═╗   │       ├───┘   ╘═╤═╝                             │               │
│                  └───╢ 0 ║ ┌─┴─╖   ┌─┴─╖       └───────────────────────────────┘             ┌─┴─╖ ╔═══╗
│                      ╚═══╝ │ ȶ ╟───┤ · ╟─────────────────────────────────────────────────────┤ › ╟─╢ 0 ║
│                            ╘═╤═╝   ╘═╤═╝                                                     ╘═══╝ ╚═══╝
│                            ┌─┴─╖   ┌─┴─╖
│                      ┌─────┤ ? ╟─┐ │ ɕ ║
│                    ┌─┴─╖   ╘═╤═╝ │ ╘═╤═╝
│            ┌───╖ ┌─┤ < ╟───┬─┘   │   │
└────────────┤ ɕ ╟─┤ ╘═══╝ ┌─┴─╖   │   │
             ╘═══╝ └───────┤ · ╟───┘   │
                           ╘═╤═╝       │
                             └─────────┘

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 string

Ini adalah fungsi lain yang berguna yang akan saya tambahkan ke perpustakaan. Diberikan string, itu memberi Anda urutan malas berisi setiap kode karakter.

                                        ╓───╖
                                        ║ ↯ ║
                                        ╙─┬─╜
                           ┌──────────────┴────────────────┐
                           │      ┌─┐          ╔═══╗ ┌───╖ │
                           │      └─┤     ┌────╢ 0 ╟─┤ ≠ ╟─┴─┐
                    ┌──────┴─┐ ┌┐ ╔═╧═╕ ┌─┴─╖  ╚═══╝ ╘═╤═╝   │
                    │        ├─┤├─╢   ├─┤ ? ╟──────────┤     │
                    │        │ └┘ ╚═╤═╛ ╘═╤═╝ ╔════╗ ┌─┴─╖   │
                    │ ╔══════╧══╗ ┌─┴─╖   │   ║ −1 ╟─┤ ≠ ╟───┘
                    │ ║ 2097151 ║ │ ↯ ║       ╚════╝ ╘═══╝
                    │ ╚═════════╝ ╘═╤═╝
                    │             ┌─┴──╖ ╔════╗
                    └─────────────┤ >> ╟─╢ 21 ║
                                  ╘════╝ ╚════╝

anding 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 berlian

Fungsi ini mengambil satu karakter dan mengembalikan struktur untuk tumpukan vertikal yang mewakili satu karakter itu.

                                   ╔════╗
                                   ║ 96 ║  ╓───╖
                                   ╚══╤═╝  ║ ⬖ ║
                        ┌───╖ ┌───╖ ┌─┴─╖  ╙─┬─╜
                    ┌───┤ ɗ ╟─┤ Ḟ ╟─┤ − ║    │
                    │   ╘═╤═╝ ╘═══╝ ╘═╤═╝    │
                    │   ┌─┴─╖         ├──────┘  ┌──┐
                    │   │ ɹ ║         │     ┌───┤  │
                    │   ╘═╤═╝   ┌─────┘     │   │  │
                  ╔═╧═╗ ┌─┴─╖ ┌─┴─╖         │  ┌┴┐ │
                  ║ 1 ╟─┤   ╟─┤ · ╟─────┐ ╔═╧═╕└┬┘ │
                  ╚═══╝ └─┬─╜ ╘═╤═╝   ┌─┴─╢   ├─┘ ┌┴┐
            ┌───────────┐ │     └─┐   │   ╚═╤═╛   └┬┘
          ┌─┴─╖         │ │ ┌───╖ │   └─┐ ╔═╧═╕ ┌──┴─╖ ╔═══╗
    ┌─────┤ · ╟───┐     │ └─┤ ◆ ╟─┘   ┌─┴─╢   ├─┤ << ╟─╢ 1 ║
 ┌──┴─┐   ╘═╤═╝   │     │   ╘═╤═╝     │   ╚═╤═╛ ╘════╝ ╚═╤═╝
 │ ┌──┴─╖ ┌─┴─╖ ╔═╧═╕ ╔═╧═╕ ┌─┴─╖   ┌─┴─╖ ┌─┴─╖        ┌─┴─╖
 │ │ >> ╟─┤ ⬗ ╟─╢   ├─╢   ├─┤ ʩ ╟───┤ · ╟─┤ ʑ ╟────────┤ ⸗ ║
 │ ╘══╤═╝ ╘═╤═╝ ╚═╤═╛ ╚═╤═╛ ╘═╤═╝   ╘═╤═╝ ╘═╤═╝        ╘═╤═╝
 │  ╔═╧═╗  ┌┴┐    │   ╔═╧═╗   │       └─────┘          ╔═╧═╗
 │  ║ 1 ╟─┐└┬┘    └───╢ 0 ║                            ║ 0 ║
 │  ╚═══╝ ├─┘         ╚═══╝                            ╚═══╝
 └────────┘

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 dan or0/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.

                       ┌─────┐
                       │   ┌─┴─╖
                       │   │ ⬖ ║
               ╔═══╗ ╔═╧═╕ ╘═╤═╝
               ║ 0 ╟─╢   ├───┘
               ╚═╤═╝ ╚═╤═╛ ┌───╖ ┌───╖ ╔═══╗
                 └─┐   └───┤ ɱ ╟─┤ ↯ ╟─╢   ║
       ┌─────────┐ └─────┐ ╘═╤═╝ ╘═══╝ ╚═══╝
       │       ┌─┴─╖     │ ┌─┴─╖
       │   ┌───┤ · ╟───┐ └─┤   ╟─┐
       │   │   ╘═╤═╝   │   └─┬─╜ │
       │ ┌─┴─╖ ╔═╧═╕ ╔═╧═╕ ┌─┴─╖ │
       │ │ ❖ ╟─╢   ├─╢   ├─┤ ʩ ╟─┘
       │ ╘═╤═╝ ╚═╤═╛ ╚═╤═╛ ╘═╤═╝
       └───┘   ╔═╧═╗   │   ┌─┴─╖ ┌─┐
               ║ 0 ╟───┘ ┌─┤ ‹ ╟─┴─┘
               ╚═══╝     │ ╘═══╝
                       ┌─┴─╖ ┌─┐
                     ┌─┤ ‹ ╟─┴─┘
                     │ ╘═══╝
      ╔════╗ ┌───╖ ┌─┴─╖ ┌─┐
      ║ 10 ╟─┤ ʝ ╟─┤ ‹ ╟─┴─┘
      ╚════╝ ╘═╤═╝ ╘═══╝
               │

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:

crusaders

Output (butuh 9 detik untuk menghitung; tidak dapat memposting di sini karena batas ukuran).

Timwi
sumber