Głównie prefiks według programu we wzorcu

16

Powinieneś napisać program lub funkcję, która wypisuje lub zwraca jak najwięcej rozdziału I Małego Księcia . Twój program lub funkcja musi być blokiem kodu M-N-N zawierającym tylko drukowane znaki ascii (punkt kodowy od 32 do 126) i znaki nowej linii na końcu każdego wiersza.

Możesz użyć maksymalnie 26 wybranych znaków spośród 96 drukowanych znaków ascii (i nowych linii na końcu wierszy).

W każdym rzędzie i kolumnie każda postać musi być odrębna, podobnie jak puzzle sudoku, tzn. Nie może być litery w rzędzie lub kolumnie dwa razy.

Prawidłowe przykład blok kodu o M = 4, N = 3i alphabet = {a,b,c,d,/,*}:

abcd
bcd*
*/ac

Szczegóły kodu

  • Możesz wybrać kształt swojego bloku kodu (tj. MI N).
  • Blok musi być całkowicie wypełniony znakami, tzn. Każdy wiersz musi mieć tę samą długość.
  • Końcowy znak nowej linii na końcu ostatniego wiersza jest opcjonalny.
  • Jak napisano powyżej w każdym wierszu i kolumnie, każdy znak musi być odrębny.

Dane wyjściowe

  • Powinieneś wydrukować lub zwrócić prefiks rozdziału I Księcia Małego bez żadnych dodatkowych wyników.
  • Jeśli dojdziesz do nowego wiersza w tekście, możesz przedstawić go jako dowolny popularny wariant (\ r, \ n, \ r \ n), ale użyj tylko jednego z nich i policz go jako 1 bajt do wyniku.
  • Dodatkowy znak nowej linii jest opcjonalny.

Twój wynik to długość tekstu wyjściowego z wyłączeniem dodatkowego nowego wiersza, jeśli jest obecny. Wyższy wynik jest lepszy.

Przykładowa odpowiedź

##Python3, score = 6

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

    print('O\
    nce w')#X

Możesz sprawdzić poprawność swojego kodu za pomocą tego programu Python 3 (ideone) lub programu CJam (online) dostarczonego przez @ MartinBüttner.

randomra
źródło
Czy to nie ogranicza rozmiaru programu maksymalnie do 26 x 26?
marinus
@marinus Tak to robi.
randomra
Czy jesteś pewien, że można to rozwiązać?
FUZxxl
@FUZxxl pytanie zawiera rozwiązanie referencyjne z wynikiem 6. Mam nadzieję, że pytanie zostało zaprojektowane w taki sposób, że nie można wydrukować całej rzeczy (lub potrzebowałby remisu).
Martin Ender
@ MartinBüttner Ah! Zapomniałem o części „prefiks…”.
FUZxxl

Odpowiedzi:

4

CJam, 47 lat

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

Wypróbuj online

Alfabet: "'*-/2INOSacdehilmnorswxy

Wyjaśnienie:

"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
źródło
7

Pip , wynik = 38

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

Alfabet: "'015:IMORXacdehilnorswxy

(Z pewnością nie chciałbym tego próbować w prawdziwym języku programowania).

Wyjaśnienie:

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
źródło
4

Python 3, wynik = 11

Jest to bardzo trudny problem dla Pythona, ponieważ ograniczenia powtarzania znaków w wierszu lub kolumnie sprawiają, że prawie niemożliwe jest utworzenie więcej niż jednego literału ciągowego. Różne sposoby łączenia ze sobą łańcuchów są więc dość bezużyteczne, ponieważ nie można uzyskać ciągów w jakikolwiek użyteczny sposób. Oto moja najlepsza próba:

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

Zauważ, że na końcu pierwszego wiersza znajduje się spacja. Alias xdla chrjest konieczne, aby uniknąć tego samego znaku kończącego się w więcej niż jednej kolumnie. Komentarze na końcu mogą być prawie wszystkim.

Alfabet składa się z 21 znaków do wydruku oraz znaku nowej linii (zwróć uwagę na spację na początku):

 "#(),37=O\cehinprtwx

Dane wyjściowe to:

Raz, kiedy ja

Blckknght
źródło
Zauważ, że dotyczy to również Pythona 2. Graty po znalezieniu dobrej odpowiedzi.
mbomb007
3

CJam, wynik = 21

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

Alfabet: -;INOSacehinoswxy

Tylko po to, żeby piłka się toczyła; można to prawdopodobnie łatwo pokonać.

Ypnypn
źródło
2

CJam, wynik = 15

Od jakiegoś czasu mam ten pomysł, ale nie miałem czasu, aby usiąść i przetasować różne rzeczy, dopóki nie uzyskam potrzebnej wyjątkowości kolumny, więc na razie oto wersja dla dzieci:

 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

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

Wypróbuj online .

Wyjaśnienie

Podstawową ideą jest wykorzystanie kodowania podstawowego, abyśmy mogli wydrukować ponad 26 typów znaków. Podstawowym kodem jest

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

Zauważ, że traktujemy pierwszy "O"dla "Once"oddzielnie, ponieważ w tym w naszym ciąg zajęłoby zbyt dużo naszego alfabetu. Gdybyśmy chcieli, moglibyśmy spróbować rozszerzyć nasz ciąg indeksujący, ale ponieważ przez jakiś czas nie pojawiały się już wielkie litery, poza "I"tym nie zawracałem sobie tym głowy.

Następnie musimy jakoś zbudować dużą liczbę na drugiej linii. Podejście polegało na wielokrotnym pomnożeniu przez pewną moc, a następnie dodaniu stałej i powtórzeniu, więc w powyższym kodzie 85032995607801617394zastąpiono

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

gdzie )jest przyrostem i #wykładnikiem w CJam.

Następnie reszta (najbardziej denerwująca część) wypełnia każdy wiersz, aby spełnić kryteria kolumny. Aby to zrobić, zrzucamy znaki w ciągi znaków i używamy ich ;do pop. Niestety, chociaż bardzo chcielibyśmy również używać e#komentarzy, aby ułatwić sprawę, fakt, że #jest potęgowaniem, zabrania tego, więc dzieje się to tylko w ostatnim wierszu.

Jestem całkiem pewien, że tę metodę można rozszerzyć do przecinka w pierwszym zdaniu, ale niestety przetasowanie elementów w celu spełnienia kryteriów kolumny okazuje się trudne, więc może potrzebuję innej metody generowania liczby całkowitej zakodowanej w podstawie.

Sp3000
źródło
1

Python 2, wynik = 13 (niepoprawny)

Python nie jest najlepszym językiem do tego ... Po dalszej inspekcji nw pierwszym wierszu są dwa znaki. Nie ma wartościowego lekarstwa i przestanę marnować czas na Pythona. Obecnie pracuję nad stworzeniem rozwiązania w innym języku, ale jeszcze nie będę go udostępniać.

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

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

Wynik: Once when I w

mbomb007
źródło
Twój pierwszy wiersz jest nieprawidłowy, ponieważ ma dwa ns. Ten problem jest prawie niemożliwy w Pythonie, ponieważ można użyć odwrotnego ukośnika kontynuacji linii tylko raz (ponieważ odwrotny ukośnik musi znajdować się w ostatniej kolumnie) i żadna linia nie może zawierać dwóch tego samego rodzaju cudzysłowu.
Blckknght
@Blckknght Ach, tęskniłem za tym. Tak. Moja odpowiedź prawdopodobnie nie byłaby lepsza niż przykład OP…
mbomb007