Збільшити ASCII ст


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

Класно. Був in завжди в мові? Це було не в книзі Гілмана і Роза, а в книзі Іверсона про APL \ 360 згадується / [1], але не ⌿.
Марк Плотнік

2
Ого. Це. Є. Просто. Дивовижно. Мені. Суворо. Awestruck За. Це. Код. Я хотів би запропонувати більше, ніж просто +1, але мій реп досить низький для щедрості.
Erik the 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
Windows смокче, так? : P
cjfaure

@Trimsty Дійсно це робить.
Гарет

Це коротше: [##"1Крім того, я не впевнений у неписаних правилах гри в гольф в J, але я б сказав, що розбиття струн і завдання можуть бути пропущені, враховуючи невисокі вимоги питання. Я, звичайно, зробив це у своїй відповіді APL. Приклад:2 ([##"1) 'abcde',:'fghij'
Тобія

17

Хаскелл, 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←{⍉⍺/⍉⍺/⍵}

Використання: збільшення в лівому аргументі (⍺), мистецтво у вигляді матриці 2d у праві аргументу (⍵).
⍺ / ⍵ буде повторювати елементи в кожному рядку вектора або матриці (2 / 'OO' стає 'OO OO').
⍉⍺ / ⍉ перенесе це, копіювати елементи, перенести це.

(Якщо ми збиралися для ясності замість довжини програми, код міг би бути 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
Хоча якщо ми виміряємо в байтах, як сказано в ОП, це 44 байти (мається на увазі, що Unicode, звичайно, не utf-8), а @ Gareth все ще 17. Це недолік мов, які не обмежуються ASCII.
cjfaure

5
@Trimsty Але APL має власний набір символів, який відображає кожного символу в один байт, тому, можливо, це ще 11 байт.
Нестабільність

1
@ Нестабільність 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: "НЕ може бути жорстко кодована".
манантська робота

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

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

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.
манантська робота

8

Ruby:  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.
Вентеро

До. Я спробував десятки підходів, щоб скоротити завдання до n, але пропустив термінального оператора. Дякую, @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

Гольфскрипт, 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 символів, використовуючи замість x ( a=a[1].split("\n")і змінити всі x на a).
манатура

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, ... ]

Все над позначкою автоматично з’єднується і виводиться, решта викидається.


这 太 有意思 了! 你 是 原创 者 对 吧?
theGreenCabbage

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

1
@Timwi вибачте за те, що закликав вас 踢 木 外 (удар деревом назовні, вимовляється чай-му-чому) ...
Джастін

@Quincunx: Хе-хе, мені це було смішно :) Але фінал iвимовляється [iː], а не [ɑi]; як би ти написав це китайською мовою зараз?
Тімві

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

3

J, 7 символів

([#"1#)

Точне те саме, що у відповіді на APL @ Тобіа, але в розділах ascii.

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
Mazzy запропонував 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 Цікаво! Є новий, рідкісний езоланг під назвою ~ - ~! що я також використовував, хоча це страшно для гольфу.
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<+<]>]

Це перетворюється на:

Брейнфук: 185

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

Він вимагає перекладача, який або 0 або не має змін як маркер EOF. beef, доступний від репорта Ubuntu, працює набухає:

$ ( 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

Невикористаний код 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К до речі! :-)
Джузеппе

ty :-)! Чудово бачити 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, щоб мати можливість запускати ваш код? (Вибачте, не знайомий з Р.)
маніпулювання

чи не відсутній виклик catнадрукувати його як stdout? Крім того, кожен елемент струни повинен не просто повторюватися n разів у довжину, а повторюватися також ушир.
планнапус

Ви також можете трохи більше пограти в свою функцію: <-можна =, 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 натискань клавіш (за винятком вводу, не змагається)

getcha і причина цього не конкурує в тому, що введення потрібно вводити двічі. Замініть обидва 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.