Phóng to nghệ thuật ASCII


64

Trong thử thách này, bạn phải lấy nghệ thuật ASCII đa dòng làm đầu vào, chẳng hạn như:

 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      

Và bạn cũng sẽ lấy một số nguyên làm đầu vào. Bạn phải xuất nghệ thuật ASCII được phóng to theo số lượng được chỉ định với số nguyên. Ví dụ: nếu bạn đã sử dụng đối số thứ hai là 3, đầu ra sẽ là

   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

Cụ thể, mỗi ký tự phải biến thành một hộp ntheo nký tự đó, trong đó nlà đối số nguyên. Ví dụ: đầu vào của

ab
cd

và 3 sẽ dẫn đến

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng.


nghệ thuật ascii trông thú vị trong danh sách câu hỏi
Justin

6
Tôi nghĩ bạn nên thực hiện một vòng thứ cấp / phần thưởng cho một phương pháp giới thiệu bí danh thích hợp vào nghệ thuật mở rộng. Nghệ thuật golf mã khổng lồ của bạn trông khá khối.
AmeliaBR

5
@AmeliaBR Xem tại đây .
Howard

Câu trả lời:


37

APL, 7 ký tự / byte *

{⍺/⍺⌿⍵}

Hàm lấy số và chuỗi đầu vào làm tham số và trả về kết quả:

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

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
*: APL có thể được viết bằng bộ ký tự byte đơn (di sản) riêng để ánh xạ các ký hiệu APL đến các giá trị 128 byte trên. Do đó, với mục đích ghi điểm, một chương trình gồm các ký tự N chỉ sử dụng các ký tự ASCII và các ký hiệu APL có thể được coi là dài N byte.


1
...: O Nó hoạt động thế nào?
Doorknob

4
@DoorknobofSnow Các đại diện tiêu chuẩn cho một chuỗi multiline là APL là một ma trận nhân vật hình chữ nhật (với trailing trống nếu các đường có chiều rộng không đồng đều ... vâng, APL là cũ.) Các /chức năng (không nên nhầm lẫn với các /nhà điều hành ... vâng, cùng biểu tượng ) trùng lặp và / hoặc xóa các cột khỏi ma trận theo đối số bên trái. Nếu đó là vô hướng (số đơn giản) thì nó được sao chép cho tất cả các cột đầu vào. Do đó 2/mlà một ma trận với tất cả các cột được nhân đôi. Các biến thể không giống nhau, nhưng đối với hàng (hoặc máy bay đầu tiên trục trong trường hợp tổng quát.)
Tobia

6
Ngôn ngữ đẹp phải không? Nó thực sự khá dễ đọc, một khi bạn học được vài chục biểu tượng. Nhiều hơn so với các ngôn ngữ nhiễu dòng ASCII mà bạn thấy xung quanh đây
Re

Mát mẻ. Có phải luôn trong ngôn ngữ? Nó không có trong cuốn sách Gilman và Rose, và một cuốn sách Iverson về APL \ 360 đề cập / [1] nhưng không phải.
Đánh dấu Plotnick

2
Ồ Cái đó. Là. Chỉ. Tuyệt vời. Tôi là. Tàn khốc. Aernruck. Bởi. Điều này. Mã. Tôi muốn cung cấp nhiều hơn +1, nhưng đại diện của tôi khá thấp cho tiền thưởng.
Erik the Outgolfer

35

GolfScript, 20 ký tự

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

Lấy tất cả đầu vào từ STDIN, dòng đầu tiên là hệ số tỷ lệ, phần còn lại là đầu vào đa dòng. Bạn có thể thử ví dụ trực tuyến .

Đầu vào

3
ab
cd

Đầu ra

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)
}+/

Chào! Bạn có định dạng, điểm số thời gian nhập tốt hơn tôi: - / +1
John Dvorak

Ngoài ra, tôi hơi lạc lối khi đọc nó.
John Dvorak

