Büyüt ASCII art


64

Bu zorlukla, çok satırlı ASCII sanatını girdi olarak almalısınız, örneğin:

 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      

Ayrıca girdi olarak bir tamsayı alacaksınız. Tamsayı ile belirtilen miktarda büyütülmüş ASCII resmini çıkarmalısınız. Örneğin, eğer ikinci bir argüman kullanıyorsanız 3, çıktı

   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

Özellikle, her karakterin bir dönüşebilir gerekir ntarafından no karakterin, kutu ntamsayı argümandır. Örneğin, bir giriş

ab
cd

ve 3 sonuçlanır

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

Bu , yani bayt cinsinden en kısa kod kazanır.


ascii sanat soru listesinde ilginç görünüyor
Justin

6
Bence genişlemiş sanata doğru takma yöntem getiren bir yöntem için ikincil / bonus turu yapmanız gerektiğini düşünüyorum. Dev kodlu golf sanatın oldukça bloklu görünüyor.
AmeliaBR

5
Bkz @AmeliaBR burada .
Howard

Yanıtlar:


37

APL, 7 karakter / bayt *

{⍺/⍺⌿⍵}

Sayı ve giriş dizesini parametre olarak alan ve sonucu veren işlev:

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

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
*: APL, APL sembollerini üst 128 byte değerine eşleyen kendi (eski) tek baytlık karakter kümesi ile yazılabilir. Bu nedenle, puanlama amacıyla, yalnızca ASCII karakterlerini ve APL sembollerini kullanan bir N karakter programı N bayt uzunluğunda kabul edilebilir.


1
...: O Nasıl çalışır?
Doorknob

4
@DoorknobofSnow Çok satırlı bir dizgenin standart gösterimi APL'dir, dikdörtgen karakterli bir matristir (satırların genişliği eşit değilse, boşlukları boş… Evet, APL o kadar eskidir.) /İşlev ( /operatörle karıştırılmaması gereken … evet, aynı sembol) ) soldaki argümana göre bir matristeki sütunları çoğaltır ve / veya kaldırır. Eğer bu bir skaler (basit sayı) ise, o zaman tüm giriş sütunlarında çoğaltılır. Bu nedenle 2/mtüm sütunları iki katına çıkaran bir matristir. Varyant aynı yapar, sıralar (genel durumda veya birinci eksen düzlemleri).
Tobia

6
Güzel dil değil mi? Bir kaç düzine sembolü öğrendiğinde, aslında oldukça okunaklı. Buralarda gördüğünüz ASCII çizgi gürültü dillerinden çok daha fazlası…
Tobia

Güzel. ⌿ her zaman dilde miydi? Gilman ve Rose kitabında yoktu ve APL ile ilgili bir Iverson kitabı \ 360 / [1] 'den bahsediyor ama ⌿ değil.
Mark Plotnick,

2
Vay. Yani. Dır-dir. Sadece. Muhteşem. Ben. Şiddetli. Awestruck. Tarafından. Bu. Kod. Yalnızca +1'den fazlasını sunmak istiyorum, ancak temsilcim henüz bir ödül için oldukça düşük.
Outgolfer Erik

35

GolfScript, 20 karakter

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

Tüm girişi STDIN'den alır, ilk satır ölçeklendirme faktörüdür, geri kalan multiline girişidir. Örneği çevrimiçi deneyebilirsiniz .

Giriş

3
ab
cd

Çıktı

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

kod

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

Hey! Benden daha iyi bir giriş biçimine, skoruna ve zamanına sahipsin : - / +1
John Dvorak

Ayrıca, okumayı da kaybettim.
John Dvorak

2
@JanDvorak Bir açıklama eklendi.
Howard

Vay. Bugün öğrendim 1/. Ayrıca value function +daha fazla kullanmam gerekiyor .
John Dvorak

2
@CoryKlein: Bize hangi hatayı söylersen yardımcı olur , ama ... * kristal topun içine bakar * ... golfscript.rbçalıştırılabilir olarak işaretlenmemiş olabilir veya ilk satırın Ruby tercümanına yanlış bir yolu vardır. sisteminiz için. Oh, ve bu echomuhtemelen olması gerektiği gibi cat. Deneyin cat inputFile | ruby golfscript.rb scriptFile(veya sadece ruby golfscript.rb scriptFile < inputFile) ve çalışıp çalışmadığını görün.
Ilmari Karonen

