Спасибо @KritixiLithos за помощь в решении этой проблемы!
V - это язык программирования, который я написал, чтобы я мог использовать и расширять vim для задач, связанных с использованием кода. Самый первый коммит был 3 марта 2016 года, то есть сегодня V исполняется один год! Woo-Hoo
За первый год существования V было 176 коммитов от четырех разных участников, 140 ответов от 12 разных пользователей и слишком много неработающих дублирующих операторов, чтобы сосчитать . У него есть онлайн-переводчик , великодушно поддерживаемый @Dennis, который с декабря работал почти 8 000 раз .
Давайте вызовем отпраздновать день рождения V! Поскольку большинство функций в V разработаны с учетом работы со строками и ascii-art , просто кажется естественным, что любой вызов празднованию V должен быть связан с ascii art. Таким образом, ваша задача на сегодня - принять слово в качестве входных данных и изменить это слово в форме буквы V. Например, вход «Hello» должен дать следующий V:
Hello olleH
Hello olleH
Hello olleH
Hello olleH
Hello olleH
HellolleH
HellleH
HeleH
HeH
H
Вот некоторые подробности о том, как должен выглядеть ваш V. Если длина входной строки составляет n символов, значение V должно быть n*2
высотой строки. Самая первая строка должна состоять из:
<input string><(n*2) - 1 spaces><input string reversed>
В каждой новой строке один пробел добавляется в начало, и две стороны строки перемещаются навстречу друг другу, удаляя все перекрывающиеся символы. До самой последней строки, которая является только первым символом ввода. Конечный пробел в каждой строке является приемлемым, также допускается завершающий символ новой строки.
Вы можете предположить, что ввод всегда будет печатным ASCII без каких-либо пробелов в нем, и вы можете принимать ввод и вывод любым разумным способом. Вот еще несколько примеров входных данных:
Happy:
Happy yppaH
Happy yppaH
Happy yppaH
Happy yppaH
Happy yppaH
HappyppaH
HapppaH
HapaH
HaH
H
Birthday:
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
BirthdayadhtriB
BirthdadhtriB
BirthdhtriB
BirthtriB
BirtriB
BiriB
BiB
B
V!:
V! !V
V! !V
V!V
V
~:
~ ~
~
Конечно, поскольку это код-гольф , стандартные лазейки запрещены, и ваша цель - написать максимально короткую программу для выполнения этой задачи. Удачного игры в гольф!
Что бы это ни стоило, у меня есть слабость к ответам vim, поэтому воображаемые бонусные баллы за использование vim или V, хотя любой язык приемлем. :)
Ответы:
MATL ,
2114 байтMATL поздравляет V с днем рождения!
Попробуйте онлайн!
объяснение
Рассмотрим вход
длины
n=5
. Код вычисляет двумерную свертку этой строки с единичной матрицей размера2*n
,Результат свертки, преобразованный в char и с char 0, показанным как пробел, равен
Затем столбцы
[1, 2, ..., 2*n-1, 2*n, 2*n-1, ..., 2, 1]
выбираются из этой матрицы символов, давая желаемый результат:Код комментария
источник
V ,
24, 23, 20 байтовПопробуйте онлайн!
Гораздо короче теперь, когда V имеет «обратный» оператор .
Не так впечатляет по сравнению с другими языками гольфа, которые ответили, но это нужно было сделать. HexDump:
Объяснение:
На данный момент буфер выглядит так:
Нет, мы рекурсивно построим треугольник вниз.
Здесь я хочу показать одну из моих любимых функций V. Многим командам требуется аргумент. Например,
>
команда будет отступать переменное число строк в зависимости от аргумента:но большинство команд будут вынуждены заканчиваться аргументом по умолчанию (обычно текущей строкой), если он находится в конце программы и не указан. Например, что на самом деле работает для нашего рекурсивного цикла:
Второе
ò
неявно заполнено. Круто то, что неявно завершенные команды применяют несколько уровней по глубине, поэтому, даже если мы только написали>
, V неявно предоставит_
свой аргумент и будет отступать текущую строку.источник
Brainfuck , 152 байта
Это такой знаменательный случай, я решил раскрутить старого BF-переводчика и дать ему шанс.
С комментариями
Попробуйте онлайн!
источник
> <> , 221 байт
Я потратил путь слишком много времени на это. С Днем Рождения, V!
Вы можете попробовать это онлайн , но гораздо интереснее получить этот интерпретатор и запустить его, используя
--play
флагчто приводит к анимации ниже.
пример
(это занимает чуть меньше двух минут)
объяснение
Поскольку интересная часть этого ответа заключает его в
V
форму, вот объяснение, которое ему соответствует. Мы используем следующую номерную версию для справки.Иногда стрелки (→ ↓ ←) используются для указания направления, в котором достигается фрагмент.
Инициализация
Первая строка переведет 2n в [0,1], оставит n в стеке и добавит один пробел. Затем мы поднимаемся и переходим ко второй строке справа, где мы начинаем идти налево. Есть цикл для добавления n + 1 пробелов. Это работает следующим образом.
После этого он возвращается к строке 3. Там удаляются два верхних элемента стека (0 и пробел) (
~~
), и мы переходим к позицииX
at [10,1] (a1.
), продолжая движение вправо. Мы поднимаемся в/
, переходим к строке 7 и запускаем основной цикл программы.Основной цикл ( 2n раз)
Это условие цикла. Во-первых, стопка обращена для печати. Затем мы получаем счетчик из [1,0] (
01g
) и сохраняем уменьшенную версию (:1-01p
). Обернувшись вокруг и столкнувшись с проблемой, мы сталкиваемся с условием завершения программы. Если мы не закончим, мы перейдем к первому циклу печати.Первая печатная петля (левая половина)
Мы начинаем с длины на вершине стека и выполняем следующий код, пока верхний элемент не равен 0.
Это напечатает стопку, не выбрасывая ее. Если цикл завершается, мы переходим вправо в строке 5, готовясь к следующему циклу печати.
Подготовка правой половины
Это была одна из самых сложных частей для подбора. Ниже приведена версия, в которой нет указаний на то, что происходит.
Затем мы нажимаем длину того, что должно быть напечатано, и запускаем второй цикл печати (с первоначальным дубликатом, не являющимся частью цикла).
Вторая печатная петля (правая половина)
Выполняемый код полностью такой же, как и в первом цикле печати, с
o}
размещением немного дальше, потому что были доступные места. По окончании у нас осталось несколько дел, прежде чем мы сможем снова проверить инвариант основного цикла. После выполнения~
строки 9 мы оборачиваемся вертикально, заканчивая следующим фрагментом кода.Сначала
ao
будет напечатан перевод строки. Затем мы подпрыгиваем и достигаем точно такого же места после инициализации, а именно, прыжка кX
.источник
Brain-Flak , 486 + 1 = 489 байт
С Днем Рождения V от Brain-Flak!
Также спасибо 0 ', который предоставил часть кода, используемого в этом ответе
+1 из-за
-c
флага, который требуется для входа и выхода ASCIIПопробуйте онлайн!
Без сомнения, это самая трудная вещь, которую я когда-либо делал в Brain-Flak.
Brain-Flak общеизвестно ужасен при дублировании и обращении строк, и эта задача состоит только из дублирования и обращения строк.
Мне удалось получить этот почти рабочий фрагмент за час тяжелой работы, но добавление в последние несколько пробелов оказалось одной из самых сложных вещей, которые я когда-либо делал в Brain-Flak.
объяснение
Основная идея заключается в том, что мы сначала создадим верхнюю часть V, и каждая итерация удалит два символа из середины и добавит пробел в начало.
На практике это становится довольно сложно.
Существуют алгоритмы для копирования и реверсирования, поэтому я использовал один из них для создания обратной копии кода в оффстаке. После того, как я это сделал, я помещаю
2n-1
пробелы поверх оригинального стека и перемещаю его обратно в стек, чтобы создать бутерброд.Теперь у нас есть верхний ряд. Теперь мы хотим удалить два символа с начала и добавить пробел вперед. Это оказывается самой сложной частью. Причина этого заключается в том, что нам необходимо сохранить два значения: одно для глубины текущего фрагмента, а другое для глубины до центра V, где должно произойти удаление.
Это трудно.
Из-за всего происходящего дублирования и обращения оба стека постоянно используются в полной мере. На этих стеках действительно негде что-либо положить. Даже со всей третьей магией стека в мире вы не можете получить доступ, необходимый для решения этой проблемы.
Так как же это исправить? Короче говоря, мы не очень; мы пока игнорируем пробелы и исправляем их позже, мы добавим нули в код, чтобы пометить, куда пробелы должны идти, но в остальном мы ничего не будем делать.
Таким образом, на каждой итерации мы делаем копию последней итерации и помещаем ее в стек. Мы используем глубину, которую мы сохранили, чтобы разделить это пополам, чтобы у нас была левая половина V в правом стеке и правая половина V в левом стеке. Мы удаляем два элемента и соединяем их вместе. Мы добавили новую строку для хорошей меры и начали следующую итерацию. Каждый раз, когда глубина до центра V уменьшается на единицу, и когда она достигает нуля, мы останавливаем цикл.
Теперь у нас есть большая часть V построена. Однако нам не хватает надлежащих пробелов, и наш V в настоящее время немного (читай: полностью) с ног на голову.
Таким образом, мы перевернем это. Чтобы перевернуть его на другой стек, нам нужно переместить каждый элемент по одному. Поскольку мы перемещаем элементы, мы проверяем нули. Если мы сталкиваемся с одним из них, мы должны вернуть места туда, где они должны быть. Мы бросаем ноль и добавляем кучу пробелов. Откуда мы знаем, сколько? Мы отслеживаем; переворачивание стека в отличие от дублирования или реверсирования - очень неинтенсивная задача, поэтому у нас фактически есть память для хранения и доступ к дополнительному счетчику для отслеживания количества добавляемых пробелов. Каждый раз, когда мы добавляем несколько пробелов, мы уменьшаем счетчик на единицу. Счетчик должен достичь нуля на последней новой строке (в верхней части буквы V), и, таким образом, мы готовы к печати.
Наконец, мы убираем несколько вещей и закрываем программу для неявного вывода.
источник
-r
флаг?-r
флаг, мне нужно будет на самом деле поменять его в другой раз. Там, где я нахожусь, уже поздно, но я думаю, что завтра я постараюсь существенно поиграть в эту игру. Если я смогу решить проблему с пробелами, я обязательно буду использовать-r
флаг.Желе ,
1512 байтПопробуйте онлайн!
Как это устроено
источник
Python 3 , 65 байт
Попробуйте онлайн!
Python 2 , 65 байт
Попробуйте онлайн!
источник
JavaScript (ES6),
1081069894 байтовисточник
n*2
отn*4
( в том числе новых строк в конце каждой строки). Затем я вычисляю символ, который должен появиться в каждой ячейке.f=
иs=>
.f=
только часть фрагмента, а не ответ. Как таковой, он не включен в число байтов.Retina ,
5147 байтС Днем Рождения!
Число байтов предполагает кодировку ISO 8859-1.
Попробуйте онлайн!
объяснение
Это добавляет
n
пробелы (гдеn
длина строки), сопоставляя конец строки, получая длину строки$.`
и повторяя пробел, который много раз с$*
.Мы дублируем всю строку (разделенную переводом строки), снова сопоставляя конец строки и вставляя саму строку с помощью
$`
.Это переворачивает вторую строку путем сопоставления справа налево (
r
), затем сопоставляя один символ за раз (.
), но убедившись, что они все смежные (\G
). Таким образом, матчи не могут пройти через перевод строки. Это тогда используется в стадии сортировки. Используя метод sort-by ($
), но заменяя каждое совпадение пустой строкой, фактическая сортировка не выполняется. Но из-за этой^
опции, спички в конце меняются местами, переворачивая всю вторую строку.Эта стадия предназначена для вывода и также влияет на остальную часть программы.
{
оборачивает оставшиеся этапы в цикл, который повторяется до тех пор, пока эти этапы не изменят строку (что произойдет, потому что последний этап больше не будет соответствовать).;
Выход отключает в конце программы. На*
очереди этого этапа в сухую перспективе это означает , что этап обработку и результат выводится, но после предыдущей строки восстанавливается.Сама сцена просто удаляет перевод строки и предыдущий символ. Что дает нам одну строку желаемого результата (начиная с первой строки).
Наконец, этот этап превращает каждую строку в следующую. Это делается путем вставки пробела перед первым непробельным символом, удаления последнего символа в первой строке, а также первого символа во второй строке. Этот процесс останавливается, когда в первой строке остается только один непробельный символ, соответствующий последней строке выходных данных.
источник
s///
символов, которые складываются, из-за более длинного обращения строк и других операций, в которых нет тонкости Retina. Хорошо читать. +105AB1E , 12 байтов
Попробуйте онлайн!
объяснение
Или для того же подсчета байтов с другого направления.
объяснение
источник
Japt,
22201614 + 2 байтаДжапт желает V успешных лет игры в гольф!
Требуется
-R
флаг. Проверьте это онлайн!объяснение
Это использует
ç
иî
функции я добавил несколько дней назад:Техника Денниса на байт длиннее:
источник
GNU sed ,
110100 + 1 (флаг r) = 101 байтИзменить: 9 байтов короче благодаря Райли
Как еще один язык манипулирования строками, sed желает V всего наилучшего!
Попробуйте онлайн!
Объяснение: предполагается, что ввод - последний тестовый случай ('V!'). Для ясности я покажу пространство шаблонов на каждом шаге, заменив пробелы символами «S».
источник
Python, 110 байт
Попробуйте онлайн!
Я уверен, что это не оптимально, но по крайней мере это довольно Pythonic:
источник
Джольф, 31 байт
Джольф с неохотой поздравляет В с днем рождения!
Попробуй это здесь!
␅
должно быть 0x05.объяснение
источник
Древесный уголь , 29 байт
С Днем Рождения V, от твоего приятеля, разочаровывающего язык искусства ASCII!
Попробуйте онлайн!
объяснение
Наша стратегия: печатать левую половину буквы V, начиная снизу и двигаясь вверх слева; затем отразить это.
(Если бы только древесный уголь имел нарезку строк ... увы, похоже, это еще не было реализовано.)
источник
CycleChop
, что можно использовать для извлечения заголовка строки, что позволило сэкономить 4 байта. Тем не менее, есть лучший подход, который экономит 9 байтов. Еще несколько сбережений, которые, я думаю, также работали в то время:Reflect
значения по умолчанию отражают справа, сохраняя еще один байт, и одна из переменных предопределена для первого ввода, сохраняя два байта.Пип ,
3225 байтПринимает входную строку в качестве аргумента командной строки. Попробуйте онлайн!
объяснение
источник
R с пакетом stringi, 225 байт
Если вы запускаете R в интерактивном коде, после вставки моего ответа просто введите что-нибудь. Вам понадобится установить пакет stringi R (надеюсь, это не противоречит правилам).
Объяснение:
Основная идея состоит в том, чтобы добавить пробелы с левой стороны, а затем обрезать его до нужной длины. После этого вставьте его с обратной версией в качестве правой стороны. Вот более длинная, удобочитаемая версия функции:
источник
Рубин,
928985 байтМой процесс состоял в том, чтобы удалить первый символ из правой половины каждой строки после изменения первой половины. Нравится:
Я не привык пытаться играть в гольф, поэтому дайте мне знать, если я могу что-нибудь сделать, чтобы сделать это короче.
источник
Пакет,
186185 байтЛинии 1 и 6 имеют завершающий пробел. Редактировать: 1 байт сохранен благодаря @ ConorO'Brien.
источник
@set
и удалите@echo off
, вставляя по@
мере необходимости.set
секунд сэкономят мне достаточно байтов, чтобы это стоило того.Haskell , 76 байт
v
является основной функцией, принимаяString
аргумент и даваяString
результат.Попробуйте онлайн!
Примечания:
i
это начальный аргумент / вход.s
изначальноi
сlength i
пробеламиv i
звонкиr s
, а затем соединяет строки результатов.r
возвращает списокString
строк.t
этоs
с последним символом отрубили.r t
создает строки, кроме первой, минус начальный пробел в каждой строке.источник
v
. : Dunlines.r.((++)<*>(' '<$))
.Желе , 13 байт
Попробуйте онлайн!
Как?
источник
Рубин,
8583 байтаредактировать: удалены лишние пробелы
На самом деле мне было довольно сложно сыграть в гольф в Ruby. После добавления пробела он расширяется до довольно читабельного фрагмента кода:
источник
s=ARGV[0];(s+=' '*s.size).size.times{|i|puts s+s[i..-2].reverse;s=' '+s[0..-2]}
MATLAB (R2016b),
223183 байтаПервый раз Код Гольф. Советы приветствуются!
Выход программы:
Редактировать:
Сохранено 40 байтов благодаря Луису Мендо.
источник
's'
изinput
. Кроме того, я не понимаю, почему вы используетеevalc(disp(...))
, но я думаю, что вы можете просто использоватьcell2mat
этот путьflip
корочеend:-1:1
, смотрите здесьPHP,
959285807877 байтПримечание: используется кодировка IBM-850
Запустите так:
объяснение
Tweaks
str_pad
умолчанию пробел, что нам и нужно)substr
~"0"
регистр (ASCII 207), так как все входные данные можно считать печатными ascii (Thx @Titus)источник
echo$s,strrev($s=" $s"^$s^$s),~§;
экономит 5 байтов.~$s[$i++]
достаточно (входные данные для печати ASCII, и так$s
JavaScript (ES6),
169157 байт(-10 байтов благодаря Конору О'Брайену)
Рекурсивное решение. Я новичок в JavaScript, поэтому, пожалуйста, будьте осторожны! Любые советы по гольфу очень ценятся. :)
И, конечно же, очень поздравляю вас с днем рождения
V
!Тестовый фрагмент
Показать фрагмент кода
источник
s.split("")
может быть изменено на[...s]
иa.join("")
можетa.join
сопровождаться парой кавычек. Вы можете сохранить дополнительные 3 байта, заменив[r='repeat']
и[r]
повторив обычное, то же самое сslice
.CJam , 26 байт
С днем рождения от твоего старого приятеля CJam!
Попробуйте онлайн!
объяснение
источник
PowerShell,
126 байтов,124 байтаВызовите его с одним параметром, например
.\V.ps1 Hello
.Изменить: 2 байта сохранены с подсказкой от AdmBorkBork
источник
$l=($s="$args")|% Le*;
Пайк , 14 байт
Попробуйте онлайн!
источник
JavaScript (ES6), 94 байта
Контрольные примеры
Показать фрагмент кода
источник
J, 44 байта
источник
|."0 1
до|."{
(сохранено 2 байта)