パターンのプログラムによるプリンスプレフィックス


16

星の王子様のチャプターIをできるだけ多く出力または返すプログラムまたは関数を作成する必要があります。プログラムまたは関数は、印刷可能なASCII文字(32〜126のコードポイント)と各行の終わりの改行のみを含むM行N列のコードブロックでなければなりません。

96個の印刷可能なASCII文字(および行の最後の改行)から選択した最大26文字しか使用できません。

各行と列で、すべてのキャラクターは数独パズルのように明確に区別する必要があります。つまり、行または列に2回文字を入れることはできません。

正しい例とコードブロックM = 4N = 3およびalphabet = {a,b,c,d,/,*}

abcd
bcd*
*/ac

コードの詳細

  • コードブロックの形状(MおよびN)を選択できます。
  • ブロックはすべて文字で埋める必要があります。つまり、すべての行は同じ長さでなければなりません。
  • 最後の行の末尾の末尾の改行はオプションです。
  • 上記の各行と各列に書かれているように、すべての文字は明確でなければなりません。

出力の詳細

  • 追加出力なしで、星の王子さまの第1章の接頭辞を出力するか返す必要があります。
  • テキスト内の改行に到達した場合、一般的なバリアント(\ r、\ n、\ r \ n)として表すことができますが、そのうちの1つだけを使用し、スコアの1バイトとしてカウントします。
  • 追加の末尾の改行はオプションです。

スコアは、出力テキストの長さであり、追加の改行がある場合はそれを除きます。スコアが高いほど優れています。

回答例

##Python3, score = 6

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

    print('O\
    nce w')#X

このPython 3(ideone)プログラムまたは@MartinBüttnerが提供するこのCJamプログラム(オンライン)を使用して、コードの妥当性を確認できます。


これにより、プログラムのサイズは最大で26x26に制限されませんか?
マリヌ

@marinusはい、できます。
-randomra

これは解決可能ですか?
-FUZxxl

@FUZxxl質問にはスコア6の参照ソリューションが含まれています。うまくいけば、質問全体を印刷できないように(またはタイブレーカーが必要になるように)質問が設計されています。
マーティンエンダー

@MartinBüttnerああ!「…の接頭辞」の部分を忘れました。
FUZxxl

回答:


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-

オンラインで試す

アルファベット: "'*-/2INOSacdehilmnorswxy

説明:

"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

ピップ、スコア= 38

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

アルファベット: "'015:IMORXacdehilnorswxy

(確かに、これを実際のプログラミング言語で試してみたくありません。)

説明:

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、スコア= 11

これはPythonにとって非常に難しい問題です。行または列で文字を繰り返すことの制限により、複数の文字列リテラルを作成することはほぼ不可能です。したがって、文字列を有用な方法で開始することはできないため、文字列を結合するさまざまな方法はほとんど役に立ちません。これが私の最善の試みです。

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

最初の行の終わりにスペースがあることに注意してください。エイリアスxのためには、chr複数の列で終わる同じ文字を回避する必要があります。最後のコメント文字はほとんど何でもかまいません。

アルファベットは、21文字の印刷可能な文字と改行(先頭のスペースに注意してください)です。

 "#(),37=O\cehinprtwx

出力は次のとおりです。

一度私が


これはPython 2でも有効であることに注意してください。良い答えを見つけることに感謝します。
mbomb007

3

CJam、スコア= 21

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

アルファベット: -;INOSacehinoswxy

ボールを転がすだけです。これはおそらく簡単に破られる可能性があります。


2

CJam、スコア= 15

私はこのアイデアをしばらく持っていましたが、必要な列の一意性が得られるまで座って物事をシャッフルする時間がありませんでしたので、ここでは今のベビーバージョンです:

 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

アルファベット(26): " #)*+,0123456789:;=>Ibcef

オンラインでお試しください

説明

基本的な考え方は、ベースエンコーディングを使用して、26種類以上の文字を印刷できるようにすることです。コアコードは

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

文字列に含めるとアルファベットが多くなりすぎるため、最初の"O""Once"個別に処理することに注意してください。必要に"I"応じて、インデックス文字列を拡張してみることもできますが、しばらくの間は大文字が発生しなくなるため、これを気にする必要はありませんでした。

次に、2行目に大きな数字を作成する必要があります。私が取ったアプローチは、繰り返し何らかの力で乗算し、定数を追加して繰り返すことでしたので、上記のコードで85032995607801617394

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

ここ)で、増分#はCJamの累乗です。

その後、残り(最も厄介な部分)は、列の条件を満たすために各行をパディングします。これを行うには、文字列に文字をダンプし、;それらをポップするために使用します。残念ながら、e#コメントを使用して物事を簡単にしたいのですが、#累乗法はこれを禁止しているため、これは最後の行でのみ行われます。

このメソッドは最初の文のコンマまで拡張できると確信していますが、残念ながら列の基準を満たすために物事をシャッフルすることは困難であることが判明しているため、ベースエンコードされた整数を生成する別の方法が必要になる場合があります。


1

Python 2、スコア= 13(無効)

Pythonはこれに最適な言語ではありません。...さらに詳しく調べてみるとn、最初の行には2つあります。価値のある救済策はありません。Pythonで時間を無駄にするのをやめるつもりです。私は現在、別の言語でソリューションを作成する作業を行っていますが、まだどの言語を共有するつもりはありません。

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

アルファベット(22): "#(),0167IOcehinprtw

出力: Once when I w


最初の行は2つあるため無効nです。この問題はPythonではほとんど不可能です。なぜなら、バックスラッシュは最後の列にある必要があるため、行継続バックスラッシュは一度しか使用できず、同じ種類の引用符を2つ持つことはできないためです。
Blckknght

@Blckknghtああ、私はそれを見逃した。うん。私の答えはおそらくOPの例よりも良くないでしょう
...-mbomb007
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.