Княжеский префикс по программе в шаблоне

16

Вы должны написать программу или функцию, которая выводит или возвращает столько главы I «Маленького принца», сколько может. Ваша программа или функция должны быть блоком кода M-by-N, содержащим только печатаемые символы ascii (кодовая точка от 32 до 126) и символы новой строки в конце каждой строки.

Вы можете использовать не более 26 символов по вашему выбору из 96 печатных символов ascii (и символов новой строки в конце строк).

В каждой строке и столбце каждый символ должен быть отличным, как в пазле судоку, то есть в строке или столбце не может быть буквы дважды.

Правильный пример кодового блока с M = 4, N = 3и alphabet = {a,b,c,d,/,*}:

abcd
bcd*
*/ac

Детали кода

  • Вы можете выбрать форму вашего кодового блока (т.е. Mи N).
  • Блок должен быть полностью заполнен символами, т.е. каждая строка должна иметь одинаковую длину.
  • Завершающий перевод строки в конце последней строки не является обязательным.
  • Как написано выше, в каждой строке и столбце каждый символ должен быть отличным.

Детали вывода

  • Вы должны вывести или вернуть префикс главы I «Маленького принца» без каких-либо дополнительных выходных данных.
  • Если вы достигнете новой строки в тексте, вы можете представить ее как любой общий вариант (\ 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) или этой программы CJam (онлайн), предоставляемой @ MartinBüttner.

randomra
источник
Разве это не ограничивает размер программы максимум 26x26?
Marinus
@marinus Да, это так.
Рандомра
Вы уверены, что это разрешимо?
FUZxxl
@FUZxxl вопрос содержит эталонный раствор с бальной 6. Будем надеяться , что вопрос разработан таким образом, что это не возможно печатать всю вещь (или ему потребуется связующий выключатель).
Мартин Эндер
@ MartinBüttner А! Я забыл про часть «префикс ...».
FUZxxl

Ответы:

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)
aditsu
источник
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
DLosc
источник
4

Python 3, оценка = 11

Это действительно сложная проблема для Python, поскольку ограничения на повторение символов в строке или столбце делают практически невозможным создание более одной строковой литеральной строки. Таким образом, различные способы объединения строк довольно бесполезны, так как вы не можете получить строки для начала любым полезным способом. Вот моя лучшая попытка:

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

Обратите внимание, что в конце первой строки есть пробел. Псевдоним xдляchr необходим, чтобы избежать попадания одного и того же символа в несколько столбцов. Символы комментария в конце могут быть почти чем угодно.

В алфавите 21 печатный символ плюс перевод строки (обратите внимание на пробел в начале):

 "#(),37=O\cehinprtwx

Выход:

Однажды, когда я

Blckknght
источник
Обратите внимание, что это действует и в Python 2. Позволяет найти хороший ответ.
mbomb007
3

CJam, счет = 21

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

Алфавит: -;INOSacehinoswxy

Просто чтобы мяч катился; это, вероятно, можно легко победить.

Ypnypn
источник
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.

Затем остальная часть (самая раздражающая часть) дополняет каждую строку, чтобы соответствовать критериям столбца. Для этого мы сбрасываем символы в строки и используем их ;для выталкивания. К сожалению, хотя мы очень хотели бы использовать e#для комментариев, чтобы сделать вещи проще, тот факт, что# возведения в степень запрещает это, поэтому это делается только в последней строке.

Я вполне уверен, что этот метод может быть расширен до запятой в первом предложении, но, к сожалению, перетасовка вещей для соответствия критериям столбца оказывается сложной, поэтому мне может понадобиться другой метод генерации целочисленного кодированного целого числа.

Sp3000
источник
1

Python 2, оценка = 13 (неверно)

Python - не лучший язык для этого ... При дальнейшей проверке nв моей первой строке есть две буквы "s". Нет достойных лекарств, и я перестану тратить время на Python. В настоящее время я работаю над созданием решения на другом языке, но пока не поделюсь каким.

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

Алфавит (22): "#(),0167IOcehinprtw

Выход: Once when I w

mbomb007
источник
Ваша первая строка недействительна, так как имеет две ns. Эта проблема почти невозможна в Python, так как вы можете использовать обратную косую черту продолжения строки только один раз (поскольку обратная косая черта должна быть в последнем столбце), и ни одна строка не может иметь две одинаковые кавычки.
Blckknght
@Blckknght Ах, я пропустил это. Да. Мой ответ, вероятно, не будет лучше, чем пример ОП в то время ...
mbomb007