Увеличить ASCII art


64

В этом задании вы должны использовать в качестве входных данных многострочное ASCII-изображение, например:

 OOOOOO  OOOOOO  OOOOOO  OOOOOOO      OOOOOO   OOOOOO  OO      OOOOOOO 
OO      OO    OO OO   OO OO          OO       OO    OO OO      OO      
OO      OO    OO OO   OO OOOOO       OO   OOO OO    OO OO      OOOOO   
OO      OO    OO OO   OO OO          OO    OO OO    OO OO      OO      
 OOOOOO  OOOOOO  OOOOOO  OOOOOOO      OOOOOO   OOOOOO  OOOOOOO OO      

И вы также будете принимать целое число в качестве входных данных. Вы должны вывести искусство ASCII, увеличенное на величину, указанную целым числом. Например, если вы использовали второй аргумент 3, результат будет

   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO                  OOOOOOOOOOOOOOOOOO         OOOOOOOOOOOOOOOOOO      OOOOOO                  OOOOOOOOOOOOOOOOOOOOO
   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO                  OOOOOOOOOOOOOOOOOO         OOOOOOOOOOOOOOOOOO      OOOOOO                  OOOOOOOOOOOOOOOOOOOOO
   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO                  OOOOOOOOOOOOOOOOOO         OOOOOOOOOOOOOOOOOO      OOOOOO                  OOOOOOOOOOOOOOOOOOOOO
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO                              OOOOOO                     OOOOOO            OOOOOO   OOOOOO                  OOOOOO
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO                              OOOOOO                     OOOOOO            OOOOOO   OOOOOO                  OOOOOO
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO                              OOOOOO                     OOOOOO            OOOOOO   OOOOOO                  OOOOOO
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOOOOOOOOOOO                     OOOOOO         OOOOOOOOO   OOOOOO            OOOOOO   OOOOOO                  OOOOOOOOOOOOOOO
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOOOOOOOOOOO                     OOOOOO         OOOOOOOOO   OOOOOO            OOOOOO   OOOOOO                  OOOOOOOOOOOOOOO
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOOOOOOOOOOO                     OOOOOO         OOOOOOOOO   OOOOOO            OOOOOO   OOOOOO                  OOOOOOOOOOOOOOO
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO                              OOOOOO            OOOOOO   OOOOOO            OOOOOO   OOOOOO                  OOOOOO
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO                              OOOOOO            OOOOOO   OOOOOO            OOOOOO   OOOOOO                  OOOOOO
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO                              OOOOOO            OOOOOO   OOOOOO            OOOOOO   OOOOOO                  OOOOOO
   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO                  OOOOOOOOOOOOOOOOOO         OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO   OOOOOO
   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO                  OOOOOOOOOOOOOOOOOO         OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO   OOOOOO
   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO                  OOOOOOOOOOOOOOOOOO         OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO   OOOOOO

В частности, каждый символ должен превратиться в nпо nкоробке этого символа, где nявляется целым числом аргументов. Например, ввод

ab
cd

и 3 приведет к

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

Это , поэтому выигрывает самый короткий код в байтах.


ascii art выглядит интересно в списке вопросов
Джастин

6
Я думаю, что вы должны сделать дополнительный / бонусный раунд для метода, который вводит правильный псевдоним в расширенном искусстве. Ваше гигантское искусство игры в гольф выглядит довольно блочным.
AmeliaBR

5
@ AmeliaBR Смотрите здесь .
Говард

Ответы:


37

APL, 7 символов / байт *

{⍺/⍺⌿⍵}

Функция, которая принимает число и входную строку в качестве параметров и возвращает результат:

      a
abcde
fghij
      2 {⍺/⍺⌿⍵} a
aabbccddee
aabbccddee
ffgghhiijj
ffgghhiijj
      3 {⍺/⍺⌿⍵} a
aaabbbcccdddeee
aaabbbcccdddeee
aaabbbcccdddeee
fffggghhhiiijjj
fffggghhhiiijjj
fffggghhhiiijjj

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
*: APL может быть записан в своей собственной (устаревшей) однобайтовой кодировке, которая отображает символы APL в верхние 128-байтовые значения. Следовательно, для целей оценки программа из N символов, в которой используются только символы ASCII и символы APL, может рассматриваться как длина N байтов.


1
...: O Как это работает?
Дверная ручка

4
@DoorknobofSnow Стандартное представление для многострочной строки: APL - это прямоугольная матрица символов (с конечными пробелами, если строки имеют неравномерную ширину… да, APL это старая.) /Функция (не путать с /оператором… да, тот же символ ) дублирует и / или удаляет столбцы из матрицы согласно левому аргументу. Если это скаляр (простое число), то он реплицируется для всех входных столбцов. Следовательно 2/m, это матрица со всеми столбцами в два раза. Вариант делает то же самое, но для строк (или плоскостей первой оси в общем случае.)
Тобия

