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.
"Buka gulungan" teks dengan seperempat putaran searah jarum jam jadi FGHI
berada pada tingkat yang sama dengan ABCDE
hasil 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)
- Lakukan ini dengan N. terkecil (hingga batas N = 3)
- 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 ramgPyMro
seharusnya 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
0
akan 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 )
sumber
Jawaban:
Golfscript, N <- [5,7 ..]
Sepenuhnya terbuka:
Penjelasan:
.
(beberapa kali) - duplikat input]
- kumpulkan tumpukan menjadi satu array,
- panjangnya9\-
- kurangi dari 9#
- komentar garisWhitespace 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
9
ke 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.sumber
GolfScript, N = 4
Ini benar gulungan sebagai spec asli.
Berikut adalah daftar gulungannya:
Coba di sini
sumber
.
dan#
yang lain?~
. Mungkin saya bisa mencurinya untuk N = 3?APL, N = 3
Belum dibuka:
Cobalah online.
Ini menghitung sisa dari angka itu dibagi dengan 5. Hanya hasil dari baris terakhir yang dicetak.
APL, N = 2
Belum dibuka:
Cobalah online.
≡
mengembalikan kedalaman (jangan dikelirukan dengan dimensi atau panjang array):0
bukan sebuah array. Jadi kedalamannya 0.0∞
adalah array dengan dua item0
dan∞
(tak terbatas). Ini memiliki kedalaman 1.0∞⍬
memiliki item lain⍬
, yaitu array kosong dengan kedalaman 1. Jadi0∞⍬
memiliki kedalaman 2.Kedua program ini juga berfungsi dalam penerjemah online. Saya tidak yakin apakah yang kemudian secara sintaksis benar.
APL, untuk setiap N> = 4
Untuk N = 4:
Sepenuhnya terbuka:
Untuk N = 5:
Sepenuhnya terbuka:
1↓
menghapus item dalam array. Ini juga mengembalikan array kosong jika argumennya skalar.⍴
mendapatkan panjang array.sumber
()[]
karena mereka akan muncul di tempat yang tidak diinginkan.