Княжа приставка за програмою за малюнком


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.


Чи не обмежує це розмір програми максимум 26x26?
marinus

@marinus Так, це так.
randomra

Ви впевнені, що це вирішимо?
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)

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

4

Python 3, оцінка = 11

Це дійсно складна проблема для Python, оскільки обмеження на повторення символів на рядку чи стовпці майже неможливо зробити більш ніж один рядок буквальним. Таким чином, різні способи з'єднання рядків разом є марними, оскільки ви не зможете розпочати рядки будь-яким корисним способом. Ось моя найкраща спроба:

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

Зауважте, що в кінці першого рядка є пробіл. Псевдонім xдля chrнеобхідний, щоб уникнути того, що той самий символ закінчується більш ніж одним стовпцем. Персонажі коментарів в кінці можуть бути майже будь-якими.

Алфавіт - 21 символ для друку, плюс новий рядок (відмітьте пробіл на початку):

 "#(),37=O\cehinprtwx

Вихід:

Одного разу, коли я


Зауважте, що це дійсно і в Python 2. Зрозуміло, як знайти хорошу відповідь.
mbomb007

3

CJam, оцінка = 21

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

Алфавіт: -;INOSacehinoswxy

Просто для того, щоб м'яч котився; це, мабуть, легко перемогти.


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#для коментарів, щоб полегшити все, факт# експоненції забороняє це, тому це робиться лише в останньому рядку.

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


1

Python 2, оцінка = 13 (недійсне)

Python - не найкраща мова для цього .... Після подальшого огляду nв моєму першому рядку є два s. Немає корисного засобу, і я перестану витрачати свій час на Python. Зараз я працюю над рішенням іншою мовою, але ще не поділюся на яку.

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

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

Вихід: Once when I w


Ваш перший рядок недійсний, оскільки він має два ns. Ця проблема майже не можлива в Python, оскільки ви можете використовувати зворотний косий рядок продовження рядка лише один раз (оскільки зворотний косий рядок повинен бути в останньому стовпчику), і жоден рядок не може мати двох однакових лапок.
Blckknght

@Blckknght Ах, я пропустив це. Так. Моя відповідь, мабуть, не буде кращою, ніж приклад ОП ...
mbomb007,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.