模式中程序的王子前缀


16

您应该编写一个程序或函数,该程序或函数应尽可能输出或返回《小王子第一章。您的程序或函数必须是M×N的代码块,其中仅包含可打印的ASCII字符(代码点从32到126),并在每行末尾添加换行符。

您最多只能使用 96个可打印的ascii字符(以及行尾的换行符)中选择的26个字符

在每一行和每一列中,每个字符都必须与数独谜题相似,即每行或每列两次都不能有字母。

正确的例子代码块用M = 4N = 3并且alphabet = {a,b,c,d,/,*}

abcd
bcd*
*/ac

代码详细信息

  • 您可以选择代码块的形状(即MN)。
  • 该块必须完全用字符填充,即每一行必须具有相同的长度。
  • 最后一行末尾的换行符是可选的。
  • 如上面在每一行和每一列中所写,每个字符必须是不同的。

输出细节

  • 您应该输出或返回《小王子第一章的前缀, 而无需任何其他输出。
  • 如果您在文本中找到换行符,则可以将其表示为任何常见的变体(\ r,\ n,\ r \ n),但仅使用其中之一并将其计为分数的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

@marinus是的。
randomra 2015年

您确定这是可以解决的吗?
FUZxxl 2015年

@FUZxxl该问题包含一个得分为6的参考解决方案。希望该问题的设计使其无法打印整个内容(否则将需要打平领带)。
马丁·恩德

@MartinBüttner啊!我忘记了“ ...的前缀”部分。
FUZxxl 2015年

Answers:


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"我对此也不会太在意。

然后,我们需要以某种方式在第二行上建立大量数字。我采用的方法是反复乘以某个幂,然后添加一个常数,然后重复,因此在上面的代码85032995607801617394中替换为

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

其中,CJam )是增量,#是幂。

然后其余部分(最烦人的部分)填充每一行以满足列标准。为此,我们将char转储为字符串并用于;弹出它们。不幸的是,虽然我们也非常想使用e#注释来使事情变得容易,但事实是#幂运算禁止这样做,因此只能在最后一行进行。

我相当确定该方法可以扩展到第一句中的逗号为止,但是不幸的是,为了满足列条件而对周围的事物进行改组非常困难,因此我可能需要另一种生成基数编码的整数的方法。


1

Python 2,分数= 13(无效)

Python并不是最佳语言。...经过进一步检查,n我的第一行有两个。没有值得的补救措施,我将停止浪费我的Python时间。我目前正在尝试用另一种语言制作解决方案,但目前还不会分享。

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

字母(22): "#(),0167IOcehinprtw

输出: Once when I w


您的第一行无效,因为它有两个ns。在Python中,这个问题几乎是不可能的,因为您只能使用一次行连续反斜杠(因为反斜杠必须在最后一列中),并且任何行都不能使用两种相同的引号。
Blckknght

@Blckknght啊,我错过了那个。是的 我的回答可能不会比OP的示例更好……
mbomb007
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.