2
@JanDvorak Đã thêm một số lời giải thích.
Howard

Ồ Hôm nay tôi đã học được 1/. Tôi cũng cần sử dụng value function +nhiều hơn.
John Dvorak

2
@CoryKlein: Sẽ rất hữu ích nếu bạn nói với chúng tôi lỗi , nhưng ... * nhìn chằm chằm vào quả cầu pha lê * ... có thể đó golfscript.rbkhông được đánh dấu là có thể thực thi được, hoặc dòng đầu tiên có đường dẫn sai đến trình thông dịch Ruby cho hệ thống của bạn. Ồ, và đó echocó lẽ là nên cat. Hãy thử cat inputFile | ruby golfscript.rb scriptFile(hoặc chỉ ruby golfscript.rb scriptFile < inputFile) và xem nếu nó hoạt động.
Ilmari Karonen

19

J, 20 17 ký tự

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

Xác định một động từ flàm những gì được yêu cầu. Sử dụng:

   3 f a
aaaccc
aaaccc
aaaccc
bbbddd
bbbddd
bbbddd

nơi alà chuỗi đầu vào.
Trên Windows cần thêm một ký tự để xóa \r:

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

Giải thích :

];._2cắt chuỗi đầu vào thành các khối dựa trên ký tự cuối cùng của chuỗi, trong trường hợp này sẽ là a \n. Windows có \r\nvì vậy chúng ta cần sử dụng }:để cắt bớt một ký tự phụ : }:;._2. Cắt tài liệu động từ

