Awalan Prinsip oleh Program dalam Pola

16

Anda harus menulis sebuah program atau fungsi yang menghasilkan atau mengembalikan sebanyak mungkin Bab I dari Pangeran Kecil . Program atau fungsi Anda harus berupa blok kode M-by-N yang hanya berisi karakter ascii yang dapat dicetak (codepoint dari 32 hingga 126) dan baris baru di akhir setiap baris.

Anda hanya dapat menggunakan paling banyak 26 karakter pilihan Anda dari 96 karakter ascii yang dapat dicetak (dan baris baru di akhir baris).

Di setiap baris dan kolom setiap karakter harus berbeda mirip dengan teka-teki sudoku yaitu tidak boleh ada huruf di baris atau kolom dua kali.

Contoh kode kunci dengan M = 4, N = 3dan alphabet = {a,b,c,d,/,*}:

abcd
bcd*
*/ac

Rincian kode

  • Anda dapat memilih bentuk blok kode Anda (yaitu Mdan N).
  • Blok harus diisi dengan karakter sepenuhnya yaitu setiap baris harus memiliki panjang yang sama.
  • Baris tambahan di akhir baris terakhir adalah opsional.
  • Seperti yang tertulis di atas pada setiap baris dan kolom setiap karakter harus berbeda.

Rincian keluaran

  • Anda harus menampilkan atau mengembalikan awalan Bab I Pangeran Kecil tanpa output tambahan.
  • Jika Anda mencapai baris baru dalam teks, Anda dapat menyatakannya sebagai varian umum apa pun (\ r, \ n, \ r \ n) tetapi gunakan hanya satu saja dan hitung sebagai 1 byte untuk skor.
  • Baris tambahan tambahan tambahan bersifat opsional.

Skor Anda adalah panjang teks keluaran tidak termasuk baris baru jika ada. Skor yang lebih tinggi lebih baik.

Contoh jawaban

##Python3, score = 6

alphabet = `print('O\ce w)#X` (alphabet element count = 16)

    print('O\
    nce w')#X

Anda dapat memeriksa validitas kode Anda dengan program Python 3 (ideone) ini atau program CJam ini (online) yang disediakan oleh @ MartinBüttner.

randomra
sumber
Bukankah ini membatasi ukuran program hingga 26x26 paling banyak?
marinus
@marinus Ya.
randomra
Apakah Anda yakin ini bisa dipecahkan?
FUZxxl
@ FuZxxl pertanyaan berisi solusi referensi dengan skor 6. Mudah-mudahan pertanyaan ini dirancang sedemikian rupa sehingga tidak mungkin untuk mencetak semuanya (atau perlu tie breaker).
Martin Ender
@ MartinBüttner Ah! Saya lupa tentang bagian "awalan ...".
FUZxxl

Jawaban:

4

CJam, 47

"Once wh
en Imwas
msix yea
r2s oldm
I "N-'m/
Sc*2s-O"
saw"N/SO
o'aS"m2 
a"Oo2s-N
-S/OI*so
'yI-a"nr
wiNadI"c
cel'iaIS
/m2*Oo'x
 I-scel*
Ooel'c 2
2/'e*ON-

Cobalah online

Alfabet: "'*-/2INOSacdehilmnorswxy

Penjelasan:

"Once wh
en Imwas
msix yea
r2s oldm
I "         push this string
N-          remove newlines
'm/Sc*      replace m's with spaces (the c is redundant)
2s-         convert 2 to string and remove 2's
O           push an empty string
"
saw"        push this string
N/          split into lines (effectively removes the newline)
S           push a space
Oo          print empty string (no-op)
'a          push 'a'
S           push a space
"m2 
a"          push this string
Oo          print empty string (no-op)
2s-         convert 2 to string and remove 2's
N-          remove newline
S/          split by space (effectively removes the space)
OI*so       print an empty string repeated 18 times (no-op)
'y          push 'y'
I-          subtract 18 -> 'g'
a           wrap in array (string) -> "g"
"nr
wiNadI"     push this string
c           convert to (first) character -> 'n'
c           convert to character (no-op)
el          convert to lowercase (no-op)
'i          push 'i'
a           wrap in array (string) -> "i"
IS/         split " " into slices of length 18 -> [" "]
m           (acting as -) remove space strings from "i" (no-op)
2*          repeat "i" 2 times -> "ii"
Oo          print empty string (no-op)
'x          push 'x'
I-          subtract 18 -> 'f'
sc          convert to string and back to char (no-op)
el          convert to lowercase (no-op)
*           join "ii" with separator 'f' -> "ifi"
Oo          print empty string (no-op)
el          convert to lowercase (no-op)
'c          push 'c'
2 2/        divide 2 by 2 -> 1
'e          push 'e'
*           repeat 'e' 1 time -> "e"
O           push empty string
N-          remove newlines (no-op)
aditsu
sumber
7

Pip , skor = 38

eyli:
"Once
when0
I was
si01x
year5
old I
0sMw1
1M 0"
X1RMh
Rnsxy
iR:'M
'aiR 
:5'si

Alfabet: "'015:IMORXacdehilnorswxy

(Saya yakin akan benci untuk mencoba ini dalam bahasa pemrograman yang nyata .)

Penjelasan:

