Memperbesar seni ASCII

64

Dalam tantangan ini, Anda harus mengambil seni ASCII multiline sebagai masukan, seperti:

 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      

Dan Anda juga akan mengambil integer sebagai input. Anda harus menampilkan seni ASCII yang diperbesar dengan jumlah yang ditentukan dengan bilangan bulat. Misalnya, jika Anda menggunakan argumen kedua 3, hasilnya akan menjadi

   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

Secara khusus, setiap karakter harus berubah menjadi kotak ndengan nkarakter itu, di mana nargumen integer. Misalnya, input dari

ab
cd

dan 3 akan menghasilkan

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

Ini adalah , jadi kode terpendek dalam byte menang.

Gagang pintu
sumber
ascii art terlihat menarik pada daftar pertanyaan
Justin
6
Saya pikir Anda harus membuat putaran sekunder / bonus untuk metode yang memperkenalkan aliasing yang tepat ke dalam seni yang diperbesar. Seni golf kode raksasa Anda terlihat cukup kuning.
AmeliaBR
5
@ AmeliaBR Lihat di sini .
Howard

Jawaban:

37

APL, 7 karakter / byte *

{⍺/⍺⌿⍵}

Fungsi yang mengambil angka dan string input sebagai parameter dan mengembalikan hasilnya:

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

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
*: APL dapat ditulis dalam charset byte tunggal (lama) yang memetakan simbol APL ke nilai 128 byte atas. Oleh karena itu, untuk tujuan penilaian, program karakter N yang hanya menggunakan karakter ASCII dan simbol APL dapat dianggap sebagai panjang N byte.

Tobia
sumber
1
...: O Bagaimana cara kerjanya?
Gagang Pintu
4
@DoorknobofSnow Standar representasi string multiline adalah APL adalah matriks karakter persegi panjang (dengan trailing kosong jika garis memiliki lebar tidak rata ... ya, APL adalah bahwa tua.) The /function (tidak harus bingung dengan /operator yang ... ya, simbol yang sama ) duplikat dan / atau menghapus kolom dari matriks sesuai dengan argumen sisi kiri. Jika itu adalah skalar (angka sederhana) maka itu direplikasi untuk semua kolom input. Oleh karena itu 2/madalah matriks dengan semua kolom digandakan. The varian melakukan hal yang sama, tetapi untuk baris (atau pesawat pertama-axis dalam kasus umum.)
Tobia
6
Bahasa yang indah, bukan? Ini sebenarnya cukup mudah dibaca, setelah Anda belajar beberapa lusin simbol. Jauh lebih banyak daripada bahasa ASCII line-noise yang Anda lihat di sini ...
Tobia
Keren. Apakah ⌿ selalu dalam bahasa? Itu tidak ada di buku Gilman dan Rose, dan buku Iverson di APL \ 360 menyebutkan / [1] tetapi tidak ⌿.
Mark Plotnick
2
Wow. Bahwa. Aku s. Hanya. Luar biasa. Saya. Sangat. Terpesona. Oleh. Ini. Kode. Saya ingin menawarkan lebih dari sekadar +1, tetapi perwakilan saya cukup rendah untuk mendapat hadiah.
Erik the Outgolfer
35

GolfScript, 20 karakter

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

Mengambil semua input dari STDIN, baris pertama adalah faktor penskalaan, sisanya input multiline. Anda dapat mencoba contohnya secara online .

Memasukkan

3
ab
cd

Keluaran

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

Kode

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)
}+/
Howard
sumber
Hei! Anda mendapatkan format input, skor, dan waktu yang lebih baik daripada saya: - / +1
John Dvorak
Juga, saya agak bingung membacanya.
John Dvorak
2
@JanDvorak Menambahkan beberapa penjelasan.
Howard
Wow. Hari ini saya sudah belajar 1/. Saya juga perlu menggunakan value function +lebih banyak.
John Dvorak
2
@CoryKlein: Akan sangat membantu jika Anda memberi tahu kami kesalahan apa , tapi ... * menatap bola kristal * ... mungkin itu golfscript.rbtidak ditandai yang dapat dieksekusi, atau bahwa baris pertama memiliki jalur yang salah ke interpreter Ruby untuk sistem Anda. Oh, dan itu echoseharusnya cat. Coba cat inputFile | ruby golfscript.rb scriptFile(atau adil ruby golfscript.rb scriptFile < inputFile) dan lihat apakah itu berhasil.
Ilmari Karonen
19

