“Rubah Coklat Cepat” yang bersemangat, “Melompat” di sepanjang Groovy Spiral

12

pengantar

Tulis sebuah program untuk menampilkan spiral pangram keluar yang terkenal berikut aturan yang diberikan.

Tantangan

Sebuah pangram adalah kalimat menggunakan setiap huruf dari alfabet diberikan setidaknya sekali. Salah satu pangram yang paling terkenal adalah pangram yang digunakan secara luas di penampil font Windows, yaitu " Rubah cokelat cepat melompati anjing yang malas ". Tantangannya adalah menghasilkan spiral berdasarkan teks ini.

Tugas Anda adalah menghasilkan teks yang tepat ini:

heeeeellllllllllllazzzzzzzzzzz
hummmmmmmmmmmmmppppppppppppppy
hubrrrrrrrrrrrrrrrrrrooooooosy
hukyddddoooooooooooooooggggwsy
hukyveeeeerrrrrrrrrrrrrrrrtwsy
hukyvxjjjjjjjjjjuuuuuuuuuttwsy
hukyvxkbbrrrrrrrrrrrrrrrmttwsy
hukyvxkogggggggttttttttomttwsy
tukyvokoellllllllllllahomttwsy
tukyvokoeovvvvvvvvvvvzhomttwsy
tukyvocoeoummmmmmmmmezhomttwsy
tukyvocoeoufooooooopezhomttwsy
tukyvocohoufroooooxpezhomttwsy
tukyvoiohoufrquuuwxpezhomttwsy
tucyvoiohoufbqttiwxpezhomttwsy
tucyvoiohoufbeehiwxprzhomttwsy
tucyvoiohoufkccciwxprzeomttwsy
tjiyvoidhounnnnnnwxprzeomttwsy
tjiyvoidhojjjjjjjjxprzeomttwsy
tjiyvoidhssssssssssprzeopttwsy
tjiyvoidttttttttttttrzeopttwsy
tjiyvoiyyyyyyyyyyyyyyzqopttwoy
tjiyvouuuuuuuuuuuuuuuuqwpttwoy
tjiyvffffnnnnnnnnnnnnnnwpttwoy
tjiyossssssssssssssssssspthwoy
tjizzzzalllllllllllleeeeehhwoy
tjuuqqqqqqqqqqqqqqqqqeeeeehnod
txxxxxoooooooooooooooffffffnod
reeeeevvvvvvvvvvvvvvvvvvvvvvod
       gggggggoooooooooooooood

Berikut adalah bagaimana ini dihasilkan,

  • Ada rubah yang bersemangat yang menikmati pangram "Rubah cokelat cepat melompati anjing malas". Suatu hari dia berada di tengah spiral luar dan memutuskan untuk melompat dan melukis bersama.
  • Dia ingin membaca pangram dari awal hingga akhir, dan jika sebuah huruf adalah huruf ke-n dalam alfabet dia ingin melukisnya sebanyak n kali.
  • Namun, rubah tidak pandai berbelok di tikungan, sehingga setelah mencapai setiap sudut ia juga harus berhenti dan beralih ke huruf berikutnya.
  • Dia juga memutuskan untuk mengulang tiga kali pangram untuk menekankan bahwa ia adalah yang cepat rubah cokelat.
  • Tugas Anda adalah menunjukkan bagaimana bentuk spiral setelah rubah melukis semua huruf itu.

(Versi polos tanpa bercerita)

  • Pangram yang terkenal "Si rubah cokelat cepat melompati anjing yang malas" diulang tiga kali, dengan spasi dihilangkan dan semua huruf dalam huruf kecil, untuk menghasilkan

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • Spiral dimulai dari pusat dan dimulai dengan huruf "t", itu dimulai dengan pergi ke kanan, dan pergi ke luar searah jarum jam. Jika karakter saat ini adalah huruf ke-n dalam alfabet, maka ia beralih ke karakter berikutnya kapan saja

    • spiral mencapai sudut, atau
    • huruf saat ini dicetak tepat n kali.

Untuk menggambarkannya dengan lebih baik, saya akan menjelaskan bagaimana spiral terkait dengan tiga kata pertama "thequickbrown" dihasilkan.

 rooooo
 rquuuw
 bqttiw
 beehiw
 kccciw
nnnnnnw

Rubah mulai dari "t", ke kanan, mencapai sudut 1, melukisnya dengan "t" dan kemudian beralih ke "h" dan turun, mencapai sudut 2, beralih ke "e" dan pergi ke kiri, mencapai Sudut ke-3, beralih ke "q" dan naik, mencapai sudut ke-4, beralih ke "u" dan ke kanan, mencapai sudut dan beralih ke "i", turun, mencapai sudut dan beralih ke "c", pergi kiri, berhasil melukis 3 "c" sebelum mencapai sudut berikutnya , beralih ke "k" dan pergi ke kiri , langsung mencapai sudut, beralih ke "b" dan naik, melukis 2 "b" sebelum mencapai sudut selanjutnya, beralih ke "r"dan terus ke atas , mencapai sudut dan beralih ke "o", ke kanan, lalu "w", ke bawah, "n", ke kiri.

