Tuliskan program kuadrat yang menampilkan berapa kali telah "dibuka"

22

Pertimbangkan blok teks persegi, N karakter lebar dengan N tinggi, untuk beberapa bilangan bulat ganjil N lebih besar dari 1.

Sebagai contoh, mari N = 5 dan teksnya menjadi:

MLKJI
NWVUH
OXYTG
PQRSF
ABCDE

Perhatikan bahwa ini adalah alfabet (selain Z) yang berputar berlawanan arah jarum jam dari sudut kiri bawah. Ini seperti karpet yang digulung.

Alfabet spiral

"Buka gulungan" teks dengan seperempat putaran searah jarum jam jadi FGHIberada pada tingkat yang sama dengan ABCDEhasil di:

     PONM
     QXWL
     RYVK
     STUJ
ABCDEFGHI

Buka gulungan ini dapat dilakukan 7 kali lagi hingga teks menjadi satu baris:

         SRQP
         TYXO
         UVWN
ABCDEFGHIJKLM

             UTS
             VYR
             WXQ
ABCDEFGHIJKLMNOP

                WVU
                XYT
ABCDEFGHIJKLMNOPQRS

                   XW
                   YV
ABCDEFGHIJKLMNOPQRSTU

                     YX
ABCDEFGHIJKLMNOPQRSTUVW

                       Y
ABCDEFGHIJKLMNOPQRSTUVWX

ABCDEFGHIJKLMNOPQRSTUVWXY

Tantangan

Tantangannya adalah untuk menulis sebuah program yang merupakan blok teks N × N yang menghasilkan berapa kali ia "membuka gulungannya" dengan seperempat putaran ketika ia disusun kembali ke dalam pola membuka gulungan dan menjalankannya.

Sebenarnya ada dua kontes di sini: (semoga tidak akan terlalu berantakan)

  1. Lakukan ini dengan N. terkecil (hingga batas N = 3)
  2. Lakukan ini dengan N. terbesar (tanpa batas)

Tidak akan ada jawaban yang diterima tetapi pemenang di masing-masing kategori ini akan menerima setidaknya 50 perwakilan hadiah dari saya. Dalam kasus ikatan jawaban tertua menang.

Contoh

Jika blok kode Anda

MyP
rog
ram

menjalankannya seperti seharusnya output 0.

Lari

   rM
   oy
ramgP

harus menghasilkan 1.

Lari

     or
ramgPyM

harus menghasilkan 2.

Lari

       o
ramgPyMr

harus menghasilkan 3.

Akhirnya, menjalankan ramgPyMroseharusnya menghasilkan 4.

Detail

  • Outputnya harus dicetak ke stdout (atau alternatif terdekat) dengan sendirinya. Tidak ada input.
  • Anda hanya dapat menggunakan ASCII yang dapat dicetak (kode hex 20 hingga 7E, yang termasuk spasi) dalam kode Anda.
  • Spasi mengisi ruang kosong dalam pengaturan membuka gulungan. (Kecuali jika Anda membuka gulungan ke kiri.)
  • Hanya pengaturan dari sepenuhnya kuadrat ke sepenuhnya datar perlu memiliki output yang valid. Tidak ada pengaturan lain yang akan dijalankan.
  • Anda mungkin tidak membaca sumber Anda sendiri.
  • Anda dapat menggunakan komentar.
  • N = 1 dikecualikan karena dalam banyak bahasa program 0akan berfungsi.
  • Jika diinginkan, Anda dapat membuka gulungan ke kiri dan bukan ke kanan. Jadi misalnya

    MyP
    rog
    ram
    

    menjadi

    Pg
    yo
    Mrram
    

    dan seterusnya. Tidak ada ruang tambahan yang ditambahkan saat menggulung dengan cara ini. Garis hanya berakhir

(Terkait: Tulis Program Rectangular yang Menghasilkan Jumlah Kali Diputar )

Hobi Calvin
sumber
Sebelum saya membaca paragraf "tantangan", saya mengharapkan sebuah tantangan untuk menulis sebuah program yang hasilnya terbuka sendiri
John Dvorak
1
mengapa N harus aneh?
John Dvorak
1
@ JanDvorak Saya kira N tidak harus aneh, tetapi itu membuat spiral lebih standar. Tetap seperti itu tetapi merasa bebas untuk mengirim N = 2 sebagai komentar jika Anda menemukannya.
Calvin Hobbies
8
Hanya sebuah ide: Membuka gulungan "karpet" ke kanan menciptakan banyak baris dimulai dengan spasi putih, menghilangkan bahasa seperti Python. Jika Anda mengizinkan membuka gulungan ke kiri, tidak perlu ruang kosong tambahan dan Python (secara teoritis) mungkin.
Falko
5
Apakah Anda memiliki buku ajaib dengan ide-ide tantangan besar yang tak terbatas? Bagaimana lagi Anda terus menghadapi tantangan yang menarik?
Justin

Jawaban:

27

Golfscript, N <- [5,7 ..]

.   .
 . . 
 ..  
.  .#
],9\-

