Prefixo Principesco por um Programa em Padrão

16

Você deve escrever um programa ou função que produza ou devolve o máximo possível do capítulo I do pequeno príncipe . Seu programa ou função deve ser um bloco de código M-por-N contendo apenas caracteres ascii imprimíveis (ponto de código de 32 a 126) e novas linhas no final de cada linha.

Você só pode usar no máximo 26 caracteres de sua escolha entre os 96 caracteres ASCII imprimíveis (e as novas linhas no final das linhas).

Em cada linha e coluna, cada caractere deve ser distinto, semelhante a um quebra-cabeça sudoku, ou seja, não pode haver uma letra em uma linha ou coluna duas vezes.

Um exemplo de código correto com M = 4, N = 3e alphabet = {a,b,c,d,/,*}:

abcd
bcd*
*/ac

Detalhes do código

  • Você pode escolher a forma do seu bloco de código (ie Me N).
  • O bloco deve ser preenchido com caracteres inteiramente, ou seja, cada linha deve ter o mesmo comprimento.
  • Uma nova linha à direita no final da última linha é opcional.
  • Conforme escrito acima em cada linha e coluna, cada caractere deve ser distinto.

Detalhes da saída

  • Você deve produzir ou retornar um prefixo do Capítulo I de O Pequeno Príncipe sem nenhuma saída adicional.
  • Se você alcançar uma nova linha no texto, poderá representá-la como qualquer variante comum (\ r, \ n, \ r \ n), mas use apenas uma delas e conte-a como 1 byte para a pontuação.
  • Uma nova linha extra à direita é opcional.

Sua pontuação é o tamanho do texto de saída, excluindo uma nova linha adicional, se presente. Maior pontuação é melhor.

Resposta de exemplo

##Python3, score = 6

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

    print('O\
    nce w')#X

Você pode verificar a validade do seu código com este programa Python 3 (ideone) ou este programa CJam (online) fornecido pelo @ MartinBüttner.

randomra
fonte
Isso não limita o tamanho do programa a 26x26, no máximo?
Marinus
@ marinus Sim, sim.
randomra
Tem certeza de que isso é solucionável?
FUZxxl
@FUZxxl a pergunta contém uma solução de referência com a pontuação 6. Espero que a pergunta seja projetada de forma que não seja possível imprimir a coisa toda (ou seria necessário um desempate).
Martin Ender
@ MartinBüttner Ah! Esqueci a parte "um prefixo de ...".
FUZxxl

Respostas:

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-

Experimente online

Alfabeto: "'*-/2INOSacdehilmnorswxy

Explicação:

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

Pip , pontuação = 38

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

Alfabeto: "'015:IMORXacdehilnorswxy

(Eu certamente odiaria tentar isso em uma linguagem de programação real .)

Explicação:

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
fonte
4

Python 3, pontuação = 11

Esse é um problema muito difícil para o Python, pois as restrições na repetição de caracteres em uma linha ou coluna tornam quase impossível tornar mais de uma string literal. As várias maneiras de unir cadeias de caracteres são, portanto, bastante inúteis, pois você não pode começar com as cadeias de nenhuma maneira útil. Aqui está minha melhor tentativa:

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

Observe que há um espaço no final da primeira linha. O alias xpara chré necessário para evitar que o mesmo caractere termine em mais de uma coluna. Os caracteres de comentário no final podem ser quase qualquer coisa.

O alfabeto tem 21 caracteres imprimíveis, além de nova linha (observe o espaço no início):

 "#(),37=O\cehinprtwx

A saída é:

Uma vez quando eu

Blckknght
fonte
Observe que isso também é válido no Python 2. Grats em encontrar uma boa resposta.
Mbomb007
3

CJam, score = 21

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

Alfabeto: -;INOSacehinoswxy

Apenas para fazer a bola rolar; isso provavelmente pode ser derrotado facilmente.

Ypnypn
fonte
2

CJam, score = 15

Eu tenho essa idéia há algum tempo, mas não tive tempo de sentar e mexer nas coisas até obter a exclusividade da coluna necessária, então aqui está uma versão do bebê por enquanto:

 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

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

Experimente online .

Explicação

A idéia básica é usar a codificação base para que possamos imprimir mais de 26 tipos de caracteres. O código principal é

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

Note que nós tratamos o primeiro "O"para "Once"separadamente porque incluí-lo em nossa string levaria muito do nosso alfabeto. Se quiséssemos, poderíamos tentar estender nossa string de indexação, mas como não ocorreram mais caracteres maiúsculos por um tempo, "I"eu não me importei muito com isso.

Precisamos então construir o grande número na segunda linha de alguma forma. A abordagem adotada foi a de multiplicar repetidamente por alguma potência, adicionar uma constante e repetir, para que no código acima 85032995607801617394seja substituído por

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

onde )é incremento e #é exponenciação no CJam.

O restante (a parte mais irritante) está preenchendo cada linha para atender aos critérios da coluna. Para fazer isso, despejamos chars em strings e os usamos ;. Infelizmente, embora gostássemos muito de usar e#comentários para facilitar as coisas, o fato da #exponenciação proíbe isso, portanto isso é feito apenas na última linha.

Estou bastante certo de que esse método pode ser estendido até a vírgula na primeira frase, mas, infelizmente, embaralhar as coisas para atender aos critérios da coluna está se mostrando difícil, então talvez eu precise de outro método para gerar o número inteiro codificado em base.

Sp3000
fonte
1

Python 2, pontuação = 13 (inválido)

Python não é a melhor linguagem para isso .... Após uma inspeção mais aprofundada, existem dois ns na minha primeira linha. Não existe remédio que valha a pena e vou parar de desperdiçar meu tempo com o Python. Atualmente, estou trabalhando para criar uma solução em outro idioma, mas ainda não vou compartilhar qual.

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

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

Resultado: Once when I w

mbomb007
fonte
Sua primeira linha é inválida, pois possui dois ns. Esse problema é quase impossível no Python, pois você só pode usar uma barra invertida de continuação de linha uma vez (já que a barra invertida precisa estar na última coluna) e nenhuma linha pode ter dois do mesmo tipo de aspas.
Blckknght 01/05/19
@Blckknght Ah, eu perdi essa. Sim. Minha resposta provavelmente não seria melhor do que o exemplo do OP então ...
mbomb007