eyl      Statements consisting of single variables are no-ops
i:       Assign to i the following:
"Once
when0
I was
si01x
year5
old I
0sMw1
1M 0"    ...this string
X1       ...repeated once (no-op to get alignment right)
RMh      ...with all 1s and 0s removed (h is preinitialized to 100)
Rns      ...and all newlines replaced with spaces.
xy       More no-ops
iR:'M'a  Replace every M with a, assigning result back to i
iR:5's   Replace every 5 with s, assigning result back to i
i        Auto-print i
DLosc
sumber
4

Python 3, skor = 11

Ini adalah masalah yang sangat sulit untuk Python, karena pembatasan pengulangan karakter pada garis atau kolom membuatnya hampir mustahil untuk membuat lebih dari satu string literal. Oleh karena itu, berbagai cara untuk menggabungkan string sama sekali tidak berguna, karena Anda tidak dapat memulai string dengan cara yang bermanfaat. Inilah upaya terbaik saya:

x=chr 
print(
"Once\
 when"
,x(73)
)#prin

Perhatikan bahwa ada spasi di akhir baris pertama. Alias xuntuk chrdiperlukan untuk menghindari karakter yang sama berakhir di lebih dari satu kolom. Karakter komentar di bagian akhir bisa hampir apa saja.

Alfabetnya adalah 21 karakter yang dapat dicetak, ditambah baris baru (perhatikan spasi di awal):

 "#(),37=O\cehinprtwx

Output adalah:

Suatu ketika ketika saya

Blckknght
sumber
Perhatikan bahwa ini juga berlaku di Python 2. Terima kasih sudah menemukan jawaban yang bagus.
mbomb007
3

CJam, skor = 21

"Once wh
en I"N-o
N;S"was 
six y"N-

Alfabet: -;INOSacehinoswxy

Hanya untuk membuat bola bergulir; ini mungkin bisa dikalahkan dengan mudah.

Ypnypn
sumber
2

CJam, skor = 15

Saya sudah memiliki ide ini untuk sementara waktu sekarang tetapi saya belum punya waktu untuk duduk dan mengacak-acak sampai saya mendapatkan keunikan kolom yang diperlukan, jadi inilah versi bayi untuk saat ini:

 79c32"*)+#,105468:;=>Ibef
,:=>Ibcef";7 6)#*219435+80
50I=>;9)6#*127438+ ":,bcfe
),68:>=Ibcef";20 5#*17394+
6)4*b123,97>:c"80f5=+;e# I
"9>+f=e# ),*0481362bI:;5c7

Alfabet (26): " #)*+,0123456789:;=>Ibcef

Cobalah online .

Penjelasan

Ide dasarnya adalah menggunakan pengkodean dasar sehingga kita dapat mencetak lebih dari 26 jenis karakter. Kode intinya adalah

79c                             e#  Push "O"
85032995607801617394 28b        e#  Push array of indices, encoding using base 28
123,97>:c" I                    e#  Push "abcdefghijklmnopqrstuvwxyz I\n"
"+
f=                              e#  Map indices to chars

Perhatikan bahwa kami memperlakukan yang pertama "O"untuk "Once"secara terpisah karena memasukkannya ke dalam string kami akan memakan terlalu banyak alfabet kami. Jika kita mau, kita bisa mencoba memperpanjang string pengindeksan kita, tetapi karena tidak ada karakter huruf besar terjadi untuk sementara waktu selain "I"aku tidak terlalu peduli dengan ini.

Kita kemudian perlu membangun angka besar di baris kedua. Pendekatan yang saya lakukan adalah berulang kali dikalikan dengan beberapa kekuatan, lalu tambahkan konstanta, dan ulangi, sehingga dalam kode di atas 85032995607801617394diganti oleh

32
7 6) # * 219435 +
9) 6 # * 127438 +
20 5 # * 17394 +

di mana )increment dan #exponentiation di CJam.

Kemudian sisanya (bagian yang paling menjengkelkan) adalah melapisi setiap baris untuk memenuhi kriteria kolom. Untuk melakukan ini, kita membuang karakter dalam string dan menggunakannya ;untuk meletuskannya. Sayangnya, sementara kami sangat ingin menggunakan e#komentar juga untuk mempermudah, fakta bahwa #eksponensial melarang ini, jadi ini hanya dilakukan pada baris terakhir.

Saya cukup yakin metode ini dapat diperpanjang hingga koma pada kalimat pertama, tetapi sayangnya mengacak hal-hal untuk memenuhi kriteria kolom terbukti sulit, jadi saya mungkin perlu metode lain untuk menghasilkan bilangan bulat yang dikodekan basis.

Sp3000
sumber
1

Python 2, skor = 13 (tidak valid)

Python bukan bahasa terbaik untuk ini .... Setelah pemeriksaan lebih lanjut, ada dua ns di baris pertama saya. Tidak ada obat yang berharga, dan saya akan berhenti membuang-buang waktu saya dengan Python. Saat ini saya sedang berupaya membuat solusi dalam bahasa lain, tetapi belum akan membagikan yang mana.

print"Once wh\
en I",#Oncehtp
chr(0167)#Onwt

Alfabet (22): "#(),0167IOcehinprtw

Keluaran: Once when I w

mbomb007
sumber
Baris pertama Anda tidak valid, karena memiliki dua ns. Masalah ini hampir tidak mungkin di Python, karena Anda hanya bisa menggunakan garis lanjutan garis miring terbalik sekali (karena garis miring terbalik harus di kolom terakhir) dan tidak ada garis yang dapat memiliki dua jenis tanda kutip yang sama.
Blckknght
@ Blckknght Ah, saya melewatkan yang itu. Ya. Jawaban saya mungkin tidak akan lebih baik daripada contoh OP itu ...
mbomb007