Чтобы «вложить» строку, вы должны:
Рассматривайте первый символ как функцию, а следующие символы как аргументы этой функции. Например, если входная строка была
Hello
, то первым шагом будет:H(ello)
Затем повторите этот же шаг для каждой подстроки. Итак, мы получаем:
H(ello) H(e(llo)) H(e(l(lo))) H(e(l(l(o))))
Ваша задача - написать программу или функцию, которая "вложит" строку в функцию. Например, если входная строка была Hello world!
, то вы должны вывести:
H(e(l(l(o( (w(o(r(l(d(!)))))))))))
Входные данные будут содержать только печатный ASCII , и вы можете принимать входные и выходные данные в любом приемлемом формате. Например, STDIN / STDOUT, аргументы функции и возвращаемое значение, чтение и запись в файл и т. Д.
Для простоты вы можете также предположить, что ввод не будет содержать скобок и не будет пустым.
Input:
Nest a string
Output:
N(e(s(t( (a( (s(t(r(i(n(g))))))))))))
Input:
foobar
Output:
f(o(o(b(a(r)))))
Input:
1234567890
Output:
1(2(3(4(5(6(7(8(9(0)))))))))
Input:
code-golf
Output:
c(o(d(e(-(g(o(l(f))))))))
Input:
a
Output:
a
Input:
42
Output:
4(2)
Как обычно, применяются все наши правила и лазейки по умолчанию, и выигрывает самый короткий ответ в байтах!
источник
You may take the input and the output in any reasonable format.
Список символов кажется мне вполне разумным.Ответы:
Python,
413934 байтаIdeone это
Довольно понятно.
Он ставит круглые скобки между всеми остальными символами, а затем добавляет на единицу меньше скобок длины.
источник
-
делает число отрицательным и~
немного переворачивает его. Вы можете прочитать немного больше об этом на странице советов .MS-DOS .com файл, 30 байт
Строка передается в исполняемый файл с помощью командной строки. (Один пробел между именем файла .COM и строкой).
Результат записывается в стандартный вывод.
Разборка здесь:
Примечание. Вы можете выйти из файла .COM DOS (в отличие от файлов с заголовками EXE), используя инструкцию «RET».
источник
call 0xfoff
?0
Насколько я могу судить, программа загружается в память по адресу (или0x100
в CP / M-DOS, но, похоже, это инструкции x86), почемуrecursiveFunction
вдруг находится в0xffof
? Кажется, он начинается через 9 байт после начала программы, и в исполняемом файле нет виртуализации или метаданных.0x100
однако эта программа будет работать даже на ЛЮБОМ адресе:e8 f0 ff
это относительная инструкция вызова: она переходит на адрес инструкции, следующей заcall
инструкцией минус 0x10.JavaScript (ES6),
403433 байтаСохранено 6 байтов благодаря ETHproductions
Рекурсивная функция.
Попробуйте онлайн!
источник
1/s
.([c,...s])
вами следует написать советBrainfuck,
4240 байтПопробуйте онлайн!
Ungolfed:
источник
05AB1E , 11 байт
Попробуйте онлайн!
Объяснение:
источник
Brainfuck, 44 байта
Читает байт за раз, ставит перед каждым, кроме первого, открытый символ «парен», в конце ставит одинаковое количество «парэнс».
источник
+++++[->++++++++<],.,[>.>+<<.,]>+>[-<.>]
немного короче.Haskell, 30 байт
Пример использования:
f "Nest a string"
->"N(e(s(t( (a( (s(t(r(i(n(g))))))))))))"
.Возьмите следующий символ, за которым следует a
(
, затем рекурсивный вызов со всеми, кроме первого символа, за которым следует a)
.источник
f=Data.List.intersperse '$'
! Это дает намf "Nest a string"
->"N$e$s$t$ $a$ $s$t$r$i$n$g"
.f[]=[]
в качестве базового варианта вместо вашегоf[x]=[x]
. Я не знаком с Хаскеллом, поэтому не знаю, законно это или нет, я позволю тебе судить.()
букву после последней буквы, напримерf "abc"
->"a(b(c()))"
.f=(++).intersperse '('<*>drop 1.map(\_->')')
.intersperse
требуетсяimport Data.List
еще 17 байтов.Желе ,
98 байт-1 байт благодаря @Dennis (используйте пресс-форму
ṁ
вместо длиныL
и повторитеx
)TryItOnline
Как?
источник
³
фактически заставляет Jelly печатать текущее возвращаемое значение, поэтому у вас никогда не будет двух списков символов.Сетчатка ,
2217 байтПопробуйте онлайн!
В качестве альтернативы:
объяснение
Я всегда забываю, что можно печатать вещи по пути, вместо того, чтобы преобразовывать все в конечный результат и выводить его за один раз ...
Здесь
\
говорится, что Retina печатает результат этого этапа без завершающего перевода строки. Это1>
предел, который означает, что первое совпадение регулярного выражения следует игнорировать. Что касается самой стадии, она просто заменяет каждый символ (.
), за исключением первого,(
за которым следует этот символ. Другими словами, он вставляет(
между каждой парой символов. Для вводаabc
это преобразует его в (и печатает)Осталось только напечатать закрывающие скобки:
Это делается с помощью транслитерации , которая заменяет
(
с)
и удаляет все другие печатные символы ASCII из строки.источник
> <> ,
1918 байтПопробуйте онлайн!
объяснение
Первая строка представляет собой цикл ввода, который печатает все до последнего символа ввода (включая все
(
) и оставляет нужное количество)
в стеке:Как только мы нажимаем EOF, указатель инструкции заканчивается на второй строке, и мы просто выполняем
o
цикл, печатая все)
, пока стек не опустеет и программа не выдаст ошибку.источник
J, 13 байт
J выполняется справа налево, поэтому, используя наречие вставки
/
, можно использовать глагол, чтобы уменьшить буквы входной строки.использование
Вы можете наблюдать частичные выходы между каждой редукцией.
объяснение
источник
C #, 32 байта
Эта лямбда должна быть статическим методом, нужно ли мне подсчитывать дополнительные байты для этого требования? Обычно я не использовал бы лямбду для рекурсии в C #, но тогда я думаю, что было бы короче не использовать рекурсию.
источник
R 61 байт
Regex находит и заменяет пробелы между символами на "(". Затем
cat
иrep
добавляет ")" n-1 раз в конце.источник
Java 7,
8179 байтСохраненный
1
байт. Спасибо Кевину.источник
l!=a.length
l<a.length
b=b+'('+a[l],++l)+')'
b+="("+a[l],++l)+")"
b+="("+a[l],++l)+")"
дает вам 144141148))), и, кстатиb+"("+a[l],++l)+")"
, правильно. и это была моя очень глупая ошибка (!=
).b+='('+a[l],++l)+')'
дает144141148
, ноb+="("+a[l],++l)+")"
не делает. Скобки заключены в кавычки вместо строковых кавычек.PowerShell v2 +, 46 байт
Принимает входную строку,
char
-array's it,-join
массив вместе с открытыми паренами(
, затем объединяет соответствующее количество закрытых паренов)
.источник
APL, 19 байт
Объяснение:
Альтернативное решение, также 19 байтов:
Объяснение:
источник
MATL , 16 байт
Попробуйте онлайн!
объяснение
источник
Точность !! 129 байтов
Неплохо для довольно многословного тарпита Тьюринга ...
(Да, все эти пробелы являются обязательными.)
Примечание: из-за ограничений ввода Acc! , невозможно прочитать произвольную строку символов без некоторого конечного разделителя. Поэтому эта программа ожидает ввода (в stdin) в виде строки, за которой следует символ табуляции.
Точность !! ?
Это язык, который я создал, который кажется непригодным для использования . Единственным типом данных являются целые числа, единственной конструкцией потока управления является
Count x while y
цикл, а единственным способом хранения данных является один аккумулятор_
. Ввод и вывод выполняются по одному символу за раз, используя специальное значениеN
иWrite
оператор. Несмотря на эти ограничения, я вполне уверен, что Acc !! завершена по Тьюрингу.объяснение
Основная стратегия в Acc !! программирование заключается в использовании модового
%
и целочисленного деления/
для концептуального разбиения аккумулятора, что позволяет ему хранить несколько значений одновременно. В этой программе мы используем три таких раздела: семь битов младшего порядка (_%128
) хранят код ASCII из ввода; следующий бит (_/128%2
) хранит значение флага; а оставшиеся биты (_/256
) подсчитывают количество близких паренов, которые нам понадобятся.Вход в Acc !! происходит от специального значения
N
, которое считывает один символ и оценивает его код ASCII. Любой оператор, который состоит исключительно из выражения, присваивает результат этого выражения аккумулятору. Итак, начнем с хранения кода первого символа в аккумуляторе._%128
будет хранить последний прочитанный символ Таким образом, первый цикл выполняется, пока он не_%128-9
равен нулю, то есть до тех пор, пока текущий символ не станет вкладкой.Внутри цикла мы хотим печатать,
(
если не будем на первой итерации. С Акк !! не имеет оператора if, мы должны использовать циклы для условных выражений. Мы используем 128-разрядный бит аккумулятора_/128%2
как значение флага. На первом проходе единственное, что в аккумуляторе - это значение ASCII <128, поэтому флаг равен 0 и цикл пропускается. На каждом последующем проходе мы будем следить за тем, чтобы флаг был равен 1.Внутри
Count x
цикла (всякий раз, когда флаг равен 1), мы записываем открытый код (ASCII40
) и добавляем 128 к аккумулятору, тем самым устанавливая флаг в 0 и выходя из цикла. Это также происходит, чтобы_/256
увеличить значение , которое мы будем использовать в качестве нашего подсчета близких паренов, которые будут выведены.Независимо от значения флага мы пишем самый последний входной символ, который просто
_%128
.Следующее присваивание (
_+128-_%128+N
) делает две вещи. Сначала, добавив 128, он устанавливает флаг в следующий раз в цикле. Во-вторых, он обнуляет_%128
слот, читает другой символ и сохраняет его там. Затем мы делаем петлю.Когда
Count i
цикл завершается, мы только что прочитали символ табуляции, и значение аккумулятора распадается следующим образом:_%128
:9
(символ табуляции)_/128%2
:1
(флаг)_/256
: количество прочитанных символов, минус 1(Минус 1 в том, что мы добавляем 128 к аккумулятору только один раз во время первого прохода через главный цикл.) Все, что нам сейчас нужно, это близкие скобки.
Count j while _/256-j
зацикливание_/256
раз, запись близкого парня (ASCII41
) каждый раз. Вуаля!источник
Perl, 25 байт
Спасибо @Ton Hospel за 4 байта в гольфе.
24 байта кода +
-F
.Нужды
-F
и-E
флаги:Обратите внимание, что если вы попробуете это на старой версии Perl, вам может понадобиться добавить
-a
флаг.Еще один интересный способ (хотя и немного дольше: 28 байт):
Спасибо Тону Хоспелу за то, что он помог мне сделать это правильно.
(Чтобы использовать его, поместите код в файл и вызовите его с помощью
echo -n "Hello" | perl nest.pl
)источник
""
после-F
. Вам также не нужно-l
вводить строку ввода без заключительного перевода строки:echo -n Hello | program
-F
, спасибо. (Мне было интересно, как получить ввод без последнего перевода строки, спасибо за это тоже)perl -F -E '$"="(";say"@F".")"x$#F'
s/.(?=.)/s%$'%($&)%/reg
, но она, конечно, не поддерживает строки, содержащие метасимволы регулярных выражений\Q
для поддержки метасимволов регулярных выражений) :-)Рубин, 27 байт
объяснение
источник
Perl,
2423 байтаВключает +1 для
-p
Дать строку на STDIN без новой строки (или добавить
-l
опцию в программу)nest.pl
:источник
PHP, 63 байта
Предыдущая версия 64 байта
источник
<?=
вместо,echo
и еще один, если вы установите $ s для результатаstr_split
вызова вместо$argv[1]
, а затем используетеcount($s)
вместоstrlen($s)
<?=str_pad(join("(",$s=str_split($argv[1])),count($s)*3-2,")");
-wordwrap
превзойдет комбинацию split / join, но, к сожалению, не удастся, если вход содержит пробел.GNU sed,
373531 байт (30 +1 для-r
аргумента)Чистый Linux lin решение
:
; затем вызывая это рекурсивно сt
\1 ( \2 )
Редактировать : Спасибо @manatwork за помощь в удалении 4 символов!
Онлайн тестер
источник
-e
передать код переводчику бесплатно. (Хорошо,sed
без этого тоже счастлив.) Так что дляsed -re '…'
вас считается +1.Медуза ,
1918 байтСимвол
␁
является непечатаемым управляющим символом с байтовым значением0x1
. Попробуйте онлайн!объяснение
Это довольно сложная программа Jellyfish, так как многие значения используются в разных местах.
I
является необработанным вводом, читаемым из STDIN в виде строки.'(
это буквальный символ(
.{
(Левая идентичность) принимает'(
и вI
качестве входных данных и возвращает'(
. Возвращаемое значение фактически никогда не используется.`
это нить. Он модифицируется так,{
чтобы возвращать символ(
для каждого символаI
, в результате чего получается строка(
s такой же длины, что иI
.>
хвост; он принимает строку(
s в качестве входных данных и отсекает первый символ.+
принимает в качестве аргументов строку(
s и непечатаемый байт и добавляет значение байта (1) к каждому символу. Это дает строку одинаковой длины)
s. Использование символа␁
гарантирует, что возвращаемое значение является строкой, а не списком целых чисел./
берет непечатаемый байт и возвращает функцию, которая принимает два аргумента, и объединяет второй аргумент с первым один раз (поскольку значение байта равно 1)._
берет эту функцию, захватывает аргументы нижнего{
(которые были'(
иI
) и вызывает функцию с ними. Это вставляет символ(
между каждой парой символов вI
.,
объединяет эту строку со строкой)
s иP
печатает результат.источник
05AB1E ,
22211918 байтПопробуйте онлайн!
Объяснение:
источник
Vim, 17 байт
$qqha(<Esc>A)<Esc>%h@qq@q
Идет от конца к началу, потому что в противном случае вы запутаетесь в
)
уже написанном. Используетha
вместоi
провала, когда достигает начала.Обычно вы бы не делали две отдельные вставки, подобные этой; Вы бы сделали что-то вроде,
C()<Esc>P
чтобы сохранить удар. Но на этот раз позиционирование не работает.источник
<End>
ключ в режиме вставки вместо того, чтобы выходить из режима вставки и делатьA
Выпуклый , 10 байт
Попробуйте онлайн!
источник
> <> , 37 байт
Ряд за рядом
Попробуйте онлайн!
источник
Brain-Flak
10397 BytesВключает +3 для -c
Попробуйте онлайн!
Объяснение:
источник
{({}<><(((((()()){}()){}){}){})>)<>}<>({}<(({})<>())><>)([]){({}[()()]<(<>({})<>)>)}{}{}{({}<>)<>}<>{}
что на два байта больше ...-a
в Brain-Flak все равно 3 байта ?+3
Байт является стандартным для специальных флагов командной строки . К сожалению, но я могу с этим смириться. Я на самом деле думал о том, чтобы сократить это, но я не совсем уверен, как это сделать.-
и один за флаг? Вы можете иметь флаг для нормального выполнения, как это делает Perl-e
. Таким образом, это будет только 1 дополнительный байт.Фактор, 81 байт
источник