Phần còn lại của mã (ngoại trừ việc gán f=.) là một ngã ba .
Nó bị hỏng như thế này:[ #&.|: #

Nếu alà chuỗi đầu vào của chúng tôi, phép tính sẽ là 3 # a(chúng tôi sẽ gọi kết quả này x), sau đó 3 [ a(chúng tôi sẽ gọi kết quả này y) y #&.|: x.

3 # achỉ làm cho ba bản sao của mỗi thành viên a. Sao chép tài liệu động từ
Lần này

ab
cd

vào

aaabbb
cccddd

3 [ achỉ trả về 3. Tài liệu động từ còn lại

Cuối cùng y #&.|: xysao chép dưới chuyển vị x. Công #việc hoạt động như trước, nhưng &.|:yêu cầu J chuyển đổi đầu vào trước và sau đó chuyển đổi lại khi hoàn thành. Theo tài liệu kết hợp , tài liệu động từ chuyển .

Các lượt chuyển

aaabbb
cccddd

vào

ac
ac
ac
bd
bd
bd

sau đó bản sao thay đổi nó thành

aaaccc
aaaccc
aaaccc
bbbddd
bbbddd
bbbddd

và chuyển nó trở lại mang lại cho bạn

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

4
Windows hút, hả? : P
cjfaure

@Trimsty Thật vậy.
Gareth

Điều này ngắn hơn: [##"1Ngoài ra, tôi không chắc chắn về các quy tắc bất thành văn của việc chơi gôn trong J, nhưng tôi nói rằng việc tách chuỗi và bài tập có thể được bỏ qua, do các yêu cầu lỏng lẻo của câu hỏi. Tôi chắc chắn đã làm như vậy trong câu trả lời APL của tôi. Ví dụ:2 ([##"1) 'abcde',:'fghij'
Tobia

17

Haskell, 49 byte

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

Hàm phóng to là e, lấy một số đếm và một chuỗi và trả về một chuỗi:

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

15

APL, 11 ký tự

@Gareth về cơ bản đã làm điều tương tự trước tiên, trong J, vì vậy mục APL này chỉ dành cho triển lãm, không phải cạnh tranh - anh ấy là người chiến thắng.

      E←{⍉⍺/⍉⍺/⍵}

Cách sử dụng: phóng đại trong arg trái (⍺), nghệ thuật dưới dạng ma trận ký tự 2d trong arg phải (⍵).
⍺ / sẽ sao chép các phần tử trên mỗi hàng của vectơ hoặc ma trận (2 / 'OO' trở thành 'OO OO').
/ Sẽ hoán vị rằng, sao chép các phần tử, hoán vị đó.

(Nếu chúng ta sẽ làm rõ thay vì độ dài chương trình, mã có thể là 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

Mặc dù vậy, tôi nên chỉ ra rằng tôi sử dụng 5 ký tự biến đầu vào chuỗi thành một mảng ký tự, vì vậy bạn chỉ thực sự đánh bại tôi bằng 1 ký tự. :-)
Gareth

2
J bị lúng túng bởi mục tiêu thiết kế phiền phức trong đó các toán tử bị giới hạn trong bộ ký tự ASCII. :)
Đánh dấu Plotnick

2
Mặc dù, nếu chúng ta đo bằng byte như OP đã nói, thì đây là 44 byte (tất nhiên ngụ ý là unicode, không phải utf-8) và @ Gareth vẫn là 17. Đó là nhược điểm của các ngôn ngữ không bị hạn chế đối với ASCII.
cjfaure

5
@Trimsty Nhưng APL có bộ ký tự riêng, ánh xạ mỗi ký tự thành một byte đơn, vì vậy có thể cho rằng đây vẫn là 11 byte.
Biến động

1
@Volatility Hừm. Điều đó thực sự kỳ lạ, xin lỗi, không biết: P
cjfaure

13

Kịch bản Bash / sed, 48 ký tự

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

Lưu dưới dạng tập lệnh chmod +xvà chạy:

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

Làm thế nào nó hoạt động?

Thịt của nó là trong sedlệnh. Ví dụ: nếu n = 3, thì lệnh sed được mở rộng thành một cái gì đó như:

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

Lệnh ghép này sedcó thể được chia thành:

  • s/./&&&/g - lệnh thay thế này khớp với từng ký tự và thay thế nó bằng ký tự được lặp lại 3 lần
  • Các plệnh 3x - điều này chỉ in toàn bộ không gian mẫu (tức là dòng hiện tại) 3 lần

Chúng tôi chuyển -ncho sed để bảo nó không được in bất cứ thứ gì trừ khi được nói rõ ràng, vì vậy chúng tôi có toàn quyền kiểm soát những gì được in và bao nhiêu lần.

Tôi không thể tìm ra một cách nhanh chóng để tạo ra các chuỗi lặp lại có độ dài tùy ý trực tiếp sed, vì vậy tôi đã sử dụng một số bashthủ thuật thay thế:

printf -vr "%3s"

Điều này in một chuỗi (không được chỉ định, tức là trống), với 3 khoảng trắng ở đầu và gán kết quả cho bashbiến r.

Sau đó, chúng tôi sử dụng bashmở rộng tham số để chuyển đổi chuỗi không gian này thành những gì chúng tôi cần thay thế vào sedbiểu thức:

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

Tôi đã có thể thoát khỏi việc loại bỏ các trích dẫn xung quanh bộ printfxác định định dạng và sedbiểu thức, vì không có ký tự nào cần thoát trong trình bashbao.

Số lượng nhân vật:

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

Tôi không biết làm thế nào nó hoạt động nhưng nó hoạt động!
Tomas

1
Biến n vi phạm quy tắc 1: Có thể KHÔNG được mã hóa cứng.
manatwork

1
Chỉ cần sử dụng $1và loại bỏ n=3;, bạn thậm chí sẽ lưu 4 ký tự và có thể cả {}trong printf nữa.
Tomas

Và như chúng ta có thể giả sử $ 1 sẽ là số, các trích dẫn xung quanh printfđối số không cần thiết, giảm nó xuống còn 52 ký tự : r=`printf %$1s`;sed -n "s/./${r// /&}/g${r// /;//p}".
thao tác

1
@Tomas - Bây giờ bạn có thể tìm ra cách nó hoạt động, nhưng tôi đã thêm một mô tả trong trường hợp bạn quan tâm.
Chấn thương kỹ thuật số

9

PERL,  41 39 25   22 ký tự

PERL, đơn giản và hiệu quả - được tạo ra ngay cho nhiệm vụ. Khi được gọi với -pi3, 3tham số ở đâu n:

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

Giải pháp cổ điển (39 ký tự):

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

Giải pháp cổ điển cần nđược chỉ định trong dòng đầu tiên, vd

3
ab
cd

Cảm ơn @manatwork cho $&mánh khóe.


1
Mát mẻ. Nhưng bạn không cần phải chụp các ký tự trùng khớp : s/./$&x$n/ge.
thao tác

8

Ruby:  64  49 ký tự

Tất cả dữ liệu nhận được trên STDIN: dòng đầu tiên là hệ số tỷ lệ, sau đó là nghệ thuật ASCII.

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

Chạy mẫu:

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

Ruby:  44  41 ký tự

Giả sử rằng mọi dòng đầu vào được kết thúc bằng dấu tách dòng. Cảm ơn @Ventero.

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

Chạy mẫu:

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

1
Một cách ngắn hơn để đặt n: $.<2?n=$_.to_i: $><<$_.gsub(/./){$&*n}*n(đáng buồn thay, khoảng trắng sau dấu hai chấm là cần thiết, nếu không trình phân tích cú pháp bị nhầm lẫn). Chạy với ruby -n.
Ventero

Doh. Tôi đã thử hàng tá cách tiếp cận để rút ngắn việc gán cho n, nhưng tôi đã bỏ lỡ toán tử ternary. Cảm ơn bạn, @Ventero.
thao tác

6

Con trăn 3 - 84

Không phải là ngắn nhất nhưng một câu trả lời khác nhau dù sao. Một lót thú vị.

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

Đặt một số đầu tiên, sau đó nghệ thuật ASCII dưới dạng danh sách Python, ví dụ:

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 ký tự

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

Điều này xác định một khối f, khi được gọi sẽ tạo ra đầu ra mong muốn. Nó giả sử các đối số nằm trên ngăn xếp (vì về cơ bản đó là cách các đối số được truyền trong GolfScript).

Ungolfed (điều đó thậm chí có ý nghĩa ?: 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

Golf, 23 ký tự

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

Tôi đã quyết định viết toàn bộ chương trình vì nó có ít chi phí hơn cả chức năng ẩn danh:

  • ~(:i;- đánh giá đầu vào, sau đó giảm số nhân, lưu trữ dưới dạng ivà loại bỏ.
  • n/{...}%n* - phân chia theo dòng mới, ánh xạ từng dòng, tham gia theo dòng mới
    • {...}:c%c, - lấy một khối, áp dụng nó trên từng phần tử map, sau đó áp dụng nó cho toàn bộ dòng.
      • {.}i*- nhân đôi ilần yếu tố này

Bản demo trực tiếp: http://golfscript.apphb.com/?c=OyciYWJjCmRlZiIzJwp%2BKDppO24ve3t7Ln1pKn06YyVjfSVuKg%3D%3D

Ví dụ sử dụng:

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

5

Con trăn 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))

Đầu tiên, nhập số, sau đó là chuỗi. Nên tự giải thích ...

Cảm ơn Waleed Khan đã đề nghị loại bỏ []

Cảm ơn Biến động đã gợi ý có amột danh sách.


7
Chỉ cần chú ý; Nsa đang theo dõi mọi đầu vào của bạn
Justin

Mã ngắn nhất tính bằng byte. Điều đó sẽ không bao gồm các dòng mới? Không phải số của bạn là 112?
cjfaure

Xin lỗi, ý tôi là 111.
cjfaure

@Trimsty bạn nói đúng; Tôi nghĩ wordcount.net đếm số dòng mới.
Justin

2
Lập athành một danh sách, làm a+=[''.join(c*n for c in s)]*n, sau đó làm print('\n'.join(a))ở cuối. Cần làm việc.
Biến động

5

Java - 217

Đầu tiên hãy thử chơi golf. Có vẻ như Java không phải là ngôn ngữ để làm việc đó.

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));}}

