Fürstliches Präfix von einem Programm in Pattern

16

Sie sollten ein Programm oder eine Funktion schreiben, die so viel wie möglich von Kapitel I des Kleinen Prinzen ausgibt oder zurückgibt . Ihr Programm oder Ihre Funktion muss ein M-mal-N-Codeblock sein, der nur druckbare ASCII-Zeichen (Codepunkt von 32 bis 126) und Zeilenumbrüche am Ende jeder Zeile enthält.

Sie können maximal 26 Zeichen Ihrer Wahl aus den 96 druckbaren ASCII-Zeichen (und den Zeilenumbrüchen am Ende der Zeilen) verwenden.

In jeder Zeile und Spalte muss jedes Zeichen anders sein als in einem Sudoku-Puzzle, dh es darf keinen Buchstaben in einer Zeile oder Spalte zweimal geben.

Ein korrektes Beispiel Codeblock mit M = 4, N = 3und alphabet = {a,b,c,d,/,*}:

abcd
bcd*
*/ac

Code-Details

  • Sie können die Form Ihres Codeblocks (dh Mund N) auswählen .
  • Der Block muss vollständig mit Zeichen gefüllt sein, dh jede Zeile muss gleich lang sein.
  • Ein abschließender Zeilenumbruch am Ende der letzten Zeile ist optional.
  • Wie oben in jeder Zeile und Spalte beschrieben, muss jedes Zeichen unterschiedlich sein.

Ausgabedetails

  • Sie sollten ein Präfix von Kapitel I des Kleinen Prinzen ohne zusätzliche Ausgabe ausgeben oder zurückgeben .
  • Wenn Sie eine neue Zeile im Text erreichen, können Sie diese als eine beliebige häufig verwendete Variante (\ r, \ n, \ r \ n) darstellen. Verwenden Sie jedoch nur eine davon und zählen Sie sie als 1 Byte für die Punktzahl.
  • Ein zusätzlicher Zeilenumbruch ist optional.

Ihre Punktzahl ist die Länge des ausgegebenen Textes ohne eine zusätzliche neue Zeile, falls vorhanden. Eine höhere Punktzahl ist besser.

Beispielantwort

##Python3, score = 6

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

    print('O\
    nce w')#X

Sie können die Gültigkeit Ihres Codes mit diesem Python 3 (Ideone) -Programm oder diesem CJam-Programm (online) überprüfen, das von @ MartinBüttner bereitgestellt wird.

randomra
quelle
Beschränkt dies die Programmgröße nicht auf maximal 26x26?
marinus
@marinus Ja, das tut es.
Randomra
Sind Sie sicher, dass dies lösbar ist?
FUZxxl
@FUZxxl Die Frage enthält eine Referenzlösung mit Punktzahl 6. Hoffentlich ist die Frage so gestaltet, dass es nicht möglich ist, die gesamte Sache zu drucken (oder es wäre ein Kabelbrecher erforderlich).
Martin Ender
@ MartinBüttner Ah! Ich habe den Teil "ein Präfix von ..." vergessen.
FUZxxl

Antworten:

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-

Probieren Sie es online aus

Alphabet: "'*-/2INOSacdehilmnorswxy

Erläuterung:

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

Pip , Score = 38

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

Alphabet: "'015:IMORXacdehilnorswxy

(Ich würde es auf jeden Fall hassen, dies in einer echten Programmiersprache zu versuchen .)

Erläuterung:

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

Python 3, Punktzahl = 11

Dies ist ein sehr schwieriges Problem für Python, da es aufgrund der Einschränkungen bei der Wiederholung von Zeichen in einer Zeile oder Spalte fast unmöglich ist, mehr als ein String-Literal zu erstellen. Die verschiedenen Arten, Zeichenfolgen miteinander zu verbinden, sind daher ziemlich nutzlos, da Sie die Zeichenfolgen zunächst nicht auf nützliche Weise erfassen können. Hier ist mein bester Versuch:

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