19

J, 20 17 karakter

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

Gerekenleri yapan bir fiil tanımlar f. Kullanımı:

   3 f a
aaaccc
aaaccc
aaaccc
bbbddd
bbbddd
bbbddd

agiriş dizesi nerede .
Windows'ta, aşağıdakileri kaldırmak için fazladan bir karakter gerekir \r:

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

Açıklama :

];._2giriş dizesini, bu durumda a olacak olan dizenin son karakterine dayanarak parçalara böler \n. , Windows gelmiştir \r\nbu yüzden kullanmaya gerek }:ekstra bir karakter kesecek: }:;._2. Fiil belgelerini kesin

Kodun geri kalanı (atama hariç f=.) bir çataldır .
Bu şekilde parçalanır:[ #&.|: #

Eğer ahesaplama olacak bizim girdi dizedir 3 # a(biz bu sonucu arayacağım x, sonra) 3 [ a(biz bu sonucu arayacağım ysonra) y #&.|: x.

3 # asadece her üyeden üç kopya çıkarır a. Kopya fiil dokümantasyon
Bu döner

ab
cd

içine

aaabbb
cccddd

3 [ asadece 3 döndürür. Sol fiil belgeleri

Nihayet y #&.|: xbir ydevrik altında kopyalamak x. Daha #önce olduğu gibi çalışır, ancak &.|:J'ye girdiyi önce çevirip sonra bittiğinde geri çevirmesini söyler. Birlikte belgeler , fiil belgeleri devretmek .

Devrik dönüşler

aaabbb
cccddd

içine

ac
ac
ac
bd
bd
bd

sonra kopya onu değiştirir

aaaccc
aaaccc
aaaccc
bbbddd
bbbddd
bbbddd

ve onu geri transpoze etmek size verir

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

4
Windows berbat ha? : P
cjfaure

@Trimsty Gerçekten de öyle.
Gareth

Bu daha kısa: [##"1Ayrıca, J'de yazılı olmayan golf kurallarından emin değilim, ancak sorunun gevşek gereksinimleri göz önüne alındığında ipin bölünmesi ve ödevin atlanabileceğini söyleyebilirim. Bunu kesinlikle APL cevabımda yaptım. Örnek:2 ([##"1) 'abcde',:'fghij'
Tobia,

17

Haskell, 49 bayt

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

Büyütme işlevi, esayımı ve dizgeyi alan ve bir dize döndüren işlevdir :

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

15

APL, 11 karakter

@Gareth, J'de temel olarak aynı şeyi yaptı, bu yüzden bu APL girişi sadece yarışma için değil, sergi için de geçerli.

      E←{⍉⍺/⍉⍺/⍵}

Kullanımı: sol argümanında büyütme (⍺), sağ argümanında (⍵) 2d karakterlik bir matris şeklinde sanat.
⍺ / ⍵, bir vektör veya matrisin her satırındaki öğeleri çoğaltacaktır (2 / 'OO', 'OO OO' olur).
⍉⍺ / ⍉, öğelerin kopyalanmasının, aktarılmasının onu dönüştürecektir.

(Programın uzunluğu yerine açıklığa kavuşacak olursak, kod E ← olabilirdi {⍺ / [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

Yine de, string girişini bir karakter dizisine çeviren 5 karakter kullandığımı belirtmeliyim, bu yüzden beni sadece 1 karakter atarsın. :-)
Gareth

2
J, operatörlerin ASCII karakter kümesiyle sınırlandırıldığı sinir bozucu tasarım hedefi tarafından engelleniyor. :)
Mark Plotnick,

2
Bununla birlikte, OP'nin söylediği gibi bayt cinsinden ölçersek, bu 44 bayttır (elbette unicode anlamına gelir, utf-8 değil) ve @ Gareth's hala 17'dir. Bu ASCII ile sınırlı olmayan dillerin dezavantajıdır.
cjfaure

5
@Trimsty Ama APL, her bir karakteri tek bir bayta eşleyen kendi karakter kümesine sahiptir, bu yüzden tartışmasız bu hala 11 bayttır.
Oynaklık

1
@Volatilite Hm. Bu gerçekten garip, üzgünüm, bilmiyordum: P
cjfaure

13

Bash / sed komut dosyası, 48 karakter

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

Bir komut dosyası olarak kaydedin chmod +xve çalıştırın:

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

O nasıl çalışır?

Onun eti sedbuyrukta. Örneğin, n = 3 ise, sed komutu aşağıdaki gibi bir şeye genişletilir:

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

Bu bileşik sedkomut ayrılabilir:

  • s/./&&&/g - bu değiştirme komutu her karakterle eşleşir ve 3 kez tekrarlanan karakterle değiştirilir
  • 3x pkomutları - bu sadece tüm desen alanını (yani mevcut satırı) 3 kez basar

Biz geçmesine -naçıkça söylenmedikçe bir şey yazdırmak için değil anlatmak için sed için, bu yüzden basılır ne ve kaç kez tam kontrole sahip.

Doğrudan rastgele uzunlukta yinelenen dizeleri oluşturmanın hızlı bir yolunu bulamadım sed, bashbunun yerine bazı püf noktaları kullandım:

printf -vr "%3s"

Bu, 3 satır aralığı olan bir dize (belirtilmemiş, yani boş) yazdırır ve sonucu bashdeğişkene atar r.

Daha sonra, bashbu boşluk dizesini, sedifade ile ikame edilmek için ihtiyacımız olana dönüştürmek için parametre genişletmeyi kullanırız :

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

printfFormat belirticisinin ve sedifadenin çevresindeki tırnak işaretlerini kaldırarak , bashkabuğundaki karakterlerden hiçbiri kaçmadığından kurtulmayı başarabildim .

Karakter sayımı:

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

Bunun nasıl çalıştığını bilmiyorum ama işe yarıyor!
Tomas

1
Değişken n kural 1'i ihlal ediyor: “kodlanmış olmayabilir”.
Manatwork

1
Sadece kullanın $1ve kaldırın n=3;, hatta 4 karakter ve belki {}de printf'te kaydetmiş olacaksınız .
Tomas

Biz sayısal olacak $ 1 varsayabiliriz gibi, tırnak etrafında printf'ın argümanı 52 karaktere azaltarak gerekli değildir: r=`printf %$1s`;sed -n "s/./${r// /&}/g${r// /;//p}".
Manatwork

1
@Tomas - Muhtemelen şu ana kadar nasıl çalıştığını çözdünüz, ancak ilgilenmeniz durumunda bir açıklama ekledim.
Dijital Travma

9

PERL,  41 39 25   22 karakter

PERL, basit ve etkili - görev için yaratılmış hak. İle çağrıldığında -pi3, burada 3parametredir n:

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

Klasik çözüm (39 karakter):

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

Klasik çözüm ihtiyacı n, örneğin girişin ilk satırında belirtilir.

3
ab
cd

Hile için @ manatwork teşekkürler $&.


1
Güzel. Ama eşleşti karakterleri yakalamak gerek: s/./$&x$n/ge.
Manatwork

8

Yakut:  64  49 karakter

STDIN'den alınan tüm veriler: önce ölçeklendirme faktörünü, ardından ASCII resmini sıralar.

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

Örnek çalışma:

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

Yakut:  44  41 karakter

Her giriş hattının satır ayırıcı ile sonlandırıldığını varsayalım. @Ventero'ya teşekkürler.

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

Örnek çalışma:

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

1
Ayarlamak için daha kısa bir yol n: $.<2?n=$_.to_i: $><<$_.gsub(/./){$&*n}*n(ne yazık ki, iki nokta üst üste sonra boşluk gerekir, aksi takdirde ayrıştırıcı karışır). İle koş ruby -n.
Ventero

Hamuru. N atamasını kısaltmak için düzinelerce yaklaşım denedim, ama üçlü operatörü kaçırdım. Teşekkürler, @Ventero.
Manatwork

6

Python 3 - 84

Yine de en kısa değil, farklı bir cevap. Ilginç bir astar.

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

Önce bir sayı, ardından ASCII resmini bir Python listesi olarak koyun, örneğin:

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 karakter

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

Bu, fçağrıldığında istenen çıktının üretileceği bir blok tanımlar . Argümanların yığında olduğunu varsayar (çünkü temelde bu argümanların GolfScript'te iletilmesidir).

Ungolfed (Bu bir anlam ifade ediyor mu?: P):

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


# Test run
"ab
cd" 3 f

5

Golfscript, 23 karakter

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

Programın tamamını yazmaya karar verdim, çünkü genel olarak isimsiz bir işleve göre daha az ek yükü var:

  • ~(:i;- girişi değerlendirin, ardından çarpanı azaltın, farklı kaydedin ive atın.
  • n/{...}%n* - yeni satırlara bölün, her satırın haritasını çıkarın, yeni satırlara katılın
    • {...}:c%c, - bir blok alın, harita üzerinde her bir öğeye uygulayın, sonra tüm çizgiye uygulayın.
      • {.}i*- bu eleman izamanını çoğalt

Canlı demo: http://golfscript.apphb.com/?c=OyciYWJjCmRlZiIzJwp%2BKDppO24ve3t7Ln1pKn06YyVjfSVuKg%3D%3D

Örnek kullanım:

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

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

Önce sayıyı, ardından dizeyi girin. Açıklayıcı olmalı ...

Waleed Khan'a kaldırılmasını önerdiğiniz için teşekkürler []

aBir liste olmasını önerdiğin için Volatilite sayesinde .


7
Sadece farkettim; nsa her girişinizi izliyor
Justin

Bayt cinsinden en kısa kod. Bu daha sonra yeni hatları içermez mi? Sayınız 112 olmalı mı?
cjfaure

Üzgünüm, 111 demek
istedim.

@Trimsty haklısın; Wordcounter.net 'in yeni satırları saydığını sanıyordum.
Justin

2
Yap abir liste halinde, do a+=[''.join(c*n for c in s)]*n, sonra yapın print('\n'.join(a))sonunda. Bu çalışması gerekir.
Oynaklık

5

Java - 217

İlk önce golf oynamayı deneyin. Görünüşe göre Java bunu yapacak dil değil.

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'ta "\ n" yerine "\ r \ n" yazmanız gerekir.

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

2
Girdi karakterleri aşağıya doğru da genişlemelidir (bu nedenle yukarıdaki çıktı örneğinizde aaabbb3 satır ve 3 satır olmalıdır cccddd).
Gareth

2
Yedekleyebilirsiniz: 1 yerine i yerine for; X yerine bir karakter kullanarak 8 karakter ( a=a[1].split("\n")ve tüm x işaretlerini a ile değiştirin).
Manatwork

3
Evet, sadece ilan ilanının maindiğer programlardaki programlardan daha fazla bayt aldığı herhangi bir dilde , yarışmacılar övünmeye başlayacak.
Mark Plotnick,

2
HM tamam. İşte döngü için 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));}}
dışa vuruşu

3
Başka bir 4 bayt: Integer.valueOf(a[0])->new Integer(a[0])
Yurii Shylov 28:14

5

(Düzenleme: Bu çözüm artık geçersiz çünkü komutun semantiği değişti. Değiştirdiğimde talimatı zaten kullandığımı fark etmemiştim. Ancak, bu programı değiştirerek düzeltebilirsiniz. yeni talimat .)

Sclipting , 19 karakter

Girişin \n(no \r) ve çarpım faktörünü içeren ilk satırla ayrılmasını bekler .

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

açıklama

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

Sonunda, yığın şöyle görünecek:

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

İşaretin üstündeki her şey otomatik olarak birleştirilir ve geri kalanı atılır.


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

@theGreenCabbage 对 了. 踢木外是这个电脑语言的
Justin

1
@Timwi seni aradığım için üzgünüm outside 木 外 (dışarıda odun tekme, telaffuz çay-moo-neden) ...
Justin

@ Quincunx: Hehe, komik buldum :) Ama final ibelli oldu [iː], [ɑi] değil; Şimdi Çince olarak nasıl yazarsın?
Timwi

@Timwi Bunun nasıl telaffuz edildiğini sanıyordum (fakat buna karşılık gelen bir karakter düşünemedim). Arayarak ve kopyalayıp yapıştırarak yazdım ( mdbg.net/chindict/chindict.php adresinde )
Justin

3

J, 7 karakter

([#"1#)

Tam Tobia'nın APL cevabında olduğu gibi aynı, ama ascii karakterlerinde.

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

Bunu PS'de bir şans vereyim dedim. Burada kısa tutmak için foreach's (%) içine boru kullanarak, ancak functionve ToCharArrayonu bir kısalık bir vuruş yapmak yapıyoruz.

Kullanmak için, komut satırından şöyle çağırırsınız:

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

İşte küçültülmüş olmayan sürüm:

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
Mazzyfunction m($n,$s){-split$s|%{,(-join($_-split''|%{$_*$n}))*$n}} 63 byte için önerdi
ovs

2

Julia, 74 chars / bytes tarafından

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

Sadece ipi geri döndürürsem daha az 7. julia>etkileşimli bilgi istemidir.


1
Bu gördüğüm ilk Julia golf.
cjfaure

@Trimsty codegolf.stackexchange.com/search?q=julia hala çok nadir, ancak birkaçı (dilin tasarımcılarından biri dahil).
plannapus

@plannapus İlginç! ~ - ~ adında yeni, nadir bir esolang var! Ben de kullandım, golf için korkunç olsa da.
cjfaure


2

Powershell, 54 bayt

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

Test komut dosyası:

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

Açıklama:

  • $s-replace'.',('$0'*$n) her satırı yeni satırın dışında tekrarlar.
  • -split'``n' Geniş dizgiyi yeni bir satıra böler
  • |%{,$_*$n} Her satırı bir dizi öğesi olarak tekrarlar ve dizi döndürür

Sonuç, geniş ve tekrarlanan dizeler dizisidir.


2

R , 83/72 bayt

Regexps kullanarak Alt yaklaşım

İzleyen bir yeni satıra izin verilirse, 72 bayt:

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

Çevrimiçi deneyin!

Aksi takdirde, 83 bayt:

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

Çevrimiçi deneyin!



1

Genişletilmiş BrainFuck : 158

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

Şuna dönüşür:

Brainfuck: 185

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

EOF marker olarak 0 olan veya hiç değişmeyen bir tercüman gerektirir. beef, Ubuntu depolarından temin edilebilir, kabarma işleri:

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

Ungolfed EBF kodu:

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

Rebol - 87 79

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

Güzel formatlanmış versiyon:

r: do input

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

Kullanım örneği:

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. Bu kod şu anda yalnızca Rebol 2'de çalışır ( kullanılan INPUT işlevi henüz Rebol 3'te tam olarak uygulanmamıştır).


1

R , 125 bayt

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

Çevrimiçi deneyin!

Dize UTF8'e dönüştürür, sütunları metin satırları olan (yeni satırları kaldırarak) bir matrise koyar ve ardından yeni satırlarla ayrılmadan önce her karakteri ve oluşturulan satırları tekrar eder.


Bu arada 1K için tebrikler! :-)
Giuseppe

ty :-)! R'nin çoğu soruya cevap verdiğini ve hatta bazı sorulara birden fazla cevap verdiğini görmek harika.
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