Trên Windows, bạn cần thay thế "\ n" bằng "\ r \ n".

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

2
Các ký tự đầu vào cần mở rộng xuống dưới cũng như trên (vì vậy cần có 3 dòng aaabbbvà 3 dòng cccdddtrong ví dụ đầu ra của bạn ở trên).
Gareth

2
Bạn có thể dự phòng: 1 ký tự bằng cách khởi tạo i trong khai báo thay vì for; 8 ký tự bằng cách sử dụng a thay vì x ( a=a[1].split("\n")và thay đổi tất cả x bằng a).
manatwork

3
Vâng, với bất kỳ ngôn ngữ nào chỉ cần khai báo mainmất nhiều byte hơn toàn bộ các chương trình trong các ngôn ngữ khác, các thí sinh sẽ nhận được bogey.
Đánh dấu Plotnick

2
HM OK. Dưới đây là 3 ký tự được lưu bằng cách sắp xếp lại outter cho vòng lặp một chút: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 byte khác: Integer.valueOf(a[0])->new Integer(a[0])
Yurii Shylov

5

(Chỉnh sửa: Giải pháp này hiện không hợp lệ vì ngữ nghĩa của hướng dẫn đã thay đổi. Tôi không nhận ra rằng tôi đã sử dụng hướng dẫn khi tôi thay đổi. Tuy nhiên, bạn có thể sửa chương trình của mình bằng cách thay đổi nó thành hướng dẫn mới hơn .)