Sepenuhnya terbuka:

],9\-#  .   .  .  . . ...

Penjelasan:

  • . (beberapa kali) - duplikat input
  • ] - kumpulkan tumpukan menjadi satu array
  • , - panjangnya
  • 9\- - kurangi dari 9
  • # - komentar garis

Whitespace adalah NOP, tetapi NOP lainnya akan bekerja dengan baik.

Digulung penuh, ia menggunakan sembilan salinan input (konten diabaikan) sebagai tumpukan; 9 - 9 = 0; belum dibuka.

Setiap membuka gulungan menyembunyikan satu titik lagi (duplikat) di belakang komentar, menyusutkan tumpukan satu kali, menambah output.

Sepenuhnya terbuka, hanya menggunakan input (konten diabaikan) sebagai tumpukan; 9 - 1 = 8; sudah dibuka 8 kali.

Pendekatan yang sama berfungsi untuk N> 4: Ubah 9ke nilai 2 * N + 1 yang sesuai, kemudian rentangkan pola titik (duplikat) menggunakan pola spiral yang sama yang memastikan tepat satu titik tidak terbuka selama setiap pembukaan gulungan.

John Dvorak
sumber
Nah, kecuali seseorang menemukan N = 3, ini akan menjadi jawaban yang menang di kedua kategori.
Calvin Hobbies
3
@ CalvinHobbies, haruskah saya menjadi total kontol dan memposting solusi yang tidak terbuka juga? :-)
John Dvorak
Kenapa tidak. Jawaban lain sepertinya tidak mungkin: P
Calvin Hobi
1
Mengapa tidak memilih yang bisa dibuka di kedua arah? :)
Beta Decay
@BetaDecay hmm ... :-)
John Dvorak
13

GolfScript, N = 4

Ini benar gulungan sebagai spec asli.

.. . 
...# 
.#.~
],8-

Berikut adalah daftar gulungannya:

    ...
    #..
    ..
],8-~#.

       .#.
       ...
],8-~#. ..

          ..
          .#
],8-~#. ....

            ..
],8-~#. ....#.

              .
],8-~#. ....#..

],8-~#. ....#...

Coba di sini

Pengoptimal
sumber
Bagaimana pendapat Anda tentang pengaturan ini?
haskeller bangga
3
@proudhaskeller Lebih baik jika Anda tidak tahu ...
Pengoptimal
8
Apakah Anda mencari solusi dengan kasar?
haskeller bangga
Tantangan khusus: dapatkah Anda membuat satu dari .dan #yang lain?
John Dvorak
Saya suka trailing ~. Mungkin saya bisa mencurinya untuk N = 3?
John Dvorak
9

APL, N = 3

201
340
5|0

Belum dibuka:

   32
   40
5|001

     43
5|00102

       4
5|001023

5|0010234

Cobalah online.

Ini menghitung sisa dari angka itu dibagi dengan 5. Hanya hasil dari baris terakhir yang dicetak.

APL, N = 2

⍬∞
≡0

Belum dibuka:

  ⍬
≡0∞

≡0∞⍬

Cobalah online.

mengembalikan kedalaman (jangan dikelirukan dengan dimensi atau panjang array):

  • 0bukan sebuah array. Jadi kedalamannya 0.
  • 0∞adalah array dengan dua item 0dan (tak terbatas). Ini memiliki kedalaman 1.
  • 0∞⍬memiliki item lain , yaitu array kosong dengan kedalaman 1. Jadi 0∞⍬memiliki kedalaman 2.

Kedua program ini juga berfungsi dalam penerjemah online. Saya tidak yakin apakah yang kemudian secara sintaksis benar.

⍬0
≡∞


⍬¯
≡0

APL, untuk setiap N> = 4

Untuk N = 4:

∞  ∞
 ∞∞
∞ ∞
⍴1↓∞

Sepenuhnya terbuka:

⍴1↓∞  ∞  ∞ ∞ ∞∞∞

Untuk N = 5:

∞   ∞
 ∞ ∞
 ∞∞
∞  ∞
⍴1↓ ∞

Sepenuhnya terbuka:

⍴1↓ ∞   ∞   ∞  ∞  ∞ ∞ ∞∞∞

1↓menghapus item dalam array. Ini juga mengembalikan array kosong jika argumennya skalar. mendapatkan panjang array.

jimmy23013
sumber
Ada penjelasan?
haskeller bangga
@proudhaskeller Diedit.
jimmy23013
Anda idealnya dapat menggunakan logika kedalaman yang sama untuk N. apa pun. Terima kasih untuk APL
Pengoptimal
@Optimizer Tidak semudah itu. Hal-hal sebelum baris terakhir masih harus benar secara sintaksis. Jadi saya tidak dapat menggunakan sebagian besar fungsi atau karakter tanda baca lainnya ()[]karena mereka akan muncul di tempat yang tidak diinginkan.
jimmy23013
Maksud saya seperti: `⍬ \ n⍬⍬0 \ n≡ ∞` (Tidak persis seperti itu, tetapi Anda mendapatkan ide)
Pengoptimal