İlgi çekici görünüyor. Ancak bir hata alıyorum: “Hata:" str_split "işlevini bulamadı. Kodunuzu çalıştırabilmek için stringr paketini açıkça kurmam gerekir mi? (Üzgünüm, R. ile aşina değil)
manatwork

catStdout olarak yazdırmak için bir çağrı eksik değil mi? Ek olarak, telin her bir elemanı sadece n. Uzunluğunda tekrarlanmamalı, aynı zamanda eninde de tekrarlanmalıdır.
plannapus

Ayrıca fonksiyon biraz fazla golf edebilirsiniz: <-olabilir =, paste0burada ile değiştirilebilir pasteyine çöküşü argümanı kullanarak konum beri ve argüman eachiçin kısaltmak edilebilir e. R ile golf
oynama

Aksi takdirde, bu iyi bir girişimdir (en kısa girişimim hala 200 karakterdedir :))
plannapus

@ manatwork, herhangi bir hata yok artık yüklemestringr
petermeissner

0

MATLAB: 20 ​​karakter

['' imresize(ans,n)]

Bu çözüm, görüntünün adı verilen bir dosyada saklandığını ve çağrılırken startup.mmatlab'a çoğaltma miktarı verilmesine izin verildiğini varsayar , bu şu şekilde yapılabilir:!matlab -r "n=3"&

