Desendeki Bir Program ile Önceden Önek


16

Küçük Prens Bölüm I'in mümkün olduğunca çok çıktısını veren ya da geri dönen bir program ya da işlev yazmalısınız . Programınız veya işleviniz, her satırın sonunda yalnızca yazdırılabilir ascii karakterleri (32 - 126 arası kod noktası) ve yeni satırlar içeren bir M-N kod kodu olmalıdır.

Yalnızca olabilir en fazla 26 karakter kullanın (satır sonunda ve yeni satır) 96 yazdırılabilir ASCII karakter seçtiğiniz.

Her satır ve sütunda her karakter bir sudoku bulmacasına benzer olmalıdır, yani bir satır veya sütunda iki kez bir harf olamaz.

Doğru bir örnek ile kod-bloğu M = 4, N = 3ve alphabet = {a,b,c,d,/,*}:

abcd
bcd*
*/ac

Kod ayrıntıları

  • Kod bloğunuzun şeklini seçebilirsiniz (yani Mve N).
  • Blok tamamen karakterlerle doldurulmalıdır, yani her satırın aynı uzunlukta olması gerekir.
  • Son satırın sonundaki bir satırsonu isteğe bağlıdır.
  • Yukarıda her satır ve sütunda yazıldığı gibi her karakterin farklı olması gerekir.

Çıktı ayrıntıları

  • Küçük Prens Bölüm I'in ön ekini herhangi bir ek çıktı olmadan çıkarmanız veya geri göndermeniz gerekir .
  • Metinde yeni bir satıra ulaşırsanız, onu herhangi bir ortak varyant olarak (\ r, \ n, \ r \ n) temsil edebilir, ancak bunlardan yalnızca birini kullanabilir ve puan için 1 bayt olarak sayabilirsiniz.
  • Ek bir sondaki yeni satır isteğe bağlıdır.

Puanınız, varsa ek bir yeni satır hariç , çıktı metninin uzunluğudur . Daha yüksek puan daha iyidir.

Örnek cevap

##Python3, score = 6

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

    print('O\
    nce w')#X

Kodunuzun geçerliliğini bu Python 3 (ideone) programı veya @ MartinBüttner tarafından sağlanan bu CJam programı (çevrimiçi) ile kontrol edebilirsiniz.


Bu, program boyutunu en fazla 26x26 ile sınırlamaz mı?
marinus

@marinus Evet öyle.
randomra

Bunun çözülebilir olduğundan emin misiniz?
FUZxxl

@FUZxxl soru 6 puan ile bir referans çözüm içeriyor. Umarım soru tüm şey yazdırmak mümkün olmayacak şekilde tasarlanmıştır (veya bir kravat kırıcı gerekir).
Martin Ender

@ MartinBüttner Ah! “Öneki ...” bölümünü unuttum.
FUZxxl

Yanıtlar:


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-

Çevrimiçi deneyin

Alfabe: "'*-/2INOSacdehilmnorswxy

Açıklama:

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

7

Pip , skor = 38

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

Alfabe: "'015:IMORXacdehilnorswxy

(Bunu gerçek bir programlama dilinde denemekten nefret ederim .)

Açıklama:

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

4

Python 3, puan = 11

Bu, Python için gerçekten zor bir sorundur, çünkü bir satır veya sütundaki karakterleri tekrarlamakla ilgili kısıtlamalar, birden fazla dize hazır bilgisi yapmayı neredeyse imkansız hale getirir. Dizeleri bir araya getirmenin çeşitli yolları bu nedenle oldukça işe yaramaz, çünkü dizeleri işe yaramaz bir şekilde başlatamazsınız. İşte benim en iyi girişimim:

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

İlk satırın sonunda bir boşluk olduğunu unutmayın. Takma xiçin chrbirden fazla sütunda biten aynı karakteri önlemek için gereklidir. Sondaki yorum karakterleri neredeyse her şey olabilir.

Alfabe 21 yazdırılabilir karakter artı yeni satırdır (başlangıçtaki boşluğa dikkat edin):

 "#(),37=O\cehinprtwx

Çıktı:

Bir zamanlar ben


Bunun Python 2'de de geçerli olduğunu unutmayın. İyi bir cevap bulma konusunda teşekkür ederiz.
mbomb007

3

CJam, skor = 21

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

Alfabe: -;INOSacehinoswxy

Sadece topu yuvarlamak için; bu kolayca yenilebilir.


2

CJam, skor = 15

Bir süredir bu fikri yaşadım ama gerekli sütun benzersizliğini elde edene kadar oturup bir şeyler karıştırmak için zamanım olmadı, bu yüzden şimdilik bir bebek versiyonu:

 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

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

Çevrimiçi deneyin .

açıklama

Temel fikir, 26'dan fazla karakter türü yazdırabilmemiz için temel kodlamayı kullanmaktır. Çekirdek kod

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

İlk tedavi geldiğini hatırlatırız "O"için "Once"bizim dizede onu da dahil çok fazla bizim alfabenin alacaktı ayrı çünkü. Eğer istersek, dizinleme dizgimizi genişletmeyi deneyebilirdik, ancak bir süre dışında başka büyük karakterler olmayacağından "I", bununla fazla uğraşmadım.

O zaman bir şekilde ikinci hatta büyük sayıyı oluşturmamız gerekiyor. Çektiğim yaklaşım defalarca çarpın bazı güç tarafından, daha sonra sabit ve tekrar, bu nedenle yukarıdaki kodda eklemek oldu 85032995607801617394değiştirilir

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

burada )değerdir ve #CJam olarak üs alma işlemi yapılır.

Sonra geri kalanı (en can sıkıcı kısım) sütun ölçütlerini yerine getirmek için her satırı dolduruyor. Bunu yapmak için karakterleri dizelere döküyoruz ve ;onları patlatmak için kullanıyoruz. Ne yazık ki, e#işleri kolaylaştırmak için yorumlarda da kullanmak isterken #, üs alma olan bu gerçeği yasaklar, bu sadece son satırda yapılır.

Bu yöntemin ilk cümlede virgüle kadar uzatılabileceğinden oldukça eminim, ancak maalesef sütun ölçütlerini karşılamak için bir şeyleri karıştırmak zor oluyor, bu yüzden taban kodlu tamsayıyı oluşturmak için başka bir yönteme ihtiyacım olabilir.


1

Python 2, skor = 13 (geçersiz)

Python bunun için en iyi dil değil .... Daha fazla incelemede, nilk satırımda iki tane var . Yararlı bir çözüm yok ve Python ile zamanımı boşa harcamayı bırakacağım. Şu anda başka bir dilde çözüm üretmeye çalışıyorum ama henüz hangisini paylaşmayacağım.

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

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

Çıktı: Once when I w


İki satır olduğundan ilk satırınız geçersiz n. Bu sorun Python'da neredeyse imkansızdır, çünkü bir satır devam ters eğik çizgisini yalnızca bir kez kullanabilirsiniz (ters eğik çizgi son sütunda olması gerektiğinden) ve hiçbir satır aynı türden iki tırnak işareti içeremez.
Blckknght

@Blckknght Ah, bunu özledim. Evet. Cevabım muhtemelen OP'nin örneğinden daha iyi olmazdı ...
mbomb007
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.