Sclipting , 19 ký tự

Yêu cầu đầu vào được phân tách bằng \n(không \r) và dòng đầu tiên chứa hệ số nhân.

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

Giải trình

겠坼 | 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

Cuối cùng, ngăn xếp sẽ trông như thế này:

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

Tất cả mọi thứ trên nhãn hiệu được tự động nối và đầu ra, phần còn lại bị loại bỏ.


这 太 有意思 原创 者 对 吧
theGreenCabbage

@theGreenCabbage 对. 踢 木 外
Justin

1
@Timwi xin lỗi vì đã gọi bạn 木 (đá gỗ bên ngoài, phát âm là trà-moo-why) ...
Justin

@Quincunx: Hehe, tôi thấy thật buồn cười :) Nhưng trận chung kết iđược phát âm là [iː], không phải [ɑi]; Làm thế nào bạn sẽ viết nó bằng tiếng Trung bây giờ?
Timwi

@Timwi Nghĩ rằng đó là cách phát âm (nhưng tôi không thể nghĩ về một nhân vật tương ứng). Tôi đã viết bằng cách tìm kiếm và dán sao chép (trên mdbg.net/chindict/chindict.php )
Justin

3

J, 7 ký tự

([#"1#)

Chính xác như trong câu trả lời APL của @ Tobia, nhưng trong ký tự 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}}}

Nghĩ rằng tôi sẽ cho điều này một shot trong PS. Sử dụng đường ống vào foreach's (%) để giữ cho nó ngắn ở đây, nhưng functionToCharArrayđang khiến nó bị ảnh hưởng.

Để sử dụng nó, bạn gọi nó từ dòng lệnh như thế này:

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

Đây là phiên bản không thu nhỏ:

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 đề xuất function m($n,$s){-split$s|%{,(-join($_-split''|%{$_*$n}))*$n}}63 byte
ovs

2

Julia, 74 ký tự / byte

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 ít hơn nếu tôi chỉ trả lại chuỗi. julia>là dấu nhắc tương tác.


1
Đây là sân golf Julia đầu tiên tôi từng thấy.
cjfaure