Beachten Sie, dass am Ende der ersten Zeile ein Leerzeichen steht. Der Alias xfür christ erforderlich, um zu vermeiden, dass dasselbe Zeichen in mehr als einer Spalte endet. Die Kommentarzeichen am Ende können fast alles sein.

Das Alphabet besteht aus 21 druckbaren Zeichen plus Zeilenumbruch (Leerzeichen am Anfang beachten):

 "#(),37=O\cehinprtwx

Ausgabe ist:

Einmal wenn ich

Blckknght
quelle
Beachten Sie, dass dies auch in Python 2 gilt. Danke, dass Sie eine gute Antwort gefunden haben.
mbomb007
3

CJam, Score = 21

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

Alphabet: -;INOSacehinoswxy

Nur um den Ball ins Rollen zu bringen; Dies kann wahrscheinlich leicht geschlagen werden.

Ypnypn
quelle
2

CJam, Score = 15

Ich habe diese Idee schon eine Weile gehabt, aber ich hatte keine Zeit, mich hinzusetzen und die Dinge zu mischen, bis ich die benötigte Eindeutigkeit der Spalte erlangt habe.

 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

Probieren Sie es online aus .

Erläuterung

Die Grundidee ist, die Basiscodierung zu verwenden, damit wir mehr als 26 Arten von Zeichen drucken können. Der Kerncode ist

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

Beachten Sie, dass wir das erste "O"für "Once"sich behandeln, da die Aufnahme in unsere Zeichenfolge zu viel von unserem Alphabet beanspruchen würde. Wenn wir wollten, könnten wir versuchen, unsere Indexzeichenfolge zu erweitern, aber da eine Weile lang keine Großbuchstaben mehr vorkommen, habe "I"ich mich nicht allzu sehr darum gekümmert.

Wir müssen dann irgendwie die große Zahl in der zweiten Zeile aufbauen. Der Ansatz, den ich gewählt habe, war, wiederholt mit einer Potenz zu multiplizieren, dann eine Konstante hinzuzufügen und zu wiederholen, sodass der obige Code 85032995607801617394durch ersetzt wird

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

Wo )ist Inkrement und #Potenzierung in CJam.

Dann füllt der Rest (der nervigste Teil) jede Zeile auf, um die Spaltenkriterien zu erfüllen. Zu diesem Zweck werden Zeichen in Strings abgelegt und ;mit Pops versehen. Obwohl wir dies gerne auch e#für Kommentare verwenden würden, um die Dinge einfacher zu machen, #verbietet die Exponentiation dies leider, so dass dies nur in der letzten Zeile erfolgt.

Ich bin mir ziemlich sicher, dass diese Methode bis zum Komma im ersten Satz erweitert werden kann, aber leider erweist es sich als schwierig, die Dinge zu mischen, um die Spaltenkriterien zu erfüllen, sodass ich möglicherweise eine andere Methode zum Generieren der basiscodierten Ganzzahl benötige.

Sp3000
quelle
1

Python 2, Punktzahl = 13 (ungültig)

Python ist nicht die beste Sprache dafür ... Bei näherer Betrachtung befinden sich zwei ns in meiner ersten Zeile. Es gibt kein lohnendes Mittel, und ich werde aufhören, meine Zeit mit Python zu verschwenden. Ich arbeite derzeit an einer Lösung in einer anderen Sprache, werde aber noch keine Lösung veröffentlichen.

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

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

Ausgabe: Once when I w

mbomb007
quelle
Deine erste Zeile ist ungültig, da sie zwei ns hat. Dieses Problem ist in Python nahezu unmöglich, da Sie einen Zeilenfortsetzungs-Backslash nur einmal verwenden können (da sich der Backslash in der letzten Spalte befinden muss) und keine Zeile zwei Anführungszeichen derselben Art haben kann.
Blckknght
@Blckknght Ah, das habe ich verpasst. Ja. Meine Antwort wäre wahrscheinlich nicht besser als das Beispiel des OP als ...
mbomb007