Как программист, вы, вероятно, слышали о прямом и обратном слеше. Но вы слышали о падениях? Вот когда вы берете кучу слешей, соединяете их концы и рисуете их вниз.
Для сегодняшней задачи вы должны написать программу или функцию, которая берет строку, состоящую исключительно из косых черт, и выводит все эти косые черты, нарисованные вниз, в линию, соединяющую их. Это будет намного понятнее, если вы увидите пример. Учитывая строку \\\//\/\\
, вы должны вывести:
\
\
\
/
/
\
/
\
\
Вот некоторые уточнения:
В каждой строке должен быть один слеш.
В первой строке будет 0 пробелов.
Для каждой пары слешей:
Если они отличаются друг от друга, они будут отображены в одном столбце. Например,
\/
даст:\ /
Если они такие же характер, нижний в направлении указал на, что движется вправо для обратной косой черты, а перемещение влево для прямой косой черты. Так
\\//
даст\ \ / /
Каждая строка может иметь дополнительный пробел, если это не меняет внешний вид вывода. Допускается до одного трейлинга и ведущего символа новой строки. Дополнительные пробелы не допускаются !
Чтобы сделать это проще, вы можете предположить, что строка никогда не будет содержать слишком много прямых косых черт. Другими словами, ни один префикс ввода не будет содержать больше прямых косых черт, чем обратной косой черты, поэтому такой ввод, как \\////
или //
никогда не будет дан. Это также означает, что каждый ввод будет начинаться с обратной косой черты.
Если ваш ввод воспринимается как строковый литерал, вы можете избежать обратной косой черты, если это необходимо. Вам также никогда не потребуется обрабатывать ввод, который является пустым или содержит символы, отличные от косой черты.
Вы можете выводить в любом разумном формате .
Как обычно, это задача для игры в гольф , поэтому постарайтесь найти самое короткое из возможных решений, даже если вы выбираете язык, где это довольно сложно. Бонусные баллы за объяснение любых интересных методов, которые вы использовали, чтобы снять байты!
Примеры
#Input
\\\\\\\\\\\
#Output
\
\
\
\
\
\
\
\
\
\
\
#Input
\\\//\\/\//\\///
#Output
\
\
\
/
/
\
\
/
\
/
/
\
\
/
/
/
#Input
\/\/\/
#Output
\
/
\
/
\
/
Ответы:
GNU Sed, 20
Обратите внимание, что
^L
и^H
являются буквальными символами формы и возврата (0x12 и 0x8).Этот ответ работает путем перемещения курсора с помощью символов возврата и возврата. Косая черта / обратная косая черта не дополняются пробелами слева - Не уверен, что это дисквалифицирует этот ответ. Это не работает в TIO, но выглядит хорошо под общими терминалами, такими как
xterm
иgnome-terminal
.Воссоздайте этот сценарий sed следующим образом:
Запустите его следующим образом:
Объяснение:
источник
Древесный уголь ,
131211 байтПопробуйте онлайн! Ссылка на подробную версию кода. Поддерживает дополнительные
//
с. Объяснение:источник
↓¶
= "Двигайся влево" в описании не правильно.\n/
вниз»print \n/ down
потому что чувствовал, что было бы более полезно описать эффект кода, а не его буквальный перевод.MyCode - Do the spec
). Теперь я понимаю, что эффект - двигаться влево; возможно, стоит сказать «Переместить влево (печатая новую строку с направлением печати вниз)».Python 2 ,
5554515753 байта-3 байта (и исправление ошибки) благодаря Фелипе Нарди Батиста
Попробуйте онлайн!
источник
/// , 119 байт
/// не имеет команд ввода, поэтому ввод должен быть встроен в программу. Для этого входная строка просто добавляется без необходимости экранирования.
-d
опцией (состояние программы отображается в скобках перед выполнением каждой команды).Как это устроено
\\/\//
будет добавлен в программу для демонстрации.
используется для представления новых строк во встроенном кодеСокращения
Начало
/=/\/\///M/|%%=N/%|||=C/BA=
программы содержит замены для сокращений для игры в гольф.=
расширяется//
,M
чтобы|%%
,N
чтобы%|||
иC
чтобыBA
.После этого текущая программа становится
Входное перекодирование
Следующий этап преобразует добавленную строку ввода в более удобную форму. Поскольку он полностью состоит из двух командных символов ///, необходимо соблюдать осторожность, чтобы избежать искажения базовой программы.
/\/\\/\/BA\\/
, заменяет строку/\
на/BA\
./\
в настоящее время, поэтому эта замена не влияет на нее.\
s, за которыми следуют последовательности/
s, что вместе с символом вABA
конце базовой программы позволяет выполнять итерацию по ней со следующими заменами.ABA
префикс перед ним, пример входной строки теперь становитсяABA\\/BA\//
./BA\\/BAbBA/
, заменяетBA\
наBAbBA
.\
s входной строки, которая теперь с префиксом становитсяABAbBAbBA/BAbBA//
/B\A\//BAfBA/
измененияBA/
вBAfBA
, переборе/
с.\
в этой замене необходимо, так как в противном случае оно будет искажено предыдущим.ABAbBAbBAfBABAbBAfBAfBA
./AB//
удаляет некоторые лишние части кодировки, превращая его вAbBAbBAfBAbBAfBAfBA
.AB
из/|/AB\\/
подстановки позже в программе, которая была необходима, чтобы защитить его от вышеуказанных/\
манипуляций.\
в исходной входной строке сталAbB
, и каждый/
сталAfB
. (b
иf
стоять вперед и назад.) ВA
конце есть бродяга .A
s иB
s фрагментами программы для запуска на заключительном этапе. В строках замены%
s и|
s кодируют то, что станет/
s и\
s соответственно. Это имеет два преимущества:/
and\
,%
s и|
s не требуют экранирования для копирования./\
, которая иначе была бы искажена предыдущими манипуляциями./|/\\/
(ранее/|/AB\\/
) теперь декодирует|
s, после чего следующее/%/|//
становится/%/\//
и декодирует%
s.Структура программы на завершающем этапе
На этом этапе базовая программа выполнила все свои замены, и все, что осталось, - это программная кодировка входной строки.
Каждый входной символ стал подпрограммой
(завершающий перевод строки), где
*
представляет либоf
оригинал/
, либоb
оригинал\
./\//xy
конце программы также есть команда неполного замещения , которая не будет иметь никакого эффекта, кроме как обеспечить необходимые/
для подстановок предыдущей подпрограммы.Общая подстрока
Перед началом последней итерации по подпрограммам существует подстрока, пересекающая границу после подпрограммы каждого символа в форме
\//
./
будет запущена его копия этой общей подстроки (кроме последней , которая привязывает подстановки), чтобы напечатать строку для этого характер./
, которая представляет собой правую воображаемую «предыдущую строку», в результате чего первый входной символ будет напечатан в начале его строки.\\
или\/
новой строки, и следующего/
.Запуск символьной подпрограммы
Некоторые из следующих подстановок содержат дополнительные
\
s внутри, чтобы предотвратить их сопоставление и искажение друг с другом (включая другие копии в других подпрограммах). Достижение этого также является причиной того, что и то,x
и другоеy
необходимо./\//xyf\z/
или/\//xyb\z/
, приводит к тому, что/
в конце разделяемой подстроки становитсяxyfz
илиxybz
, сразу же после\/
или\\
./\\\\x\y/ /
заменяет\\xy
пробел и замена/\\\/x\y//
заменяет\/xy
ничем.\
или/
, соответственно.\
следующего, за которым следуетfz
илиbz
./ \fz/\\\/\//
заменяется fz
на\//
и/b\z/\\\\\//
заменяетсяbz
на\\/
./
или\
, соответственно./
правильного размещения.///
, что является бесконечным циклом./
в конце общей подстроки.После запуска последней символьной подпрограммы остается то, что осталось от программы
/\//xy
. Так как это неполная замена с отсутствующим финалом/
, программа пропускает ее и обычно останавливается.источник
Желе , 14 байт
Полная программа печати результата.
Попробуйте онлайн!
Как?
источник
Haskell , 49 байтов
Попробуйте онлайн!
источник
Perl 5 , 44 байта
42 байта кода + 2 для
-F
флагаПопробуйте онлайн!
источник
JavaScript (ES8),
665963 байта7 байтов сохранено благодаря исправлению Джастина Маринера
+4 байта
/\\/\\/
(замечено Нилом )Попробуйте онлайн!
источник
MATL ,
231918 байт1 байт благодаря @Sanchises
Ввод - это строка, заключенная в одинарные кавычки.
Попробуйте онлайн! Или проверьте контрольные примеры: 1 , 2 , 3 .
объяснение
Рассмотрим ввод
'\\\//\/\\'
в качестве примера.источник
C # (.NET Core) ,
748882787776 + 18 байт-1 байт благодаря Кевину Круйссену
Выводит коллекцию строк, по одной на каждую строку. Количество байтов также включает в себя:
Попробуйте онлайн!
Пояснение к 77-байтному ответу:
источник
/\\/\\/
.s.Take(i).Sum(y=>y<92?-1:1)+(x-s[0])/45+1
на(x-s[0])/45-~s.Take(i).Sum(y=>y<92?-1:1)
05AB1E , 14 байтов
Попробуйте онлайн!
объяснение
источник
/\\/\\/
.Ç¥.¥0<.SηOv¹Nèy<ú,
рыдая в двоичномR ,
122121 байт-1 байт благодаря Джузеппе
Попробуйте онлайн!
С дополнительными пробелами:
Объяснение: Этот ответ основан на наблюдении, что число начальных пробелов меняет каждую строку на -1, плюс количество
/
в предыдущей и текущей строках.Если у нас N косых черт, переменная
y
является вектором длины N, где 1 для каждой позиции с\
0, в противном случае. Поэтому, чтобы получить изменение количества ведущих пробелов в строке, мы рассчитываемy[1:(N-1)] + y[2:N] - 1
. Функцияdiffinv
преобразует эти различия в последовательность, начиная с 0. Остальное - это просто сборка каждой строки в виде необходимого количества конечных пробелов, за которым следует соответствующая косая черта и символ новой строки.источник
diffinv
;) Также вы можете установитьy=x>")"
на -1 байтstrsplit
, который всегда является убийцей. Вы также можете использовать знаменитыеdiffinv
!library(methods)
заголовок (который должен быть в порядке без штрафа, так как этот пакет является частью базы R), вы можете использоватьel
. Кроме того,diffinv
оказалось так же долго, какcumsum
! :)*S
все испортило.Brain-Flak , 175 байт (174 символа + 1 флаг)
Беги с
-c
флагом.Попробуйте онлайн!
объяснение
источник
Руби ,
8076 байт-4 байта благодаря ручной работе
Попробуйте онлайн!
Объяснение:
источник
.each_cons(2){…}
. В изменении вы можете сохранить, заменив.each_char
→.chars
.i+=
к началу вложенного троичного выражения и заканчивая его символом-1:1:0
.Java 8,
121118110109102 байта-7 байт благодаря битовой магии @Nevay . :)
Объяснение:
Попробуй это здесь.
источник
a->{String r="";int s=0,p=0,i;for(char c:a){for(i=s+=p+(p=c-63)>>5;i-->0;r+=" ");r+=c+"\n";}return r;}
>>
/>>>
/<<
... Я только что проверил некоторые вещи с&
/|
/~
/^
..>.>C (GCC),
13713497 байтПопробуйте онлайн!
• 3 байта благодаря ATaco
• 37 байтов благодаря Digital Trauma & ThePirateBay
Ничего особенного, просто простая рекурсивная функция, которая берет строку и распечатывает косые черты, обратите внимание, что входные данные должны сначала экранировать обратную косую черту.
использование
Ungolfed
Это старый ответ, просмотрите онлайн-ссылку "Попробуй!"
Выход
источник
c=='\0'
с!c
тем же эффектом.printf("%*s%c", n, "", c)
для печати символа c n пробелами?(c!=n)
сc-n
и переставляя тройные выражения. То же самое с(c=='/')
. Также вы можете заменить'/'
на буквальный номер47
. Я думаю, что это всего 7 байтов.C, 60 байтов
Попробуйте онлайн!
источник
Сетчатка , 47 байт
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:
Добавьте пробел в начале каждой строки и перед каждой
\
.Рассмотрим первые два символа строки. Если первым является a,
/
то отступ должен быть уменьшен; это достигается включением предшествующего пробела в захват (который всегда существует, потому что первый этап добавил его); если второе значение a,\\
его необходимо увеличить; это достигается путем включения пространства, добавляемого на первом этапе в захвате. После ввода правильного отступа для второго символа этап повторяется для второго и третьего символов и т. Д.Удалить лишний отступ.
Я написал 94-байтовую версию, которая (как и мой ответ на Charcoal) допускает любую комбинацию слешей: попробуйте онлайн! Объяснение:
Получите мяч, взяв последнюю косую черту и сделав отступ в том же положении на своей линии.
Приставьте пробелы ко всем прямым слешам, чтобы их можно было захватить.
Повторно возьмите последнюю косую черту ввода и выровняйте ее по отдельной строке с косой чертой в строке ниже.
Удалите все оставшиеся отступы.
Удалить теперь пустой ввод.
источник
Луа , 96 байт
Попробуйте онлайн!
Самый короткий, который я мог придумать в Lua. Ввод берется из командной строки.
Это использует несколько трюков:
(...):gmatch(
Это должна быть самая короткая форма получения одной строки в программу Lua из командной строки.
...
Выражение в Lua захватывает все лишние параметры в функции, которые не указаны в объявлении функции и используется для списков параметров. Поскольку основная часть Lua-программы вызывается как функция с аргументами командной строки в качестве параметров, аргументы командной строки заканчиваются на...
.Скобки вокруг него превращают потенциально многозначное
...
выражение в однозначное выражение. Рассмотрим этот (несколько удивительный) пример:and
/or
для логики «если x, тогда value1 иначе value2». ОператорLua
and
возвращает свой первый аргумент, если он ложный; в противном случае он возвращает второй аргумент.or
Оператор возвращает свой первый аргумент , если он truthy; в противном случае второй аргумент.p
не требует никакой инициализации.p==s
всегда должен быть ложным при первом запуске цикла, независимо от ввода. Если вы не установитеp
какое-либо значение перед входом в цикл (выйдете из негоnil
), это произойдет и сохранит байты.Кто-нибудь может сыграть в гольф (в Lua)?
источник
c=0(...):gsub(".",function(s)c=c+(p==s and(s=="/"and-1or 1)or 0)p=s print((" "):rep(c)..s)end)
gmatch(".")
их так,gmatch"."
как вы делали в следующем ответе.Pyth , 28 байт
Попробуйте онлайн!
источник
Q
вместо этого:j.u+?qeNY?>Y\/+PNdPPNPNYtQh
.R 119 байт
Попробуйте онлайн!
Это несколько отличается от ответа пользователя 2390246 . Каждый из них перебирает строку, распечатывая определенное количество пробелов и затем соответствующий
/\
символ.Тем не менее, я избежал разбиения строки, вместо этого выбрав вместо символов заменить их значением кодировки UTF-8, что затем позволяет мне выполнять арифметику непосредственно над числами, что спасло мне всего несколько байтов.
источник
diffinv
определенно не будет работать здесь.C # (.NET Core) , 60/65 байт
Я пробовал более короткую версию C #
как там было сказано: «Это также означает, что каждый ввод будет начинаться с обратной косой черты». Или чуть дольше, которые решают запуск "/"
Попробуйте онлайн!
источник
Луа ,
8884 байтаУлучшенная версия (-4 байта благодаря QuertyKeyboard)
Попробуйте онлайн!
Оригинальная версия (88 байт)
Еще одна попытка в Lua, на этот раз с совершенно другим подходом, использующим манипуляции со строками вместо счетной переменной.
Ungolfed:
В коде есть одна интересная вещь: он
(...):gmatch"."
использует некоторые причуды в парсере Lua. Когда Lua встречает кусок кода в форме
func "string"
, он конвертирует его вfunc("string")
. Это делается для того, чтобы можноprint "string"
было напечатать постоянную строку, и она работает только с одним строковым литералом после функции. Все остальное выдаст синтаксическую ошибку. Однако этот синтаксический сахар также работает с вызовами функций в середине выражения, и, что более удивительно, он прекрасно работает вместе с:
синтаксическим вызовом метода вызова метода. В итоге Lua интерпретирует код следующим образом:Если кто-нибудь может придумать способ удалить один из трех вызовов gsub, пожалуйста, сообщите мне.источник
s=""g=s.gsub g(...,".",function(c)s=g(g(g(s,"\\"," "),"/?$",c)," /","/")print(s)end)
Pyth - 33 байта
Первая попытка, будет гольф.
Попробуйте это онлайн здесь .
источник
Perl, 40 + 2 байта
Вам нужен
-F
флаг.источник
Perl,
3438 + 1 байтобрабатывать два случая
работать с
-p
опциейРЕДАКТИРОВАТЬ: следующий комментарий не работает, когда первый символ
/
однако вывод будет смещен на один символ справа, если первый символ
\
источник
/\\/\\/
.34
решение теперь совершенно верноVBA (Excel), 181 байт
источник
[...]
нотацию: я уменьшил ее до 128 байтSub q
For x=1To[Len(A1)]
c=Mid([A1],x,1)
If c="\"Then Debug.?b;c:b=b+" "
If c="/"Then b=Left(b,Len(b)-1):Debug.?b;c
Next
End Sub
Pyth ,
2421 байтПорт от ответа Рода .
Попробуйте онлайн!
источник
\
. Кстати, где твой код?SOGL V0.12 ,
1613 байтПопробуй здесь! - ожидает ввода в стек, поэтому для простоты использования
,
добавленоисточник
Дьялог АПЛ, 31 байт
Попробуй это здесь!
источник
{↑⍵↑¨⍨a-1-+\¯1*a←⍵='\'}