MATLAB, tartışmasız çağrı: 23 karakter

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

İlk çözümden farklı olarak, son iki çağrıda çoğaltma miktarının beklenemeyebileceğini varsayar. Bu çözümler için, orijinal dizginin ve sayının, matlab.matgeçerli dizinde adı verilen bir dosyada olması bekleniyor .

MATLAB, matematiksel alternatif: 27 karakter

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

Ayırıcı olarak "\" giriş dizgisini "\ n" yeni satırlar olarak bekliyor.

Biçimlendirilmiş

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 bayt

CJam bu zorluktan daha yeni (ve kullandığım ana özellik aslında çok yeni), bu yüzden bu cevap kabul edilmeye uygun olmaz - ama yine de APL'yi geçmiyor, bu yüzden ...

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

Burada test et.

açıklama

Yeni ile e*bir dize her karakter tekrarlar hangi, bu gerçekten basittir:

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.

Bunun eski bir cevap olduğunun farkındayım, ancak bunun yerine bir işlevi kullanarak bir bayttan tasarruf edebilirsiniz:{N/1$fe*e*N*}
Esolanging Meyve

0

RProgN 100 Bayt (Windows) Rekabet Etmeyen

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

RProgN yazarken karakter kaçaklarına neden olmaz, bu da yeni satırların işlenmesini fiziksel yeni bir satır gerektirir. Bu nedenle, bu cevap (ve herhangi bir giriş) sadece LF'ler yerine CRLF'leri kullanmak zorundadır. :(

Ayrıca, 'rep' işlevi yalnızca bu zorluğun yayınlanmasından sonra eklendi, çünkü bu rekabet edici değil.


0

Vim, 39 tuşa basma (giriş hariç, rakip değil)

sonuç ve bunun rekabet etmemesinin nedeni, girdilerin iki kez girilmesi gerektiğidir. Her ikisini de 2kendi girişinizle değiştirin .

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

açıklama

  • qayl2phxl@aquukarakter çalan, yapıştırılan ve diğerine geçen bir makroyu kaydeder, ardından kendini tekrar eder. Sonra değişiklikleri geri alır. Döngünün sonsuz olmamasını istediğimiz için, karakteri silmeziz, bu da yabancı olanı silmemiz gerekir ancak yine de son karakterde başarısız olan bir hareketle bitiririz.
  • :%norm @a<cr> her satırda makroyu çalıştırır
  • gg0 en başa döner
  • qbyy2P2jkddj@bq@b@aHer satırı kopyalamak için aynı tekniği kullanır , ancak özyinelemeli bir makroyla.

Bunun daha fazla golf oynayabileceğini biliyorum, örneğin satır çoğaltması için geriye doğru hareket ederek, ancak çoklu giriş giriş gereksinimi nedeniyle burada duracağım ve bu cevabı rakipsiz olarak işaretleyeceğim.

Önceki cevap (32 tuş vuruşu, sadece iki katına çıkar)

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

açıklama

  • qaylpl@aqukarakter çalan, yapıştırılan ve diğerine geçen bir makroyu kaydeder, ardından kendini tekrar eder. Değişikliği geri al.
  • :%norm @a<cr> her satırda makroyu çalıştırır
  • :%s/.*/&\r&<cr> her çizgiyi ikiye katlar

İç içe bir makro yapmak istedim, ama iç olan (karakter) dış olanı (satırları) durdurur ... Bu yüzden iki komutu çalıştırmak zorunda kaldım, aksi halde basit bir çözüme epeyce tuş vuruşları ekledim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.