6
Прекрасный язык, не правда ли? Это на самом деле довольно читабельно, когда вы выучите несколько десятков символов. Гораздо больше, чем языки линейного шума ASCII, которые вы видите здесь ...
Tobia

Здорово. ⌿ всегда был на языке? Этого не было в книге Гилмана и Роуз, а в книге Айверсона об APL \ 360 упоминается / [1], но не ⌿.
Марк Плотник

2
Ух ты. Это. Является. Только что. Потрясающие. Я. Жестоко. Благоговение. По. Этот. Код. Я хотел бы предложить больше, чем просто +1, но моя репутация пока еще довольно низкая.
Эрик Outgolfer

35

GolfScript, 20 символов

n%(~{.{*}+@1/%n+*}+/

Принимает все входные данные из STDIN, первая строка - коэффициент масштабирования, остальные - многострочный ввод. Вы можете попробовать пример онлайн .

вход

3
ab
cd

Выход

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

Код

n%            # Split the input into separate lines
(~            # Take the first line and evaluate (factor)
{             # {...}+/ adds the factor to the code block and loops over
              # the remaining lines (i.e. the factor will be the top of stack
              # for each line of input
   .{         # Same thing, duplicate factor and add it to code block and
              # loop over each character (1/ splits the string into chars)
     *        # multiply single-char string with factor
   }+@1/%
   n+         # Join string by adding a newline
   *          # Multiply the line by the factor (left from the . operation)
}+/

Привет! У вас лучший формат ввода, оценка и время, чем у меня: - / +1
Джон Дворак

Кроме того, я немного потерял, читая это.
Джон Дворак

2
@JanDvorak Добавлены некоторые пояснения.
Говард

Ух ты. Сегодня я узнал 1/. Мне также нужно использовать value function +больше.
Джон Дворак

2
@CoryKlein: Было бы полезно, если бы вы сказали нам, какая ошибка, но ... * заглядывает в хрустальный шар * ... может быть, golfscript.rbэто не помечено как исполняемое, или в первой строке указан неверный путь к интерпретатору Ruby для вашей системы. О, и это, echoвероятно , должно быть cat. Попробуйте cat inputFile | ruby golfscript.rb scriptFile(или просто ruby golfscript.rb scriptFile < inputFile) и посмотрите, работает ли это.
Ильмари Каронен

19

J, 20 17 символов

f=.([#&.|:#)];._2

Определяет глагол, fкоторый делает то, что требуется. Использование:

   3 f a
aaaccc
aaaccc
aaaccc
bbbddd
bbbddd
bbbddd

где aстрока ввода.
В Windows требуется дополнительный символ для удаления \r:

f=.([#&.|:#)}:;._2

Пояснение :

];._2разбивает входную строку на куски, основываясь на последнем символе строки, который в этом случае будет a \n. Окна имеют , \r\nпоэтому мы должны использовать , }:чтобы расколоть дополнительный символ прочь: }:;._2. Вырезать глагол документации

Остальная часть кода (за исключением присваивания f=.) является форком .
Это ломается так:[ #&.|: #

Если aнаша входная строка, вычисление будет 3 # a(мы назовем этот результат x), тогда 3 [ a(мы назовем этот результат y) тогда y #&.|: x.

3 # aпросто делает три копии каждого члена a. Копировать глагол документация
Выдается

ab
cd

в

aaabbb
cccddd

3 [ aпросто возвращает 3. Левая документация глагола

Наконец, y #&.|: xэто yкопия под транспонированием x. Эти #работы , как и раньше, но &.|:говорит J транспонировать вход первой , а затем перенести его обратно , когда она будет закончена. При конъюнкции документации , транспонировать глагол документацию .

Транспонированные повороты

aaabbb
cccddd

в

ac
ac
ac
bd
bd
bd

затем копия меняет его на

aaaccc
aaaccc
aaaccc
bbbddd
bbbddd
bbbddd

и перенос его обратно дает вам

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

4
Винда отстой, а? : P
cjfaure

@Trimsty На самом деле это так.
Гарет

Это короче: [##"1Кроме того, я не уверен насчет неписаных правил игры в гольф в J, но я бы сказал, что разделение строк и назначение могут быть опущены, учитывая свободные требования вопроса. Я, конечно, сделал это в своем ответе APL. Пример:2 ([##"1) 'abcde',:'fghij'
Тобиа

17

Haskell, 49 байтов

x=(=<<).replicate
e n=unlines.x n.map(x n).lines

Функция увеличения e, которая берет счетчик и строку и возвращает строку:

λ: putStrLn $ e 3 "ab\ncd\n"
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

15

APL, 11 символов

@Gareth сначала сделал то же самое, в J, так что эта запись APL только для выставки, а не для соревнований - он победитель.

      E←{⍉⍺/⍉⍺/⍵}

Использование: увеличение в левом аргументе (⍺), художественное оформление в виде двумерной матрицы символов в правом аргументе (⍵).
⍺ / ⍵ будет реплицировать элементы в каждой строке вектора или матрицы (2 / «OO» становится «OO OO»).
⍉⍺ / trans транспонирует это, копирует элементы, транспонирует это.

(Если бы мы собирались для ясности вместо длины программы, код мог бы быть E ← {⍺ / [1] ⍺ / ⍵})

      I←5 32⍴' OOOOOO  OOOOOO  OOOOOO  OOOOOOOOO      OO    OO OO   OO OO     OO      OO    OO OO   OO OOOOO  OO      OO    OO OO   OO OO      OOOOOO  OOOOOO  OOOOOO  OOOOOOO'
      I
 OOOOOO  OOOOOO  OOOOOO  OOOOOOO
OO      OO    OO OO   OO OO     
OO      OO    OO OO   OO OOOOO  
OO      OO    OO OO   OO OO     
 OOOOOO  OOOOOO  OOOOOO  OOOOOOO

      3 E I
   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO
   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO
   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO               
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO               
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO               
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOOOOOOOOOOO      
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOOOOOOOOOOO      
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOOOOOOOOOOO      
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO               
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO               
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO               
   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO
   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO
   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO

Однако я должен отметить, что я использую 5 символов, превращая ввод строки в массив символов, так что вы на самом деле били меня только на 1 символ. :-)
Гарет

2
J испытывает затруднения из-за этой противной цели проектирования, в которой операторы ограничены набором символов ASCII. :)
Марк Плотник

2
Хотя, если мы измеряем в байтах, как сказал OP, это составляет 44 байта (подразумевается, конечно, юникод, а не utf-8), а @ Gareth's по-прежнему 17. Это обратная сторона для языков, которые не ограничиваются ASCII.
cjfaure

5
@Trimsty Но у APL есть свой собственный набор символов, который отображает каждый символ в один байт, так что, вероятно, это все еще 11 байтов.
Волатильность

1
@ Volatlity Hm. Это действительно странно, извините, не знал: P
cjfaure

13

Bash / Sed скрипт, 48 символов

printf -vr %$1s
sed -n s/./${r// /&}/g${r// /;p}

Сохраните как скрипт chmod +xи запустите:

$ ./asciiexpand 3 <<< $'ab\ncd'
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd
$ 

Как это работает?

Мясо этого находится в sedкоманде. Например, если n = 3, то команда sed расширяется до чего-то вроде:

sed -n 's/./&&&/g;p;p;p'

Эта составная sedкоманда может быть разбита на:

  • s/./&&&/g - эта команда замены соответствует каждому символу и заменяет его на символ, повторенный 3 раза
  • 3x pкоманды - это просто печатает все пространство шаблона (то есть текущую строку) 3 раза

Мы переходим -nк sed, чтобы запретить печатать что-либо, если это явно не указано, поэтому мы имеем полный контроль над тем, что печатается и сколько раз.

Я не мог найти быстрый способ генерировать повторяющиеся строки произвольной длины непосредственно sed, поэтому bashвместо этого я использовал несколько трюков:

printf -vr "%3s"

Это печатает строку (не указано, т. Е. Пустую) с 3 начальными пробелами и присваивает результат bashпеременной r.

Затем мы используем bashрасширение параметра, чтобы преобразовать эту строку пробелов в то, что нам нужно подставить в sedвыражение:

$ echo ${r// /&}
&&&
$ echo ${r// /;p}
;p;p;p
$ 

Мне удалось удалить кавычки вокруг printfспецификатора формата и sedвыражения, так как ни один из символов внутри не нуждается в экранировании в bashоболочке.

Количество символов:

$ submission='r=`printf %$1s`
> sed -n s/./${r// /&}/g${r// /;p}'
$ echo ${#submission}
48
$ 

Я понятия не имею, как это работает, но это работает!
Томас

1
Переменная n нарушает правило 1: «НЕ может быть жестко закодировано».
manatwork

1
Просто используйте $1и удалите n=3;, вы даже сохраните 4 символа и, возможно, {}тоже в printf.
Томас

И как мы можем предположить , $ 1 будет числовыми, кавычки вокруг printf«s аргумент не нужны, сведя его до 52 символов: r=`printf %$1s`;sed -n "s/./${r// /&}/g${r// /;//p}".
manatwork

1
@Tomas - Вы, наверное, уже выяснили, как это работает, но я добавил описание на тот случай, если вам интересно.
Цифровая травма

9

PERL,  41 39 25   22 символов

PERL, простой и эффективный - создан правильно для задачи. Когда вызывается с -pi3, где 3это параметр n:

s/./$&x$^I/ge;$_ x=$^I

Классическое решение (39 символов):

$n=<>;print map{s/./$&x$n/ge;"$_"x$n}<>

Классическое решение должно nбыть указано в первой строке ввода, например

3
ab
cd

Спасибо @manatwork за $&трюк.


1
Здорово. Но вы не должны захватить совпавшие символы: s/./$&x$n/ge.
manatwork

8

Рубин:  64  49 символов

Все данные, полученные по STDIN: сначала масштабный коэффициент, затем ASCII арт.

BEGIN{n=gets.to_i}
$_=[$_.gsub(/./){$&*n}]*n*$/

Образец прогона:

bash-4.2$ ruby -lpe 'BEGIN{n=gets.to_i};$_=[$_.gsub(/./){$&*n}]*n*$/' <<< '3
> ab
> cd'
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

Рубин:  44  41 символов

Предполагая, что каждая строка ввода заканчивается разделителем строк. Благодаря @Ventero.

$.<2?n=$_.to_i: $><<$_.gsub(/./){$&*n}*n

Образец прогона:

bash-4.2$ ruby -ne '$.<2?n=$_.to_i: $><<$_.gsub(/./){$&*n}*n' <<< '3
> ab
> cd'
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

1
Более короткий способ установки n: $.<2?n=$_.to_i: $><<$_.gsub(/./){$&*n}*n(к сожалению, пробел после двоеточия необходим, иначе парсер запутается). Беги с ruby -n.
Вентеро

Doh. Я пробовал десятки подходов, чтобы сократить назначение, но я пропустил троичный оператор. Спасибо, @Ventero.
Манатворк

6

Питон 3 - 84

Не самый короткий, но другой ответ. Интересный лайнер.

n=int(input())
for i in eval(input()):print(((''.join(j*n for j in i)+'\n')*n)[:-1])

Сначала введите число, затем искусство ASCII в виде списка Python, например:

C:\Users\User4\Desktop>c:/python33/python.exe golf.py
3
["aabb","bbcc","ccdd"]
aaaaaabbbbbb
aaaaaabbbbbb
aaaaaabbbbbb
bbbbbbcccccc
bbbbbbcccccc
bbbbbbcccccc
ccccccdddddd
ccccccdddddd
ccccccdddddd

5

GolfScript, 29 символов

{:i;n/{1/:c;{c{i*}/n}i*}/}:f;

Это определяет блок f, который при вызове будет производить желаемый результат. Предполагается, что аргументы находятся в стеке (потому что именно так передаются аргументы в GolfScript).

Ungolfed (это вообще имеет смысл?: P):

{:i;n/{ # for each line...
  1/:c; # save characters of string in c
  {     # i times...
    c{  # for each character...
      i*
    }/
    n
  }i*
}/}:f;


# Test run
"ab
cd" 3 f

5

Golfscript, 23 символа

~(:i;n/{{{.}i*}:c%c}%n*

Я решил написать целую программу, потому что она имеет меньше накладных расходов, чем даже анонимная функция:

  • ~(:i;- оцените ввод, затем уменьшите множитель, сохраните его как iи отбросьте.
  • n/{...}%n* - разделить на новые строки, отобразить каждую строку, соединить новыми строками
    • {...}:c%c- взять блок, применить его к элементу карты-каждый, а затем применить его ко всей строке.
      • {.}i*- продублируйте этот элемент iраз

Демонстрационная версия: http://golfscript.apphb.com/?c=OyciYWJjCmRlZiIzJwp%2BKDppO24ve3t7Ln1pKn06YyVjfSVuKg%3D%3D

Пример использования:

;'"abc
def"3'
~(:i;n/{{{.}i*}:c%c}%n*

5

Питон 3 - 109 107 93

i=input;n,s,a=int(i()),i(),[]
while s:a+=[''.join(c*n for c in s)]*n;s=i()
print('\n'.join(a))

Сначала введите число, затем строку. Должен быть самоочевидным ...

Спасибо Валиду Хану за предложение удалить []

Спасибо Волатильности за предложение aбыть списком.


7
Только что заметил; NSA следит за каждым вашим входом
Джастин

Самый короткий код в байтах. Разве это не включает в себя новые строки? Разве ваш счет не должен быть 112?
cjfaure

Извините, я имел в виду 111.
cjfaure

@ Тримсти, ты прав; Я думал, что wordcounter.net считает новые строки.
Джастин

2
Составьте aсписок, сделайте a+=[''.join(c*n for c in s)]*n, затем сделайте print('\n'.join(a))в конце. Это должно работать.
Волатильность

5

Ява - 217

Сначала попробуйте в гольф. Похоже, что Java не тот язык, на котором это делается.

enum M{;public static void main(String[]a){int f=new Integer(a[0]),i=0,j,k;a=a[1].split("\n");for(;++i<a.length*f;System.out.println())for(j=0;++j<a[i/f].length();)for(k=0;k++<f;)System.out.print(a[i/f].charAt(j));}}

В Windows вам нужно заменить "\ n" на "\ r \ n".

java M 3 "ab
cd"
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

2
Входные символы должны расширяться как вниз, так и поперек (поэтому в приведенном выше примере вывода должно быть 3 строки aaabbbи 3 строки cccddd).
Гарет

2
Вы можете сэкономить: 1 символ, инициализируя i в объявлении вместо for; 8 символов, используя вместо х ( a=a[1].split("\n")и изменить все х с помощью).
manatwork

3
Да, с любым языком, где только объявление mainзанимает больше байтов, чем целые программы на других языках, участники будут получать призраки.
Марк Плотник

2
Хм хорошо Вот 3 символа, сэкономленные путем перестановки ауттера для цикла:enum M{;public static void main(String[]a){int f=Integer.valueOf(a[0]),i=-1,j,k;a=a[1].split("\n");for(;++i<a.length*f;System.out.println())for(j=0;j<a[i/f].length();j++)for(k=0;k++<f;)System.out.print(a[i/f].charAt(j));}}
daniero

3
Еще 4 байта: Integer.valueOf(a[0])->new Integer(a[0])
Юрий Шилов

5

(Редактировать: это решение теперь недействительно, потому что семантика инструкции изменилась. Я не осознавал, что уже использовал инструкцию, когда менял ее. Однако вы можете исправить эту программу, просто изменив ее на более новая инструкция .)

Скриптинг , 19 символов

Ожидается, что вход будет разделен \n(нет \r), а первая строка будет содержать множитель.

겠坼銻標⑴가殲各標⓶各①復終겠併①復終

объяснение

겠坼 | split everything at \n
銻 | get first element (the factor)
標 | mark
⑴가殲 | bring list to front; remove first element (the factor)
各 | for each line...
    標⓶ | mark
    各①復終 | for each character, multiply it
    겠併 | add a newline and concatenate everything above the mark
    ①復 | multiply that
終 | end of loop

В итоге стек будет выглядеть так:

[ factor, mark, line1, line2, line3, ... ]

Все, что выше отметки, автоматически объединяется и выводится, остальные отбрасываются.


G 太 有意思 了! 你 是 原创 者 对 吧 the
theGreenCabbage

@theGreenCabbage 对 了. Just 木 外 是 这个 电脑 语言 的 创始人
Джастин

1
@ Тимви, извини, что позвонил тебе 踢 木 外 (пни дровами снаружи, произносится «чай-му-почему») ...
Джастин

@Quincunx: Хе-хе, я нашел это забавным :) Но финал iпроизносится как [iː], а не [ɑi]; как бы вы написали это по-китайски сейчас?
Тимви

@Timwi Думал, что это так произносится (но я не мог придумать соответствующий персонаж). Я написал с помощью поиска и копирования-вставки (на mdbg.net/chindict/chindict.php )
Джастин

3

J, 7 символов

([#"1#)

Точно так же, как в ответе APL @ Tobia, но в ascii chars.

a =. ' 0 ',.'0 0',.' 0 '
a
 0 
0 0
 0 

2 ([#"1#) a
  00  
  00  
00  00
00  00
  00  
  00  

3

Powershell (96)

function m($n,$s){$s.split("`n")|%{$l="";$_.ToCharArray()|%{$c=$_;1..$n|%{$l+=$c}};1..$n|%{$l}}}

Думаю, я бы попробовал это в PS. Использование конвейера в foreach (%), чтобы сделать его коротким, но functionи ToCharArrayделает его кратким .

Чтобы использовать его, вы вызываете его из командной строки следующим образом:

PS C:\> m 3 "ab
>> cd"
>>
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

Вот не свернутая версия:

function f($n, $s)
{
    $s.split("`n") | % {            # split input into separate lines
        $l=""                       # initialize an output line
        $_.ToCharArray() | % {      # split line into chars
            $c=$_ ; 1..$n | % {     # add n chars to the line
                $l+=$c 
            } 
        }
        1..$n | % {$l}              # output the line n times
    }
}

2
Маззи предложил function m($n,$s){-split$s|%{,(-join($_-split''|%{$_*$n}))*$n}}для 63 байтов
ов

2

Юлия, 74 символа / байт

julia> f(i,n)=print(prod([(prod(["$c"^n for c in l])*"\n")^3 for l in split(i)]))
f (generic function with 1 method)

julia> f("ab\ncd",3)
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

7 меньше, если я просто верну строку. julia>это интерактивная подсказка.


1
Это первый джулия гольф, который я видел.
cjfaure

@Trimsty codegolf.stackexchange.com/search?q=julia по- прежнему очень редки, но их было немного (включая одного из разработчиков языка).
plannapus

@plannapus Интересно! Там есть новый, редкий esolang под названием ~ - ~! что я тоже использовал, хотя это ужасно для игры в гольф.
cjfaure


2

Powershell, 54 байта

param($s,$n)$s-replace'.',('$0'*$n)-split'
'|%{,$_*$n}

Тестовый скрипт:

$f = {

param($s,$n)$s-replace'.',('$0'*$n)-split'
'|%{,$_*$n}

}

@(
@"
ab
cd
"@
,
@"
 OOOOOO  OOOOOO  OOOOOO  OOOOOOO      OOOOOO   OOOOOO  OO      OOOOOOO
OO      OO    OO OO   OO OO          OO       OO    OO OO      OO
OO      OO    OO OO   OO OOOOO       OO   OOO OO    OO OO      OOOOO
OO      OO    OO OO   OO OO          OO    OO OO    OO OO      OO
 OOOOOO  OOOOOO  OOOOOO  OOOOOOO      OOOOOO   OOOOOO  OOOOOOO OO
"@
) | % {
    &$f $_ 3
}

Объяснение:

  • $s-replace'.',('$0'*$n) повторяет каждый символ, кроме новой строки.
  • -split'``n' разбивает широкую строку на новую строку
  • |%{,$_*$n} повторяет каждую строку как элемент массива и возвращает массив

Результатом является массив широких и повторяющихся строк.


2

R , 83/72 байта

Alt подход с использованием регулярных выражений

Если нам разрешен завершающий перевод строки, 72 байта:

function(s,n)cat(gsub("([^
]*
)",r,gsub("([^
])",r<-strrep("\\1",n),s)))

Попробуйте онлайн!

В противном случае 83 байта:

function(s,n)write(rep(el(strsplit(gsub("([^\n])",strrep("\\1",n),s),"\n")),e=n),1)

Попробуйте онлайн!



1

Расширенный BrainFuck : 158

{a<]<[->+}3>,>3+[->4+[-<<4->>]&a>+<<]<+[-<,[>10+[-<->>+<]<[[->>+<<]3>[->[->+&a&a#3<+>>]>>]<[-]<<]>>[>[-4<[<]>[.>]>>.>]4<[-]<[-]4>[-]]>>[->+<]>[-<+<+>>]4<+<]>]

Превращается в:

Brainfuck: 185

>>>,>+++[->++++[-<<---->>]<]<[->+>+<<]<+[-<,[>++++++++++[-<->>+<]<[[->>+<<]>>>[->[->+<]<[->+<]<[->+<<<+>>]>>]<[-]<<]>>[>[-<<<<[<]>[.>]>>.>]<<<<[-]<[-]>>>>[-]]>>[->+<]>[-<+<+>>]<<<<+<]>]

Требуется интерпретатор, который либо имеет 0, либо не имеет изменений в качестве маркера EOF. beef, доступный в репозиториях Ubuntu, работает Swell:

$ ( echo -n 2
> cat <<eof
> BBBB  RRRR   AAA  IIII NN  NN FFFFF * * * KK  KK
> BB BB RR RR AA AA  II  NNN NN FF      *   KK  KK
> BBBB  RRRR  AAAAA  II  NNNNNN FFFF  ***** KKKKK
> BB BB RR RR AA AA  II  NN NNN FF      *   KK  KK
> BBBB  RR RR AA AA IIII NN  NN FF    * * * KK  KK
> eof
> ) | beef double.bf
BBBBBBBB    RRRRRRRR      AAAAAA    IIIIIIII  NNNN    NNNN  FFFFFFFFFF  **  **  **  KKKK    KKKK
BBBBBBBB    RRRRRRRR      AAAAAA    IIIIIIII  NNNN    NNNN  FFFFFFFFFF  **  **  **  KKKK    KKKK
BBBB  BBBB  RRRR  RRRR  AAAA  AAAA    IIII    NNNNNN  NNNN  FFFF            **      KKKK    KKKK
BBBB  BBBB  RRRR  RRRR  AAAA  AAAA    IIII    NNNNNN  NNNN  FFFF            **      KKKK    KKKK
BBBBBBBB    RRRRRRRR    AAAAAAAAAA    IIII    NNNNNNNNNNNN  FFFFFFFF    **********  KKKKKKKKKK
BBBBBBBB    RRRRRRRR    AAAAAAAAAA    IIII    NNNNNNNNNNNN  FFFFFFFF    **********  KKKKKKKKKK
BBBB  BBBB  RRRR  RRRR  AAAA  AAAA    IIII    NNNN  NNNNNN  FFFF            **      KKKK    KKKK
BBBB  BBBB  RRRR  RRRR  AAAA  AAAA    IIII    NNNN  NNNNNN  FFFF            **      KKKK    KKKK
BBBBBBBB    RRRR  RRRR  AAAA  AAAA  IIIIIIII  NNNN    NNNN  FFFF        **  **  **  KKKK    KKKK
BBBBBBBB    RRRR  RRRR  AAAA  AAAA  IIIIIIII  NNNN    NNNN  FFFF        **  **  **  KKKK    KKKK

Ungolfed EBF код:

;;;; Multiply 
;;;; Takes a digit x and ASCII art on STDIN
;;;; Prints ASCI art scaled x times
;;;; Usage:
;;;; bf ebf.bf < multiply.ebf >multiply.bf
;;;; bf multiply.bf

;;; Memory map for this program
:zero
:str
:flag
:tmp
:dup    
:num

;;; Macros

;; EOL support. Comment out the body of the two 
;; macros below to only support 0 and no change
;; Some interpreters use -1
{eol_start
  +(- 
}

{eol_end 
   )
}

;; macro that reads a digit.
;; the actual number is one more than input
;; ^12 uses 3 cells from origin
{read_number
  ,                    ; read char
  ^1 3+(-^2 4+(-^ 4-)) ; reduce by 3*4*4=48
}

;; duplicate current element
;; to the left using the right as tmp
{copy_left 
  (-^1+)^1(-^0+<+)
}

;; Duplicate char n times while
;; shifting to the right
{handle_char
  $str(-$tmp+)               ; copy the char to tmp
  $dup(-$num(->+)            ; for each dup move num
        $dup(-$num+)         ; and dup one step to the right
        $tmp(-$dup+$str+)    ; and copy the char back to str and to dup
        @flag)               ; which is the new tmp (it gets shifted to the right)
  $tmp(-)                    ; clear char when done
}

{handle_linefeed
  $dup(-                     ; for each dup
    $zero[<]>                ; go to beginnning of string
    [.>]@str                 ; print string 
    $tmp.                    ; print newline
  )
  $zero[-]<[-]>@zero         ; clean last two chars
  $tmp(-)                    ; remove line feed
}


;;; Main program 

;; read number
$tmp &read_number
$tmp (-$dup+$num+)
;$tmp,[-] ; uncomment to require a newline before asci art
$flag+(-
  $str = ,
  ( ;; NB! The line containing EOF will not be printed!
    &eol_start
    $flag 10+(-$str-$tmp+)
    if $str is not linefeed (   
       &handle_char
    ) $tmp ( linefeed
       &handle_linefeed
    ) 
    $num &copy_left      ; we need two copies of the duplicate dupber
    $flag+               ; flag to 
    &eol_end
  )  
)

1

Реболь - 87 79

r: do input while[d: input][forskip d r[insert/dup d d/1 r - 1]loop r[print d]]

Красиво отформатированная версия:

r: do input

while [d: input] [
    forskip d r [insert/dup d d/1 r - 1]
    loop r [print d]
]

Пример использования:

rebol -qw --do 'Rebol[]r: do input while[d: input][forskip d r[insert/dup d d/1 r - 1]loop r[print d]]' <<< "3
ab
cd"
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

NB. Этот код работает только в Rebol 2 на данный момент ( используемая функция INPUT еще не полностью реализована в Rebol 3).


1

R 125 байтов

function(s,n,x=utf8ToInt(s),m=matrix(x[u<-x!=10],,sum(!u)+1))for(i in 1:ncol(m))cat(rep(intToUtf8(rep(m[,i],e=n)),n),sep="
")

Попробуйте онлайн!

Преобразует строку в UTF8, помещает в матрицу, столбцы которой представляют собой строки текста (без перевода строки), а затем повторяет каждый символ и сгенерированные строки перед печатью, разделенными символами новой строки.


поздравляю на 1К кстати! :-)
Джузеппе

ты :-)! Приятно видеть R ответов на большинство вопросов и даже несколько ответов на некоторые вопросы.
JayCe

0

R - 89

M=function(I,N) cat(paste(lapply(lapply(strsplit(I,""),rep,e=N),paste,collapse=""),"\n"))

I <- c("aa  aa  aa", "bbb bbb bbb", "c c c c c c")
N <- 3

I
# aa  aa  aa
# bbb bbb bbb
# c c c c c c"

M(I,N)

# aaaaaa      aaaaaa      aaaaaa 
# bbbbbbbbb   bbbbbbbbb   bbbbbbbbb 
# ccc   ccc   ccc   ccc   ccc   ccc

Выглядит интересно. Но я получаю сообщение об ошибке: «Ошибка: не удалось найти функцию« str_split »». Нужно ли явно устанавливать пакет stringr для запуска вашего кода? (Извините, не знаком с Р.)
manatwork

не пропущен ли вызов, catчтобы распечатать его как стандартный вывод? Кроме того, каждый элемент строки должен не только повторяться n раз по длине, но также повторяться по ширине.
plannapus

Вы также можете изменить свою функцию немного больше: <-может быть =, paste0здесь можно заменить на, pasteтак как вы все равно используете аргумент коллапса, и аргумент eachможет быть сокращен до e. Смотрите здесь для некоторых основных идей по игре в гольф с Р.
plannapus

В противном случае, это хорошая попытка (моя самая короткая попытка все еще в 200 символов или около того :))
plannapus

@manatwork хорошо, без ошибок больше без загрузкиstringr
petermeissner

0

MATLAB: 20 ​​символов

['' imresize(ans,n)]

Это решение предполагает, что изображение хранится в файле с именем startup.mи что ему разрешено давать количество репликаций для matlab при его вызове. Это можно сделать с помощью:!matlab -r "n=3"&

MATLAB, вызов без аргумента: 23 символа

load;['' imresize(s,n)]

В отличие от первого решения, последние два предполагают, что количество повторений может не ожидаться в вызове. Для этих решений исходная строка и число ожидаются в файле, называемом matlab.matв вашем текущем каталоге.

MATLAB, математическая альтернатива: 27 символов

load;['' kron(s,ones(1,n))]

0

C # (177)

public string e(string i,int x){return string.Join("",i.Split('\n').Select(a=>string.Join("",Enumerable.Repeat(string.Join("",a.ToCharArray().Select(c=>new string(c,x))),x))));}

Ожидает входную строку "i", содержащую новые строки "\ n" в качестве разделителя.

форматированная

public string e(string i, int x)
{
    return string.Join("", i.Split('\n').Select(a => string.Join("", Enumerable.Repeat( string.Join("", a.ToCharArray().Select(c => new string(c, x))), x))));
 }

0

CJam, 14 байтов

CJam новее, чем этот вызов (а основная функция, которую я использую, на самом деле совсем недавно), поэтому этот ответ не будет принят, но в любом случае он не превзойдет APL, так что ...

l~qN/1$e*fe*N*

Проверьте это здесь.

объяснение

С новым, e*который повторяет каждый символ в строке, это действительно просто:

l~             e# Read and eval the scale factor.
  qN/          e# Read the rest of the input as the ASCII art and split into lines
     1$e*      e# Copy the scale factor and repeat each line by it.
         fe*   e# Repeat the characters in each line by the scale factor.
            N* e# Join with newlines.

Я понимаю, что это старый ответ, но вы можете сохранить байт, используя вместо этого функцию:{N/1$fe*e*N*}
Esolanging Fruit

0

RProgN 100 байт (Windows) неконкурентный

'l' asoc
'i' asoc
i '[^
]' '%0' l rep replace '[^
]*' '%0
' l rep 'z' asoc z 1 z len 1 - sub replace

RProgN не имеет символьных экранирований на момент написания, поэтому любая обработка новых строк требует физической новой строки. Таким образом, этот ответ (и любой ввод) должен использовать CRLF, а не только LF. :(

Кроме того, функция «rep» была добавлена ​​только после того, как этот вызов был выпущен, поэтому он не является конкурирующим.


0

Vim, 39 нажатий клавиш (исключая ввод, не конкурируя)

причина и причина, по которой он не конкурирует, заключается в том, что ввод необходимо вводить дважды. Замените оба 2своими собственными данными.

qayl2phxl@aquu:%norm @a<cr>gg0qbyy2P2jkddj@bq@b

объяснение

  • qayl2phxl@aquuзаписывает макрос, который дергает персонажа, вставляет его и переходит к следующему, а затем воспроизводит сам. Тогда это отменяет изменения. Поскольку мы хотим, чтобы цикл не был бесконечным, мы не удаляем символ, что означает, что мы должны удалить посторонний, но по-прежнему заканчивать движение, которое завершается неудачно на последнем символе.
  • :%norm @a<cr> запускает макрос в каждой строке
  • gg0 возвращается в самое начало
  • qbyy2P2jkddj@bq@bиспользует ту же технику, что и @aдля копирования каждой строки, но с рекурсивным макросом.

Я знаю, что это может быть лучше, например, путем обратного хода для дублирования линий, но из-за требования множественного ввода я остановлюсь и отмечу этот ответ как не конкурирующий.

Предыдущий ответ (32 нажатия клавиш, только двойные)

qaylpl@aqu:%norm @a<cr>:%s/.*/&\r&<cr>

объяснение

  • qaylpl@aquзаписывает макрос, который дергает персонажа, вставляет его и переходит к следующему, а затем воспроизводит сам. Отмените изменение.
  • :%norm @a<cr> запускает макрос в каждой строке
  • :%s/.*/&\r&<cr> удваивает каждую строку

Я хотел сделать вложенный макрос, но внутренний (символы) останавливает внешний (строки) ... Поэтому мне нужно выполнить две команды, добавив довольно много нажатий клавиш в простом решении.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.