@Trimsty codegolf.stackexchange.com/search?q=julia vẫn còn rất hiếm, nhưng chúng đã được một số ít (bao gồm cả một trong những nhà thiết kế ngôn ngữ thực sự).
plannapus

@plannapus Thú vị! Có một esolang mới, hiếm có tên là ~ - ~! rằng tôi cũng đã từng sử dụng, mặc dù nó rất tệ khi chơi gôn.
cjfaure


2

Powershell, 54 byte

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

Kịch bản thử nghiệm:

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

Giải trình:

  • $s-replace'.',('$0'*$n) lặp lại mỗi biểu tượng ngoại trừ dòng mới.
  • -split'``n' chia chuỗi rộng bằng dòng mới
  • |%{,$_*$n} lặp lại mỗi dòng dưới dạng một phần tử mảng và trả về mảng

Kết quả là một chuỗi các chuỗi rộng và lặp đi lặp lại.


2

R , 83/72 byte

Cách tiếp cận thay thế bằng regexps

Nếu chúng tôi cho phép một dòng mới, 72 byte:

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

Hãy thử trực tuyến!

Mặt khác, 83 byte:

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

Hãy thử trực tuyến!



1

BrainFuck mở rộng : 158

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

Nó biến thành:

Brainfuck: 185

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

Nó yêu cầu một trình thông dịch có 0 hoặc không thay đổi như dấu EOF. beef, có sẵn từ Ubuntu repos, hoạt động tốt:

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

Mã EBF không được cấp phép:

;;;; 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

Nổi loạn - 87 79

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

Phiên bản được định dạng chính xác:

r: do input

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

Ví dụ sử dụng:

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

Lưu ý Mã này chỉ hoạt động trong Rebol 2 tại thời điểm này (Hàm INPUT được sử dụng chưa được triển khai đầy đủ trong Rebol 3).


1

R , 125 byte

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="
")

Hãy thử trực tuyến!

Chuyển đổi chuỗi thành UTF8, đặt vào một ma trận có các cột là các dòng văn bản (loại bỏ các dòng mới), sau đó lặp lại từng char và các dòng được tạo trước khi in tách biệt bởi các dòng mới.


Nhân tiện, chúc mừng 1K! :-)
Giuseppe

ty :-)! Thật tuyệt khi thấy câu trả lời R cho hầu hết các câu hỏi và thậm chí nhiều câu trả lời cho một số câu hỏi.
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

Trông có vẻ thú vị. Nhưng tôi gặp lỗi: Lỗi Lỗi: không thể tìm thấy hàm "str_split". Tôi có cần phải cài đặt rõ ràng gói Stringr để có thể chạy mã của bạn không? (Xin lỗi, không quen thuộc với R.)
manatwork

không phải nó thiếu một cuộc gọi catđể in nó như thiết bị xuất chuẩn sao? Ngoài ra, mỗi phần tử của chuỗi không chỉ được lặp lại n lần theo chiều dài mà còn được lặp lại theo chiều rộng.
plannapus

Bạn cũng có thể đánh golf chức năng của mình thêm một chút: <-có thể =, paste0ở đây có thể được thay thế bởi pastevì bạn đang sử dụng đối số thu gọn và đối số eachcó thể được rút ngắn e. Xem ở đây để biết một số ý tưởng cơ bản về chơi gôn với R.
plannapus

Mặt khác, đó là một nỗ lực tốt đẹp (nỗ lực ngắn nhất của riêng tôi vẫn nằm trong 200 ký tự hoặc hơn :))
plannapus

@manatwork ok, không còn lỗi nữa khi tải xuốngstringr
petermeissner

0

MATLAB: 20 ​​ký tự

['' imresize(ans,n)]

Giải pháp này giả định rằng hình ảnh được lưu trữ trong một tệp được gọi startup.mvà nó được phép đưa ra số lượng bản sao cho MATLAB khi gọi nó, điều này có thể được thực hiện bằng phương tiện:!matlab -r "n=3"&