Spesifikasi

  • Anda dapat mengambil input opsional yang berisi segala bentuk standar string

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • Output Anda harus diformat sebagai string, dan harus pergi ke STDOUT bukan file atau STDERR, dengan baris baru ditempatkan dengan benar. Menuju dan mengikuti garis kosong tidak masalah. Ruang judul dan trailing di setiap baris diizinkan, tetapi harus konsisten. Jadi, jika Anda menambahkan 5 spasi sebelum satu baris teks yang diberikan, Anda harus menambahkan tepat 5 spasi sebelum setiap baris sehingga spiral terlihat sama.

  • Ini adalah , jumlah byte terendah yang menang.

  • Seperti biasa, celah default berlaku di sini.


Penjelasan dipersilahkan, meskipun tidak perlu.

Judul diedit untuk menjadikannya sebuah pangram per komentar oleh caird coinheringaahing.

Anjing malas terlalu malas untuk muncul dalam cerita.

Saya bertujuan untuk menciptakan tantangan string di mana surat untuk keluaran tidak dapat dihitung dengan fungsi sederhana dari koordinat.

Weijun Zhou
sumber
2
Sayang sekali judulnya bukan pangram
caird coinheringaahing
@cairdcoinheringaahing Poin bagus, saya akan coba memunculkannya. Ada saran?
Weijun Zhou
4
@cairdcoinheringaahing Diperbarui
Weijun Zhou
Poin minor: bukankah 'h' di bagian pertama 'the' diulang dua kali, bukan 't'?
mudkip201
@ mudkip201 Sudutnya dicat dengan huruf aslinya sebelum beralih ke karakter berikutnya. Mungkin saya harus mengklarifikasi.
Weijun Zhou

Jawaban:

5

Stax , 35 34 33 32 byte

é╛îá%ⁿ┌○iê}→Ug=╩◙╘Ç⌐)QX↑L╓₧╗▌╧▬q

Jalankan dan debug secara online

Stax adalah bahasa yang telah saya kerjakan selama sekitar 6 bulan. Ini adalah golf publik pertama dengan itu. Mari kita mulai bisnis.

Stax biasanya ditulis dalam set karakter ASCII yang dapat dicetak. Pengiriman 34 byte ini dikemas ke dalam varian set karakter CP437. Representasi ascii yang sesuai adalah

't],{]_96-*~cHT,+nh%^(XUs&xH{rM}MF|<mr

Stax adalah bahasa berbasis tumpukan, tetapi memiliki dua tumpukan data, "utama" dan "input". Sebagian besar operasi menggunakan tumpukan utama, tetapi input dimulai pada tumpukan input. Instruksi Stax sebagian besar satu atau dua urutan karakter ascii. Sebagian besar dari mereka kelebihan beban, yang berarti perilaku mereka ditentukan oleh beberapa nilai teratas pada tumpukan.

Pada level tinggi, program ini membangun kisi dengan menambahkan string berulang kali ke baris terakhir. Ketika baris terakhir terisi, ia memutar grid searah jarum jam. Pada akhirnya, itu mencerminkan grid secara horizontal. Secara lebih rinci, program ini bekerja seperti ini.