J, 20 17 karakter

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

Menentukan kata kerja fyang melakukan apa yang diperlukan. Pemakaian:

   3 f a
aaaccc
aaaccc
aaaccc
bbbddd
bbbddd
bbbddd

dimana astring input.
Di Windows diperlukan karakter tambahan untuk menghapus \r:

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

Penjelasan :

];._2memotong string input menjadi potongan berdasarkan karakter terakhir dari string, yang dalam hal ini akan menjadi \n. Windows telah \r\njadi kita perlu menggunakan }:untuk memotong karakter ekstra off: }:;._2. Potong dokumentasi kata kerja

Sisa kode (dengan pengecualian penugasan f=.) adalah garpu .
Itu rusak seperti ini:[ #&.|: #

Jika astring input kami kalkulasi akan 3 # a(kami akan memanggil hasil ini x), kemudian 3 [ a(kami akan memanggil hasil ini y) kemudian y #&.|: x.

3 # ahanya membuat tiga salinan dari setiap anggota a. Salin dokumentasi kata kerja
Ini berubah

ab
cd

ke

aaabbb
cccddd

3 [ ahanya mengembalikan 3. dokumentasi kata kerja Kiri

Akhirnya y #&.|: xadalah ysalinan di bawah transpos x. The #karya seperti sebelumnya, tetapi &.|:mengatakan J untuk merefleksikan masukan pertama dan kemudian memindahkannya kembali ketika selesai. Di bawah dokumentasi konjungsi , transposisi dokumentasi kata kerja .

Transpos berubah

aaabbb
cccddd

ke

ac
ac
ac
bd
bd
bd

kemudian salin mengubahnya menjadi

aaaccc
aaaccc
aaaccc
bbbddd
bbbddd
bbbddd

dan memindahkannya kembali memberi Anda

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd
Gareth
sumber
4
Windows payah, eh? : P
cjfaure
@Rimsty Memang benar.
Gareth
Ini lebih pendek: [##"1Juga, saya tidak yakin tentang aturan tidak tertulis tentang bermain golf di J, tapi saya akan mengatakan bahwa pemisahan tali dan tugas bisa dihilangkan, mengingat persyaratan yang longgar dari pertanyaan itu. Saya tentu saja melakukannya dalam jawaban APL saya. Contoh:2 ([##"1) 'abcde',:'fghij'
Tobia
17

Haskell, 49 byte

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

Fungsi perbesar adalah e, yang mengambil hitungan dan string, dan mengembalikan string:

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

APL, 11 karakter

@ Gareth pada dasarnya melakukan hal yang sama pertama, di J, jadi entri APL ini hanya untuk pameran, bukan kompetisi - dia pemenangnya.

      E←{⍉⍺/⍉⍺/⍵}

Penggunaan: pembesaran di arg kiri (⍺), seni dalam bentuk matriks karakter 2d di arg kanan (⍵).
⍺ / ⍵ akan mereplikasi elemen di setiap baris vektor atau matriks (2 / 'OO' menjadi 'OO OO').
⍉⍺ / ⍉ akan memindahkan itu, mereplikasi elemen, memindahkannya.

(Jika kita lebih memilih kejelasan daripada panjang program, kodenya bisa saja 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
Tandai Plotnick
sumber
Saya harus menunjukkan, bahwa saya menggunakan 5 karakter mengubah input string menjadi array karakter, jadi Anda hanya mengalahkan saya dengan 1 karakter. :-)
Gareth
2
J tertatih-tatih dengan tujuan desain sial di mana operator dibatasi untuk set karakter ASCII. :)
Mark Plotnick
2
Padahal, jika kita mengukur dalam byte seperti kata OP, ini adalah 44 byte (menyiratkan unicode tentu saja, bukan utf-8) dan @ Gareth masih 17. Itu adalah kelemahan dari bahasa yang tidak terbatas pada ASCII.
cjfaure
5
@Rimsty Tapi APL memiliki set karakter sendiri yang memetakan setiap karakter ke satu byte, jadi bisa dibilang ini masih 11 byte.
Volatilitas
1
@Vatilitas Hm. Itu sangat aneh, maaf, tidak tahu: P
cjfaure
13

Bash / sed script, 48 karakter

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

Simpan sebagai skrip, chmod +xdan jalankan:

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

Bagaimana cara kerjanya?

Dagingnya ada di sedperintah. Misalnya, jika n = 3, maka perintah sed diperluas ke sesuatu seperti:

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

sedPerintah majemuk ini dapat dipecah menjadi:

  • s/./&&&/g - perintah pengganti ini cocok dengan setiap karakter dan menggantinya dengan karakter yang diulang 3 kali
  • 3x pperintah - ini hanya mencetak seluruh ruang pola (yaitu garis saat ini) 3 kali

Kami lulus -nsed untuk mengatakan tidak mencetak apa pun kecuali disuruh secara eksplisit, jadi kami memiliki kendali penuh atas apa yang dicetak dan berapa kali.

Saya tidak bisa menemukan cara cepat untuk menghasilkan string berulang panjang sewenang-wenang langsung sed, jadi saya menggunakan beberapa bashtrik sebagai gantinya:

printf -vr "%3s"

Ini mencetak string (tidak ditentukan, yaitu kosong), dengan 3 spasi awal, dan memberikan hasilnya ke bashvariabel r.

Kami kemudian menggunakan bashekspansi parameter untuk mengubah string spasi ini menjadi apa yang perlu diganti dengan sedekspresi:

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

Saya bisa lolos dengan menghapus tanda kutip di printfspecifier format dan sedekspresi, karena tidak ada karakter yang perlu melarikan diri dalam bashshell.

Jumlah karakter:

$ submission='r=`printf %$1s`
> sed -n s/./${r// /&}/g${r// /;p}'
$ echo ${#submission}
48
$ 
Trauma Digital
sumber
Saya tidak tahu bagaimana ini bekerja tetapi berhasil!
Tomas
1
Variabel n melanggar aturan 1: "mungkin TIDAK hardcoded".
manatwork
1
Cukup gunakan $1dan hapus n=3;, Anda bahkan akan menyimpan 4 karakter dan mungkin juga {}di printf.
Tomas
Dan seperti yang kita bisa berasumsi $ 1 akan menjadi angka, tanda kutip di sekitar printf's argumen yang tidak perlu, mengurangi ke 52 karakter: r=`printf %$1s`;sed -n "s/./${r// /&}/g${r// /;//p}".
manatwork
1
@ Thomas - Anda mungkin sudah tahu cara kerjanya sekarang, tapi saya menambahkan deskripsi jika Anda tertarik.
Digital Trauma
9

PERL,  41 39 25   22 karakter

PERL, sederhana dan efektif - dibuat tepat untuk tugas tersebut. Ketika dipanggil dengan -pi3, di mana 3parameternya n:

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

Solusi klasik (39 karakter):

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

Solusi klasik perlu nditentukan dalam input baris pertama, misalnya

3
ab
cd

Terima kasih @manatwork untuk $&triknya.

Tomas
sumber
1
Keren. Tapi Anda tidak perlu menangkap karakter cocok: s/./$&x$n/ge.
manatwork
8

Ruby:  64  49 karakter

Semua data yang diterima di STDIN: baris pertama faktor penskalaan, kemudian ASCII.

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

Contoh dijalankan:

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 karakter

Dengan asumsi bahwa setiap saluran input diakhiri dengan pemisah saluran. Terima kasih kepada @Ventero.

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

Contoh dijalankan:

bash-4.2$ ruby -ne '$.<2?n=$_.to_i: $><<$_.gsub(/./){$&*n}*n' <<< '3
> ab
> cd'
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd
manatwork
sumber
1
Cara yang lebih singkat untuk mengatur n: $.<2?n=$_.to_i: $><<$_.gsub(/./){$&*n}*n(sayangnya, ruang setelah usus besar diperlukan, jika parser jadi bingung). Jalankan dengan ruby -n.
Ventero
Doh. Saya mencoba lusinan pendekatan untuk mempersingkat tugas ke n, tapi saya merindukan operator ternary. Terima kasih, @Ventero.
manatwork
6

Python 3 - 84

Bukan yang terpendek tetapi jawaban yang berbeda tetap saja. Satu kalimat yang menarik.

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

Masukkan nomor terlebih dahulu, kemudian seni ASCII sebagai daftar Python, misalnya:

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

GolfScript, 29 karakter

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

Ini mendefinisikan sebuah blok f, yang ketika dipanggil akan menghasilkan output yang diinginkan. Ini mengasumsikan argumen ada di stack (karena pada dasarnya itulah cara argumen dilewatkan dalam GolfScript).

Tidak disatukan (apakah itu masuk akal?: 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
Gagang pintu
sumber
5

Golfscript, 23 karakter

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

Saya telah memutuskan untuk menulis seluruh program karena memiliki biaya overhead lebih sedikit daripada fungsi anonim:

  • ~(:i;- eval input, lalu kurangi pengali, simpan sebagai idan buang.
  • n/{...}%n* - dipisah dengan baris baru, memetakan setiap baris, bergabung dengan baris baru
    • {...}:c%c, - ambil satu blok, terapkan di peta-setiap elemen, lalu terapkan ke seluruh baris.
      • {.}i*- Gandakan ikali elemen ini

Demo langsung: http://golfscript.apphb.com/?c=OyciYWJjCmRlZiIzJwp%2BKDppO24ve3t7Ln1pKn06YyVjfSVuKg%3D%3D

Contoh penggunaan:

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

Python 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))

Pertama, masukkan angkanya, kemudian string. Harus jelas ...

Terima kasih kepada Waleed Khan karena menyarankan menghapus []

Terima kasih kepada Volatility karena menyarankan untuk amenjadi daftar.

Justin
sumber
7
Hanya memperhatikan; nsa mengawasi setiap masukan Anda
Justin
Kode terpendek dalam byte. Bukankah itu termasuk baris baru? Bukankah seharusnya hitungan Anda 112?
cjfaure
Maaf, maksud saya 111.
cjfaure
@Rimsty Anda benar; Saya pikir wordcounter.net menghitung baris baru.
Justin
2
Buat amenjadi daftar, lakukan a+=[''.join(c*n for c in s)]*n, lalu lakukan print('\n'.join(a))di akhir. Itu seharusnya bekerja.
Volatilitas
5

Jawa - 217

Pertama kali mencoba bermain golf. Sepertinya Java bukan bahasa untuk melakukannya.

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

Di Windows Anda harus mengganti "\ n" dengan "\ r \ n".

java M 3 "ab
cd"
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd
Danny
sumber
2
Karakter input perlu diperluas ke bawah juga ke seberang (jadi harus ada 3 baris aaabbbdan 3 baris cccddddalam contoh output Anda di atas).
Gareth
2
Anda dapat menyimpan: 1 karakter dengan menginisialisasi i dalam deklarasi alih-alih for; 8 karakter dengan menggunakan bukan x ( a=a[1].split("\n"), dan ubah semua x dengan a).
manatwork
3
Ya, dengan bahasa apa pun di mana hanya deklarasi mainmengambil byte lebih dari seluruh program dalam bahasa lain, kontestan akan mendapatkan bogeys.
Mark Plotnick
2
HM Oke. Berikut adalah 3 karakter yang disimpan dengan mengatur ulang outter untuk loop sedikit: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
Lain 4 byte: Integer.valueOf(a[0])->new Integer(a[0])
Yurii Shylov
5

(Sunting: Solusi ini sekarang tidak valid karena semantik instruksi telah berubah. Saya tidak menyadari bahwa saya sudah menggunakan instruksi ketika saya mengubahnya. Namun, Anda dapat memperbaiki program ini dengan hanya mengubahnya ke instruksi yang lebih baru .)

Sclipting , 19 karakter

Mengharapkan input dipisahkan oleh \n(tidak \r) dan baris pertama mengandung faktor pengali.

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

Penjelasan

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

Pada akhirnya, tumpukan akan terlihat seperti ini:

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

Segala sesuatu di atas tanda secara otomatis digabungkan dan dikeluarkan, sisanya dibuang.

Timwi
sumber
这 太 有意思 了! 你 是 原创 者 对 吧?
theGreenCabbage
@ theGreenCabbage 对 了. 踢 木 外 是 这个 电脑 创始人 的 创始人
Justin
1
@Timwi maaf karena memanggilmu 踢 木 外 (menendang kayu di luar, melafalkan teh-moo-why) ...
Justin
@ Quincunx: Hehe, saya merasa lucu :) Tapi final idiucapkan [iː], bukan [ɑi]; bagaimana Anda akan menulisnya dalam bahasa Cina sekarang?
Timwi
@Timwi Berpikir itulah caranya diucapkan (tapi saya tidak bisa memikirkan karakter yang sesuai). Saya menulis dengan mencari dan menyalin-paste (di mdbg.net/chindict/chindict.php )
Justin
3

J, 7 karakter

([#"1#)

Hal yang sama persis seperti dalam jawaban APL @ Tobia, tetapi dalam ascii chars.

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

2 ([#"1#) a
  00  
  00  
00  00
00  00
  00  
  00  
tukang cukur
sumber
3

Powershell (96)

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

Kupikir aku akan mencobanya di PS. Menggunakan perpipaan ke foreach's (%) untuk membuatnya singkat di sini, tetapi functiondan ToCharArraymembuatnya menerimanya singkat.

Untuk menggunakannya, Anda memanggilnya dari baris perintah seperti ini:

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

Ini versi yang tidak diperkecil:

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
    }
}
jurgenb
sumber
2
Mazzy menyarankan function m($n,$s){-split$s|%{,(-join($_-split''|%{$_*$n}))*$n}}untuk 63 byte
ovs
2

Julia, 74 karakter / 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 kurang jika saya hanya mengembalikan string. julia>adalah prompt interaktif.

gggg
sumber
1
Ini adalah golf Julia pertama yang saya lihat.
cjfaure
@Trimsty codegolf.stackexchange.com/search?q=julia masih sangat jarang, tetapi mereka sudah beberapa (termasuk oleh salah satu desainer bahasa sebenarnya).
plannapus
@plannapus Menarik! Ada esolang baru yang langka bernama ~ - ~! yang saya gunakan juga, meskipun itu mengerikan untuk bermain golf.
cjfaure
2

Powershell, 54 byte

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

Skrip uji:

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

Penjelasan:

  • $s-replace'.',('$0'*$n) ulangi setiap simbol kecuali garis baru.
  • -split'``n' memisahkan string lebar dengan baris baru
  • |%{,$_*$n} mengulangi setiap baris sebagai elemen array dan mengembalikan array

Hasilnya adalah array string yang luas dan berulang.

mazzy
sumber
2

R , 83/72 byte

Alt pendekatan menggunakan regexps

Jika kami diizinkan mengikuti baris baru, 72 byte:

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

Cobalah online!

Kalau tidak, 83 byte:

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

Cobalah online!

J.Apakah
sumber
1

K, 20

.....

{,/y#',:',/'y#'/:x} 
tmartin
sumber
1

Extended BrainFuck : 158

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

Itu berubah menjadi:

Brainfuck: 185

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

Dibutuhkan juru bahasa yang memiliki 0 atau tidak ada perubahan sebagai penanda EOF. beef, tersedia dari repo Ubuntu, berhasil:

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

Kode EBF tidak dikumpulkan:

;;;; 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
  )  
)
Sylwester
sumber
1

Rebol - 87 79

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

Versi yang diformat dengan baik:

r: do input

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

Contoh penggunaan:

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. Kode ini hanya berfungsi di Rebol 2 saat ini (Fungsi INPUT yang digunakan belum sepenuhnya diimplementasikan dalam Rebol 3).

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

Cobalah online!

Mengkonversi string menjadi UTF8, menempatkan ke dalam matriks yang kolomnya adalah baris teks (menghapus baris baru), dan kemudian mengulangi setiap karakter dan baris yang dihasilkan sebelum mencetak dipisahkan oleh baris baru.

JayCe
sumber
omong-omong selamat 1K! :-)
Giuseppe
ty :-)! Sangat menyenangkan melihat jawaban R untuk sebagian besar pertanyaan dan bahkan beberapa jawaban untuk beberapa pertanyaan.
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
petermeissner
sumber
Terlihat menarik. Tapi saya mendapatkan kesalahan: "Kesalahan: tidak dapat menemukan fungsi" str_split "". Apakah saya perlu menginstal paket stringr secara eksplisit untuk dapat menjalankan kode Anda? (Maaf, tidak terbiasa dengan R.)
manatwork
bukankah tidak ada panggilan catuntuk mencetaknya sebagai stdout? Selain itu setiap elemen dari string tidak hanya harus diulang n kali panjangnya tetapi diulang juga dalam luasnya.
plannapus
Anda juga dapat sedikit lebih mempermainkan fungsi Anda: <-bisa =, paste0dapat digantikan oleh pastekarena Anda tetap menggunakan argumen runtuh dan argumen tersebut eachdapat disingkat menjadi e. Lihat di sini untuk beberapa ide dasar tentang bermain golf dengan R.
plannapus
Kalau tidak, ini upaya yang bagus (upaya terpendek saya sendiri masih sekitar 200 karakter :))
plannapus
@manatwork ok, tidak ada kesalahan lagi tanpa memuatstringr
petermeissner
0

MATLAB: 20 ​​karakter

['' imresize(ans,n)]

Solusi ini mengasumsikan bahwa gambar disimpan dalam file yang dipanggil startup.mdan diizinkan untuk memberikan jumlah replikasi ke matlab saat memanggilnya, ini dapat dilakukan dengan cara:!matlab -r "n=3"&

MATLAB, panggilan tanpa argumen: 23 karakter

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

Berbeda dengan solusi pertama, dua yang terakhir berasumsi bahwa jumlah replikasi mungkin tidak diharapkan dalam panggilan. Untuk solusi ini, string dan nomor asli diharapkan dalam file yang disebut matlab.matdi direktori Anda saat ini.

MATLAB, alternatif matematika: 27 karakter

load;['' kron(s,ones(1,n))]
Dennis Jaheruddin
sumber
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))));}