MATLAB, cuộc gọi không có đối số: 23 ký tự

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

Không giống như giải pháp đầu tiên, hai cái sau giả định rằng số lượng bản sao có thể không được mong đợi trong cuộc gọi. Đối với các giải pháp này, chuỗi và số gốc được mong đợi trong một tệp được gọi matlab.mattrong thư mục hiện tại của bạn.

MATLAB, toán học thay thế: 27 ký tự

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))));}

Yêu cầu chuỗi đầu vào "i" chứa các dòng mới "\ n" làm dấu phân cách.

Định dạng

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 byte

CJam mới hơn thử thách này (và tính năng chính tôi đang sử dụng thực sự rất gần đây), vì vậy câu trả lời này sẽ không đủ điều kiện để được chấp nhận - nhưng dù sao nó cũng không đánh bại APL, vì vậy ...

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

Kiểm tra nó ở đây.

Giải trình

Với cái mới e*lặp lại mỗi ký tự trong một chuỗi, điều này thực sự đơn giản:

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.

Tôi nhận ra đây là một câu trả lời cũ, nhưng bạn có thể lưu một byte bằng cách sử dụng một hàm thay thế:{N/1$fe*e*N*}
Esolanging Fruit

0

RProgN 100 Byte (Windows) Không cạnh tranh

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

RProgN không có ký tự thoát khi viết, điều này khiến cho bất kỳ việc xử lý các dòng mới nào cũng cần một dòng mới vật lý. Như vậy, câu trả lời này (và bất kỳ đầu vào nào) phải sử dụng CRLF, thay vì chỉ các LF. :

Ngoài ra, chức năng 'rep' chỉ được thêm vào sau khi thử thách này được ban hành, do đó, đây không phải là cạnh tranh.


0

Vim, 39 tổ hợp phím (không bao gồm đầu vào, không cạnh tranh)

gotcha và lý do điều này không cạnh tranh là vì đầu vào phải được nhập hai lần. Thay thế cả 2bằng đầu vào của riêng bạn.

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

Giải trình

  • qayl2phxl@aquughi lại một macro bao quanh một ký tự, dán nó và di chuyển đến một ký tự tiếp theo, sau đó phát lại chính nó. Sau đó, nó hoàn tác các thay đổi. Vì chúng tôi muốn vòng lặp không phải là vô hạn, chúng tôi không xóa ký tự, điều đó có nghĩa là chúng tôi phải xóa vòng lặp bên ngoài nhưng vẫn kết thúc bằng một chuyển động không thành công trên char cuối cùng.
  • :%norm @a<cr> chạy macro trên mỗi dòng
  • gg0 trở lại từ đầu
  • qbyy2P2jkddj@bq@bsử dụng kỹ thuật tương tự như @ađể sao chép mọi dòng, nhưng với macro đệ quy.

Tôi biết điều này có thể được đánh gôn nhiều hơn, ví dụ bằng cách di chuyển ngược để sao chép dòng nhưng vì yêu cầu nhập nhiều đầu vào, tôi sẽ dừng ở đó và đánh dấu câu trả lời này là không cạnh tranh.

Câu trả lời trước (32 lần nhấn phím, chỉ tăng gấp đôi)

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

Giải trình

  • qaylpl@aqughi lại một macro bao quanh một ký tự, dán nó và di chuyển đến một ký tự tiếp theo, sau đó phát lại chính nó. Hoàn tác thay đổi.
  • :%norm @a<cr> chạy macro trên mỗi dòng
  • :%s/.*/&\r&<cr> tăng gấp đôi mỗi dòng

Tôi muốn thực hiện một macro lồng nhau, nhưng một (ký tự) bên trong dừng một (các dòng) bên ngoài ... Vì vậy, tôi phải chạy hai lệnh, thêm một vài tổ hợp phím vào một giải pháp đơn giản khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.