't],{]_96-*~cHT,+nh%^(XUs&xH{rM}MF|<mr
't]                                         ["t"]
   ,                                        Pop from input, push to main ("thequick...")
    {                            F          For each character in input, execute block...
     ]_96-*                                 Produce string using character appropriate
                                                number of times (a=1, b=2, etc)
           ~                                Pop from main, push to input for use later
            cH                              Copy last row from grid.
              T                             Right-trim whitespace
               ,+                           Pop from input stack and append
                 nh%                        Get the width of the first row of the grid
                    ^                       Add 1
                     (                      Right-pad/truncate string to this length
                      X                     Store in the x register
                       Us&                  Overwrite last row of the grid with new value.
                          xH                Get the last element from x.
                                                Basically, the lower right corner.
                             {  }M         Conditionally execute block.  This will happen 
                                                when the bottom right corner isn't a space.
                              rM            Reverse and transpose (aka rotate clockwise)
                                  |<        Left-justify grid; give all rows equal size.
                                     m      For each row, execute the rest of the program
                                               and then print the result to output
                                      r     Reverse the row
rekursif
sumber
Wow, saya benar-benar kagum bahwa tantangan akan melihat penampilan publik pertama dalam bermain golf untuk bahasa golf. Terimakasih atas dukunganmu! Tertarik dengan Bahasa Bulan Ini? Saya berharap dapat melihat lebih banyak pengguna menggunakannya dan segera muncul di daftar kandidat!
Weijun Zhou
@ WeijunZhou: Maksudmu ini ? Saya tidak tahu itu hal sampai sekarang. Saya tidak akan keberatan nominasi. Sepertinya itu mungkin lebih cocok untuk bahasa yang lebih mapan, tapi saya tidak keberatan.
rekursif
Iya. Saya dapat mencalonkannya ketika sudah lebih mapan, seperti yang Anda katakan. Saya harap itu tidak akan lama.
Weijun Zhou
Karena "ruang tajuk di setiap baris tidak masalah asalkan konsisten", Anda dapat menyimpan byte lain jika diinginkan.
Weijun Zhou
1
Saya baru saja membuat pengiriman menggunakan Stax. Anda dapat memberikan saran tentang hal itu jika Anda mau. Sunting: Sungguh suatu kebetulan. Saya akan mencoba belajar dari kiriman Anda.
Weijun Zhou
11

Arang , 66 40 36 byte

≔²ηFS«F¬η«¶↷⊞υη≔⊕÷Lυ²η¶»F⊕⌕βι¿η«≦⊖ηι

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Sunting: Disimpan 16 byte dengan mengambil teks sebagai input. Penjelasan:

≔²η

Mulailah dengan 2 ts untuk beberapa alasan.

FS«

Lingkari semua huruf dalam pangram.

F¬η«

Sudahkah kita mencapai sudut?

Turun ke bawah (atau apa pun arah berikutnya) satu baris.

Putar arah cetak 90 ° searah jarum jam.

⊞υη≔⊕÷Lυ²η

Hitung panjang sisi selanjutnya.

¶»

Selesai memperbaiki posisi kursor. (Arang lebih suka sisi berakhir sebelum sudut, sehingga Anda memutar di sudut itu sendiri.)

F⊕⌕βι

Ulangi posisi huruf saat ini dalam alfabet.

¿η«

Jika kita belum mencapai sudut,

≦⊖ηι

Kurangi jumlah dan cetak huruf saat ini.

Neil
sumber
Terima kasih. Kerja bagus dan dijelaskan dengan baik. Kesalahan ketik kecil: ada kali -> tiga kali.
Weijun Zhou
Versi 43 byte ini juga dapat diterima sesuai dengan spesifikasi. tio.run/##rY7NTsMwEITPzlNYPW2kcumVExJCikRRhLgBh9Rx4oV4nfon/…
Weijun Zhou
1
@ WeijunZhou Terima kasih, saya tidak melihat klausa itu dalam pertanyaan sebelumnya.
Neil
2

Ruby , 217 212 209 208 byte

->s{s+=' '*8
x=0
a=[""]*30
i=14
a[i]=?t
l=->{a[i]=s[x]+a[i]}
r=->{a[i]+=s[x]}
(0..58).map{|g|c=0
(0..g/2).map{c>s[x].ord-97&&(x+=1;c=0)
c+=1
eval %w{r i+=1;r l i-=1;l}[g%4]+"[]"}
x+=1}
a[-1].slice!0
$><<a*$/}

Cobalah online!

Menghabiskan waktu yang cukup lama mengelola pointer, jadi mungkin ada ruang untuk bermain golf lebih banyak.

-5 byte: Tiga kali lipat pangram sebelum memasukkan. Terima kasih untuk Weijun Zhou .

-3 byte: Pad string input dan trim leg terakhir, alih-alih menghasilkan leg terakhir dari awal.

-1 byte: Gunakan &&sebagai ganti operator ternary dengan nilai sekali pakai.

Penjelasan:

->s{
  s += " " * 8                             # These spaces will show on the bottom row
  x = 0                                    # x is a pointer into s
  a = [""] * 30                            # a is an array of row strings
  i = 14                                   # i is a pointer into a
  a[i] = ?t                                # "Starts with two t's for some reason"
  l = ->{ a[i] = s[x]+a[i] }               # lambda to prepend char x to row i
  r = ->{ a[i] += s[x] }                   # lambda to append char x to row i
  (0..57).map{|g|                          # There are 58 "legs" to the spiral
    c = 0                                  # c is the print count of s[x]
    (0..g/2).map{                          # Leg g has g/2+1 characters
      c > s[x].ord-97 && (x+=1;c=0)        # Possibly switch to next letter
      c += 1
      eval %w{r i+=1;r l i-=1;l}[g%4]+"[]" # Call the appropriate lambda
    }
    x += 1                                 # Definitely switch to next letter
  }
  a[-1].slice!0                            # Remove the first char from the bottom row
  $> << a*$/                               # Join with newlines and print
}
benj2240
sumber
1
Pengiriman bagus dan dijelaskan dengan jelas. Saya menghargai penggunaan rdan llambdas. Berdasarkan jawaban saat ini kaki terakhir tampaknya menjadi pembuat masalah meskipun bukan ketika saya menulis cuplikan C saya untuk menghasilkan output sampel ...
Weijun Zhou
1
Tampaknya Anda dapat menyimpan s*=3semuanya dan juga menghilangkannya 0di ?:operator. tio.run/...
Weijun Zhou
1
@ WeijunZhou Ahh, terima kasih atas tipnya. Saya memang membutuhkan itu 0, atau Ruby akan menarik c+=1dari baris berikutnya dan hanya menjalankan sebagian besar waktu. Dan tantangan yang bagus!
benj2240
Kamu benar. Saya tidak terlihat cukup hati-hati. Terima kasih atas penghargaannya. Saya senang Anda menikmatinya.
Weijun Zhou