Если вы когда-нибудь пытались добавить метки к действительно плотному графику, то поймете, что иногда метки накладываются друг на друга, что затрудняет их чтение. Мы собираемся сделать что-то подобное, но в 1D.
Входными данными будет последовательность (label, x-coordinate)
пар, а выходными данными будет результат отрисовки каждой точки и метки в указанном порядке. Звездочка, *
представляющая точку, должна быть помещена в заданную x-координату и должна следовать метка. Любые существующие символы будут перезаписаны.
Например, если вход был
Hello 0
World 8
Fizz 3
Buzz 5
PPCG 16
X 9
Тогда произойдет следующее:
*Hello
*Hello *World
*He*Fizz*World
*He*F*Buzzorld
*He*F*Buzzorld *PPCG
*He*F*Buz*Xrld *PPCG
Последняя строка должна быть выведена.
Правила ввода / вывода
Вход может состоять из любого количества пар. Каждая метка будет состоять только из прописных и строчных букв, а длина метки будет составлять не более 127 символов. Каждая x-координата будет между 0 и 127 включительно.
Входные данные могут быть в любом удобном формате списка или строки, так что пары являются однозначными и метки / x-координаты чередуются на входе. Например, формат как
[("Hello", 0), ("World", 8) ...]
или[0 "Hello" 8 "World" ...]
хорошо. Однако вы не можете использовать два отдельных списка меток и x-координат.Функции и полные программы в порядке.
Любые пятна, не покрытые этикеткой, должны быть обозначены пробелом. Тем не менее, не может быть никаких посторонних начальных или конечных пробелов, кроме одного необязательного конечного перевода строки.
Примеры
Входные данные:
OneLabel 10
Выход:
*OneLabel
Входные данные:
Heathrow 0
Edinburgh 2
London 4
Liverpool 6
Oxford 8
Выход:
*H*E*L*L*Oxfordl
Входные данные:
alpha 20
beta 4
gamma 57
delta 3
epsilon 22
zeta 32
eta 53
theta 27
Выход:
*delta *a*epsi*thetazeta *eta*gamma
Входные данные:
abc 5
d 5
abc 10
ABCDEFGHIJKLMNOPQRSTUVWXYZ 127
Выход:
*dbc *abc *ABCDEFGHIJKLMNOPQRSTUVWXYZ
Обратите внимание, что метки и / или X-координаты могут повторяться.
Ответы:
CJam,
242319 байтовЭто читает входные данные как массив CJam пар координатных меток.
Попробуйте эту скрипку в интерпретаторе CJam или проверьте все тестовые случаи одновременно.
Спасибо @ MartinBüttner за помощь в экономии 4 байтов!
Как это работает
источник
Pyth, 20 байт
Попробуйте онлайн: демонстрация или тестовый набор
объяснение
источник
JavaScript ES6, 104 байта
Пример использования
Вход в совместимую консоль:
Вывод из последнего утверждения:
объяснение
Это создает анонимную функцию из
c
трех выражений, которые были логически объединены. Первые два утверждения всегда верны, и правила короткого замыкания JS гласят, что всякий раз, когда первое верно, верните все значение в правой части (без приведения к логическому значению): так что это формально эквивалентноПервый оператор должен быть заключен в скобках выше , потому что оператор присваивания
=
имеет более низкий приоритет , чем логический И-оператор&&
.Сборка «Параметр отдыха»
..."*"+v
также является частью ES6; он объединяет ведущий*
в строку, а затем интерпретирует его как список-подобный параметр, разбивая его на набор аргументов, которые предоставляютсяArray.prototype.splice
, который принимает(m, n, ...rest)
и изменяет свой массив в позицииm
для удаленияn
элементов, а затем вставляет всеrest
аргументы. Для этого до ES6 вы бы использовали более громоздкие:Затем массив соединяется с пустой строкой, а завершающий пробел удаляется.
источник
Python 2, 67 байт
Принимает вход как
[('Heathrow', 0), ('Edinburgh', 2), ('London', 4), ('Liverpool', 6), ('Oxford', 8)]
и печатает результат.Python не позволяет изменять строки, а преобразование в список и из списка стоит дорого. Таким образом, это воссоздает строку,
z
чтобы добавить новое слово. Мы беремb
символы перед словом, добавляя пробелы, если необходимо, затем новый текст со звездочкой, а затем частьz
после нового слова. Обратите внимание, что завершающие пробелы никогда не добавляются.reduce
Версия 3 символов больше (70):источник
Рубин,
948175 байтGolfed:
Вот незагрязненный код:
Спасибо @ w0lf за предложения по отображению входных данных!
Спасибо @ w0lf и @ Не, что Чарльз за мысль об удалении переменной.
источник
puts
на$><<
(что не требует дополнительного пробела)..chomp
могут быть удалены..to_i
поймает это. Хорошая мысль. Спасибо @ w0lf!s[int, int]
форму, а неs[range]
для экономии 1 символа.Javascript 121 символ
Используя нестандартные функции, работает на Firefox.
x=Array(255).fill(" ");eval(prompt()).map(s=>{s[0].split``.map((n,i)=>x[s[1]+i+1]=n);x[s[1]]="*"});x=x.join``.trimRight()
Старая версия:
x=Array(255).fill(" ");eval(prompt()).map(s=>{s[0].split``.map((n,i)=>x[s[1]+i+1]=n);x[s[1]]="*"});x=x.join``.replace(/ +$/,"")
источник
/ +/
имеет больше смысла, чем\s
разочарован, я пропустил это! Не могли бы вы сохранить байты, используяx=' '.repeat(255);
и избегая.join
?.split('')
преобразовать их в изменяемую структуру данных, но на этом этапе ониArray(255).fill(' ')
будут короче. В моей версии большая часть моих сбережений получена за счет (а) использования правила «Вы можете дать функцию или программу» для удаленияeval(prompt())
в обмен наc=>
и (б) использования встроенногоArray.prototype.slice
метода с параметром rest, чтобы немного сократить логическую часть ,[].map.call(s[0],
тоже не спасает ...Python, 85 байт
Попробуйте онлайн
источник
'z'[2::5]
(галочки вместо апострофов) вместо того,''.join(z)
чтобы сохранить один байт, а переходz=[' ']*256
к параметрам должен сохранить другой. Кроме того, я думаю, что вы можете изменитьreturn
наprint
.p=input()
(Python 2), а не функцию, которая позволяет избежать отступов. Кроме того,b+len(a)+1
может бытьb-~len(a)
for a,b in input():
.Perl, 66 байт
Сценарий 63 байта + 3 байта для
-p
Ничего особенного, используя переменные
$`
и$'
которые не являются «перед матчем» и «после матча» соответственно, вместо разделения строки. Я использовал$}
для строковой переменной, так как изначально она спасла мне байт, но больше нет!Пример выполнения:
Perl, 65 байт
Скрипт на 62 байта + 3 байта для
-p
Еще одна версия, которая печатает каждую строку (на один байт меньше!). (Да, я сделал это, потому что я не прочитал вопрос должным образом ...)
Пример выполнения:
источник
PHP - 84 байта
Использует управляющие коды ANSI для позиционирования курсора (
\x1b[XG
с символом Escape и X является координатой, основанной на 1), за которой следует*
строка ввода для этой строки. Принимает ввод в командной строке вида:Принимает записи из нескольких слов, если они в кавычках, поскольку они являются аргументами командной строки.
источник
C ++ 11, 95 байт
Почему бы нет?
Как функция, получите входные данные в виде
map<int, string>
имен,v
содержащих позицию и строку.использование
Проверьте это работает здесь
источник