Préfixe princier par un programme en motif

16

Vous devez écrire un programme ou une fonction qui génère ou renvoie autant de chapitre I du Petit Prince que possible. Votre programme ou fonction doit être un bloc de code M-by-N contenant uniquement des caractères ascii imprimables (point de code de 32 à 126) et des nouvelles lignes à la fin de chaque ligne.

Vous ne pouvez utiliser que 26 caractères au maximum parmi les 96 caractères ascii imprimables (et les sauts de ligne à la fin des lignes).

Dans chaque ligne et colonne, chaque personnage doit être distinct, comme un puzzle sudoku, c'est-à-dire qu'il ne peut pas y avoir deux fois une lettre dans une ligne ou une colonne.

Un exemple correct codeblock avec M = 4, N = 3et alphabet = {a,b,c,d,/,*}:

abcd
bcd*
*/ac

Détails du code

  • Vous pouvez choisir la forme de votre bloc de code (ie Met N).
  • Le bloc doit être entièrement rempli de caractères, c'est-à-dire que chaque ligne doit avoir la même longueur.
  • Un retour à la ligne à la fin de la dernière ligne est facultatif.
  • Comme indiqué ci-dessus dans chaque ligne et colonne, chaque caractère doit être distinct.

Détails de sortie

  • Vous devez sortir ou renvoyer un préfixe du chapitre I du Petit Prince sans aucune sortie supplémentaire.
  • Si vous atteignez une nouvelle ligne dans le texte, vous pouvez la représenter comme n'importe quelle variante courante (\ r, \ n, \ r \ n) mais n'utilisez qu'une seule d'entre elles et comptez-la comme 1 octet dans la partition.
  • Une nouvelle ligne supplémentaire est facultative.

Votre score est la longueur du texte de sortie à l' exclusion d'une nouvelle ligne supplémentaire si elle est présente. Un score plus élevé est meilleur.

Exemple de réponse

##Python3, score = 6

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

    print('O\
    nce w')#X

Vous pouvez vérifier la validité de votre code avec ce programme Python 3 (ideone) ou ce programme CJam (en ligne) fourni par @ MartinBüttner.

randomra
la source
Cela ne limite-t-il pas la taille du programme à 26x26 au maximum?
marinus
@marinus Oui, c'est le cas.
randomra
Êtes-vous sûr que cela est résoluble?
FUZxxl
@FUZxxl, la question contient une solution de référence avec un score de 6. Avec un peu de chance, la question est conçue de telle sorte qu'il n'est pas possible d'imprimer le tout (ou il faudrait un bris d'égalité).
Martin Ender
@ MartinBüttner Ah! J'ai oublié la partie «un préfixe de ...».
FUZxxl

Réponses:

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-

Essayez-le en ligne

Alphabet: "'*-/2INOSacdehilmnorswxy

Explication:

"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
la source
7

Pépin , score = 38

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

Alphabet: "'015:IMORXacdehilnorswxy

(Je détesterais certainement essayer ceci dans un vrai langage de programmation.)

Explication:

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
la source
4

Python 3, score = 11

C'est un problème vraiment difficile pour Python, car les restrictions sur la répétition de caractères sur une ligne ou une colonne rendent presque impossible la création de plus d'une chaîne littérale. Les différentes façons de joindre des chaînes sont donc assez inutiles, car vous ne pouvez pas commencer par les chaînes de manière utile. Voici ma meilleure tentative:

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

Notez qu'il y a un espace à la fin de la première ligne. L'alias xde chrest nécessaire pour éviter que le même caractère ne se retrouve dans plusieurs colonnes. Les caractères de commentaire à la fin pourraient être presque n'importe quoi.

L'alphabet comprend 21 caractères imprimables, plus la nouvelle ligne (notez l'espace au début):

 "#(),37=O\cehinprtwx

La sortie est:

Une fois quand je

Blckknght
la source
Notez que cela est également valable en Python 2. Merci de trouver une bonne réponse.
mbomb007
3

CJam, score = 21

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

Alphabet: -;INOSacehinoswxy

Juste pour faire rouler la balle; cela peut probablement être battu facilement.

Ypnypn
la source
2

CJam, score = 15

J'ai cette idée depuis un moment maintenant, mais je n'ai pas eu le temps de m'asseoir et de mélanger les choses jusqu'à ce que j'obtienne l'unicité de colonne nécessaire, alors voici une version bébé pour l'instant:

 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

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

Essayez-le en ligne .

Explication

L'idée de base est d'utiliser l'encodage de base afin que nous puissions imprimer plus de 26 types de caractères. Le code principal est

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

Notez que nous traitons la première "O"pour "Once"séparément , car y compris dans notre chaîne prendrait trop de notre alphabet. Si nous le voulions, nous pourrions essayer d'étendre notre chaîne d'indexation, mais comme il n'y a plus de caractères majuscules pendant un certain temps, "I"je ne me suis pas trop soucié de cela.

Nous devons ensuite construire le grand nombre sur la deuxième ligne d'une manière ou d'une autre. L'approche que j'ai adoptée était de multiplier à plusieurs reprises par une certaine puissance, puis d'ajouter une constante et de répéter, donc dans le code ci-dessus 85032995607801617394est remplacé par

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

)est incrément et #exponentiation dans CJam.

Ensuite, le reste (la partie la plus ennuyeuse) remplit chaque ligne pour répondre aux critères de la colonne. Pour ce faire, nous vidons les caractères dans les chaînes et les utilisons ;pour les faire apparaître. Malheureusement, alors que nous aimerions beaucoup utiliser e#pour les commentaires également pour faciliter les choses, le fait que l' #exponentiation l'interdise, donc cela ne se fait que sur la dernière ligne.

Je suis assez certain que cette méthode peut être étendue jusqu'à la virgule dans la première phrase, mais malheureusement, il est difficile de mélanger les choses pour répondre aux critères de la colonne, donc je pourrais avoir besoin d'une autre méthode pour générer l'entier codé en base.

Sp3000
la source
1

Python 2, score = 13 (invalide)

Python n'est pas le meilleur langage pour cela ... Après une inspection plus approfondie, il y a deux ns dans ma première ligne. Il n'y a pas de remède valable, et je vais arrêter de perdre mon temps avec Python. Je travaille actuellement sur la création d'une solution dans une autre langue, mais je ne partagerai pas encore laquelle.

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

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

Production: Once when I w

mbomb007
la source
Votre première ligne n'est pas valide, car elle comporte deux ns. Ce problème est presque impossible en Python, car vous ne pouvez utiliser une barre oblique inverse de continuation de ligne qu'une seule fois (car la barre oblique inversée doit être dans la dernière colonne) et aucune ligne ne peut avoir deux du même type de guillemet.
Blckknght
@Blckknght Ah, j'ai raté celui-là. Ouais. Ma réponse ne serait probablement pas meilleure que l'exemple du PO alors ...
mbomb007