Mengharapkan string input "i" yang mengandung baris baru "\ n" sebagai pembatas.

Diformat

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))));
 }
mikrobia
sumber
0

CJam, 14 byte

CJam lebih baru dari tantangan ini (dan fitur utama yang saya gunakan sebenarnya sangat baru), jadi jawaban ini tidak akan memenuhi syarat untuk diterima - tapi tetap saja tidak mengalahkan APL, jadi ...

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

Uji di sini.

Penjelasan

Dengan yang baru e*yang mengulang setiap karakter dalam sebuah string, ini sangat mudah:

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.
Martin Ender
sumber
Saya menyadari ini adalah jawaban lama, tetapi Anda dapat menyimpan satu byte dengan menggunakan fungsi sebagai gantinya:{N/1$fe*e*N*}
Esolanging Fruit
0

RProgN 100 Bytes (Windows) Tidak Bersaing

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

RProgN tidak memiliki karakter lolos sejak penulisan, yang membuat penanganan baris baru memerlukan garis fisik baru. Dengan demikian, jawaban ini (dan input apa pun) harus menggunakan CRLF, bukan hanya LF. :(

Juga, fungsi 'perwakilan' hanya ditambahkan setelah tantangan ini dikeluarkan, karena itu, ini tidak bersaing.

ATaco
sumber
0

Vim, 39 penekanan tombol (tidak termasuk input, tidak bersaing)

Gotcha dan alasan ini tidak bersaing adalah karena input harus dimasukkan dua kali. Ganti keduanya 2dengan input Anda sendiri.

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

Penjelasan

  • qayl2phxl@aquumerekam makro yang menarik sebuah karakter, menempelkannya dan pindah ke yang berikutnya, kemudian memutar ulang sendiri. Kemudian membatalkan perubahan. Karena kami ingin agar loop tidak terbatas, kami tidak menghapus karakter, yang berarti kami harus menghapus yang asing tapi tetap selesai dengan gerakan yang gagal pada karakter terakhir.
  • :%norm @a<cr> menjalankan makro di setiap baris
  • gg0 kembali ke awal
  • qbyy2P2jkddj@bq@bmenggunakan teknik yang sama @auntuk menyalin setiap baris, tetapi dengan makro rekursif.

Saya tahu ini bisa lebih golf, misalnya dengan melintasi mundur untuk duplikasi baris tetapi karena persyaratan entri input ganda, saya akan berhenti di sana dan menandai jawaban ini sebagai tidak bersaing.

Jawaban sebelumnya (32 penekanan tombol, hanya dua kali lipat)

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

Penjelasan

  • qaylpl@aqumerekam makro yang menarik sebuah karakter, menempelkannya dan pindah ke yang berikutnya, kemudian memutar ulang sendiri. Batalkan perubahan.
  • :%norm @a<cr> menjalankan makro di setiap baris
  • :%s/.*/&\r&<cr> menggandakan setiap baris

Saya ingin membuat makro bersarang, tetapi bagian dalam (karakter) menghentikan bagian luar (garis) ... Jadi saya harus menjalankan dua perintah, menambahkan beberapa penekanan tombol pada solusi yang dinyatakan sederhana.

Christian Rondeau
sumber