Powiększ art. ASCII


64

W tym wyzwaniu musisz wziąć wielowierszową grafikę ASCII jako dane wejściowe, takie jak:

 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      

I weźmiesz również liczbę całkowitą jako dane wejściowe. Musisz wyprowadzić grafikę ASCII powiększoną o liczbę określoną za pomocą liczby całkowitej. Na przykład, jeśli użyjesz drugiego argumentu 3, wynikiem będzie

   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

W szczególności, każda postać musi przerodzić się nprzez npole tego znaku, gdzie njest argument całkowitą. Na przykład wejście

ab
cd

a 3 spowoduje

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

To jest , więc wygrywa najkrótszy kod w bajtach.


sztuka ascii wygląda interesująco na liście pytań
Justin

6
Myślę, że powinieneś zrobić drugą rundę / bonus dla metody, która wprowadza odpowiednie aliasing do powiększonej grafiki. Twoja gigantyczna sztuka golfa wygląda dość blokująco.
AmeliaBR

5
@AmeliaBR Zobacz tutaj .
Howard

Odpowiedzi:


37

APL, 7 znaków / bajtów *

{⍺/⍺⌿⍵}

Funkcja, która przyjmuje liczbę i łańcuch wejściowy jako parametry i zwraca wynik:

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

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
*: APL można zapisać we własnym (starszym) jednobajtowym zestawie znaków, który odwzorowuje symbole APL na górne 128 bajtów. Dlatego do celów oceniania program N znaków, który używa tylko znaków ASCII i symboli APL, może zostać uznany za N-bajtowy.


1
...: O Jak to działa?
Klamka

4
@DoorknobofSnow Standardową reprezentacją ciągu wielowierszowego jest APL to prostokątna matryca znaków (z końcowymi odstępami, jeśli linie mają nierówną szerokość… tak, APL jest taka stara). /Funkcja (nie należy mylić z /operatorem… tak, ten sam symbol ) powiela i / lub usuwa kolumny z macierzy zgodnie z argumentem po lewej stronie. Jeśli jest to skalar (liczba prosta), to jest replikowany dla wszystkich kolumn wejściowych. Dlatego 2/mmacierz z podwójnymi kolumnami. Wariant robi to samo, ale dla wierszy (lub płaszczyzn pierwszej osi w przypadku ogólnym.)
Tobia

6
Piękny język, prawda? Jest to właściwie dość czytelne, gdy nauczysz się kilkudziesięciu symboli. Znacznie bardziej niż języki zakłóceń linii ASCII, które widzicie tutaj…
Tobia

Chłodny. Czy ⌿ zawsze był w języku? Nie było go w książce Gilman and Rose, a w książce Iverson o APL \ 360 wspomina / [1], ale nie ⌿.
Mark Plotnick

2
Łał. Że. Jest. Właśnie. Niesamowite. Jestem. Surowo. Oniemiały z wrażenia. Przez. To. Kod. Chciałbym zaoferować coś więcej niż tylko +1, ale mój przedstawiciel jest jeszcze dość niski jak na nagrodę.
Erik the Outgolfer,

35

GolfScript, 20 znaków

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

Pobiera wszystkie dane wejściowe ze STDIN, pierwszy wiersz to współczynnik skalowania, a reszta to wejście wielowierszowe. Możesz spróbować przykład online .

Wejście

3
ab
cd

Wynik

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

Hej! Masz lepszy format wejściowy, wynik i czas niż ja: - / +1
John Dvorak

Poza tym trochę się zgubiłem.
John Dvorak

2
@JanDvorak Dodano wyjaśnienie.
Howard

Łał. Dzisiaj się nauczyłem 1/. Potrzebuję też value function +więcej.
John Dvorak

2
@CoryKlein: Byłoby to trochę pomocne, gdybyś powiedział nam, jaki błąd, ale ... * wpatruje się w kryształową kulę * ... może być tak, że golfscript.rbnie jest oznaczony jako wykonywalny lub że pierwsza linia ma niewłaściwą ścieżkę do tłumacza Rubiego dla twojego systemu. Och, i tak echopowinno być cat. Spróbuj cat inputFile | ruby golfscript.rb scriptFile(lub po prostu ruby golfscript.rb scriptFile < inputFile) i sprawdź, czy to działa.
Ilmari Karonen

19

J, 20 17 znaków

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

Definiuje czasownik, fktóry wykonuje to, co jest wymagane. Stosowanie:

   3 f a
aaaccc
aaaccc
aaaccc
bbbddd
bbbddd
bbbddd

gdzie ajest ciąg wejściowy.
W systemie Windows wymagany jest dodatkowy znak, aby usunąć \r:

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

Objaśnienie :

];._2tnie łańcuch wejściowy na kawałki na podstawie ostatniego znaku łańcucha, który w tym przypadku będzie oznaczony jako \n. Windows ma \r\nwięc musimy użyć }:do posiekać dodatkowy charakter off: }:;._2. Wytnij dokumentację czasownika

Reszta kodu (z wyjątkiem przypisania f=.) to rozwidlenie .
Rozkłada się w następujący sposób:[ #&.|: #

Jeśli ajest naszym ciągiem wejściowym, obliczenia będą 3 # a(nazwiemy ten wynik x), a następnie 3 [ a(wywołamy ten wynik y) y #&.|: x.

3 # awykonuje trzy kopie każdego członka a. Kopiuj dokumentację czasownika
Okazuje się

ab
cd

w

aaabbb
cccddd

3 [ apo prostu zwraca 3. Dokumentacja lewego czasownika

Wreszcie kopia y #&.|: xjest ytransponowana x. Te #prace jak poprzednio, ale &.|:mówi J transpozycji wejście, a następnie przenieść go z powrotem, gdy jest gotowy. Zgodnie z dokumentacją spójnik , transpozycji dokumentację czasownik .

Transpozycja się zmienia

aaabbb
cccddd

w

ac
ac
ac
bd
bd
bd

następnie kopia zmienia to na

aaaccc
aaaccc
aaaccc
bbbddd
bbbddd
bbbddd

a przeniesienie go z powrotem daje

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

4
Windows jest do bani, co? : P
cjfaure

@Trimsty Rzeczywiście to robi.
Gareth

To jest krótsze: [##"1Nie jestem też pewien niepisanych zasad gry w golfa w J, ale powiedziałbym, że podział struny i przypisanie można pominąć, biorąc pod uwagę luźne wymagania pytania. Z pewnością zrobiłem to w mojej odpowiedzi APL. Przykład:2 ([##"1) 'abcde',:'fghij'
Tobia,

17

Haskell, 49 bajtów

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

Funkcja powiększania polega na tym e, że pobiera liczbę i ciąg znaków i zwraca ciąg znaków:

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

15

APL, 11 znaków

@Gareth najpierw zrobił to samo, w J, więc ten wpis APL jest tylko na wystawę, a nie konkurencję - jest zwycięzcą.

      E←{⍉⍺/⍉⍺/⍵}

Zastosowanie: powiększenie w lewym arg (⍺), grafika w postaci macierzy 2d znaków w prawym arg (⍵).
⍺ / ⍵ powiela elementy w każdym rzędzie wektora lub macierzy (2 / „OO” zmienia się w „OO OO”).
⍉⍺ / ⍉ transponuje to, replikuje elementy, transponuje to.

(Gdybyśmy dążyli do przejrzystości zamiast długości programu, kod mógłby być 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

Powinienem jednak zaznaczyć, że używam 5 znaków, zamieniając ciąg znaków na tablicę znaków, więc naprawdę pokonujesz mnie tylko o 1 znak. :-)
Gareth

2
J jest zapętlony przez ten nieznośny cel projektowy, w którym operatorzy są ograniczeni do zestawu znaków ASCII. :)
Mark Plotnick

2
Chociaż, jeśli mierzymy w bajtach, jak powiedział PO, to jest to 44 bajty (co oznacza oczywiście unicode, nie utf-8), a @ Gareth wciąż ma 17 lat. To wada języków, które nie są ograniczone do ASCII.
cjfaure

5
@Trimsty Ale APL ma swój własny zestaw znaków, który mapuje każdy znak na pojedynczy bajt, więc prawdopodobnie jest to nadal 11 bajtów.
Zmienność

1
@Volatility Hm. To naprawdę dziwne, przepraszam, nie wiedziałem: P
cjfaure

13

Skrypt Bash / sed, 48 znaków

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

Zapisz jako skrypt chmod +xi uruchom:

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

Jak to działa?

Jego mięso jest w sedpoleceniu. Na przykład, jeśli n = 3, to polecenie sed jest rozwijane do czegoś takiego:

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

To złożone sedpolecenie można podzielić na:

  • s/./&&&/g - to polecenie zastępujące pasuje do każdego znaku i zastępuje je znakiem powtarzanym 3 razy
  • pKomendy 3x - to tylko 3 razy drukuje całą przestrzeń wzoru (tj. Bieżącą linię)

Przechodzimy -ndo sed, aby powiedzieć mu, aby niczego nie drukował, chyba że jest to wyraźnie wskazane, więc mamy pełną kontrolę nad tym, co jest drukowane i ile razy.

Nie mogłem wymyślić szybkiego sposobu generowania bezpośrednio ciągów o dowolnej długości sed, więc bashzamiast tego użyłem kilku sztuczek:

printf -vr "%3s"

Spowoduje to wydrukowanie ciągu (nieokreślonego, tj. Pustego) z 3 wiodącymi spacjami i przypisanie wyniku do bashzmiennej r.

Następnie używamy interpretacji bashparametrów, aby przekształcić ten ciąg spacji w to, co musimy zastąpić w sedwyrażeniu:

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

Udało mi się usunąć cytaty wokół specyfikatora printfformatu i sedwyrażenia, ponieważ żaden z zawartych w nim znaków nie musi uciekać w bashpowłoce.

Liczba znaków:

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

Nie mam pojęcia, jak to działa, ale działa!
Tomas

1
Zmienna n narusza zasadę 1: „NIE może być zakodowana na stałe”.
manatwork

1
Po prostu użyj $1i usuń n=3;, a nawet zapiszesz 4 znaki i być może również {}w printf.
Tomas

I jak możemy założyć, $ 1 jest numeryczny, cytaty wokół printfargumentacja nie są konieczne, redukując go do 52 znaków: r=`printf %$1s`;sed -n "s/./${r// /&}/g${r// /;//p}".
manatwork

1
@Tomas - Prawdopodobnie już wiesz, jak to działa, ale dodałem opis na wypadek, gdybyś był zainteresowany.
Cyfrowa trauma

9

PERL,  41 39 25   22 znaków

PERL, prosty i skuteczny - stworzony specjalnie do tego zadania. Po wywołaniu za pomocą -pi3, gdzie 3jest parametr n:

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

Klasyczne rozwiązanie (39 znaków):

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

Klasyczne rozwiązanie wymaga tego, które njest określone w pierwszym wierszu danych wejściowych, np

3
ab
cd

Dzięki @manatwork za $&sztuczkę.


1
Chłodny. Ale nie trzeba uchwycić dopasowane znaki: s/./$&x$n/ge.
manatwork

8

Rubin:  64  49 znaków

Wszystkie dane otrzymane na STDIN: najpierw wiersz współczynnik skalowania, następnie art ASCII.

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

Przykładowy przebieg:

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

Rubin:  44  41 znaków

Zakładając, że każda linia wejściowa jest zakończona separatorem linii. Dzięki @Ventero.

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

Przykładowy przebieg:

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

1
Krótszy sposób ustawienia n: $.<2?n=$_.to_i: $><<$_.gsub(/./){$&*n}*n(niestety, przestrzeń po dwukropku jest konieczna, w przeciwnym razie parser się myli). Uruchom z ruby -n.
Ventero

Doh Próbowałem dziesiątek podejść, aby skrócić przypisanie do n, ale brakowało mi operatora trójskładnikowego. Dziękuję, @Ventero.
manatwork

6

Python 3 - 84

Nie najkrótsza, ale inna odpowiedź. Ciekawy jednowarstwowy.

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

Najpierw wpisz liczbę, a następnie grafikę ASCII jako listę Pythona, np .:

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 znaków

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

Definiuje blok f, który po wywołaniu wytworzy pożądany wynik. Zakłada, że ​​argumenty znajdują się na stosie (ponieważ w ten sposób argumenty są przekazywane w GolfScript).

Niegolfowany (czy to ma w ogóle sens?: 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 znaki

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

Zdecydowałem się napisać cały program, ponieważ ma on mniejszy narzut niż nawet anonimowa funkcja:

  • ~(:i;- sprawdź dane wejściowe, a następnie zmniejsz mnożnik, zapisz go jako ii odrzuć.
  • n/{...}%n* - podzielone według nowych linii, zamapuj każdą linię, połącz przez nowe linie
    • {...}:c%c, - weź blok, zastosuj go na mapie - każdy element, a następnie zastosuj do całej linii.
      • {.}i*- zduplikuj ten element irazy

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

Przykładowe użycie:

;'"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))

Najpierw wprowadź liczbę, a następnie ciąg. Powinno być zrozumiałe ...

Dzięki Waleed Khan za sugestię usunięcia []

Dzięki Zmienności za zasugerowanie posiadania alisty.


7
Właśnie zauważyłem; nsa obserwuje każde Twoje wejście
Justin

Najkrótszy kod w bajtach. Czy nie obejmowałoby to nowych linii? Czy nie powinieneś liczyć 112?
cjfaure

Przepraszam, miałem na myśli 111.
cjfaure

@Trimsty masz rację; Myślałem, że wordcounter.net liczy nowe znaki.
Justin

2
Zrób alistę, zrób a+=[''.join(c*n for c in s)]*n, a potem zrób print('\n'.join(a))na końcu. To powinno działać.
Zmienność

5

Java - 217

Najpierw spróbuj golfa. Wygląda na to, że Java nie jest językiem, w którym można to zrobić.

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

W systemie Windows należy zamienić „\ n” na „\ r \ n”.

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

2
Znaki wejściowe muszą być rozwijane zarówno w dół, jak i w poprzek (więc w powyższym przykładzie wyjściowym powinny znajdować się 3 wiersze aaabbbi 3 wiersze cccddd).
Gareth

2
Możesz oszczędzić: 1 znak, inicjując i w deklaracji zamiast for; 8 znaków przy użyciu zamiast x ( a=a[1].split("\n")i zmień wszystkie x za pomocą a).
manatwork

3
Tak, w każdym języku, w którym sama deklaracja mainzajmuje więcej bajtów niż całe programy w innych językach, zawodnicy będą mieli bogeys.
Mark Plotnick

2
Hm ok. Oto 3 znaki zapisane przez nieco przestawienie zewnętrznej pętli dla pętli: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
Kolejne 4 bajty: Integer.valueOf(a[0])->new Integer(a[0])
Yurii Shylov

5

(Edycja: To rozwiązanie jest teraz nieprawidłowe, ponieważ zmieniła się semantyka instrukcji. Nie zdawałem sobie sprawy, że już skorzystałem z instrukcji, gdy ją zmieniłem. Możesz jednak naprawić ten program, po prostu zmieniając go na nowsza instrukcja ).

Sclipting , 19 znaków

Oczekuje, że dane wejściowe zostaną oddzielone \n(nie \r), a pierwszy wiersz będzie zawierał mnożnik.

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

Wyjaśnienie

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

Na końcu stos będzie wyglądał następująco:

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

Wszystko powyżej znaku jest automatycznie łączone i wyprowadzane, reszta jest odrzucana.


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

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

1
@Timwi przepraszam, że do ciebie dzwonię 踢 木 外 (kopnij drewno na zewnątrz, wymówił herbatę-moo-dlaczego) ...
Justin

@Quincunx: Hehe, uznałem to za zabawne :) Ale finał ijest wymawiany [iː], a nie [ɑi]; jak napisałbyś to teraz po chińsku?
Timwi

@Timwi Myślałem, że tak to się wymawia (ale nie mogłem wymyślić odpowiedniej postaci). Pisałem, wyszukując i kopiując-wklejając (na mdbg.net/chindict/chindict.php )
Justin

3

J, 7 znaków

([#"1#)

Dokładnie to samo, co w odpowiedzi APL @ Tobia, ale w znakach 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}}}

Myślałem, że dam temu szansę w PS. Używanie potoków w foreach's (%), aby było tu krótko, ale functioni ToCharArraysprawiają, że wymaga to zwięzłości.

Aby go użyć, wywołujesz go z wiersza poleceń w następujący sposób:

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

Oto niezminimalizowana wersja:

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 zasugerował function m($n,$s){-split$s|%{,(-join($_-split''|%{$_*$n}))*$n}}dla 63 bajtów
ows

2

Julia, 74 znaki / bajty

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 mniej, jeśli tylko zwrócę ciąg. julia>to interaktywny monit.


1
To pierwszy golf Julii, jaki widziałem.
cjfaure

@Trimsty codegolf.stackexchange.com/search?q=julia wciąż bardzo rzadkie, ale było ich kilka (w tym faktycznie jeden z projektantów języka).
plannapus

@plannapus Ciekawe! Jest nowy, rzadki esolang o nazwie ~ - ~! którego również użyłem, choć jest to straszne do gry w golfa.
cjfaure


2

PowerShell, 54 bajty

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

Skrypt testowy:

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

Wyjaśnienie:

  • $s-replace'.',('$0'*$n) powtarza każdy symbol z wyjątkiem nowej linii.
  • -split'``n' dzieli szeroki ciąg na nową linię
  • |%{,$_*$n} powtarza każdą linię jako element tablicy i zwraca tablicę

Wynikiem jest tablica szerokich i powtarzających się ciągów.


2

R , 83/72 bajty

Alt podejście przy użyciu wyrażeń regularnych

Jeśli pozwolono nam na końcowy znak nowej linii, 72 bajty:

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

Wypróbuj online!

W przeciwnym razie 83 bajty:

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

Wypróbuj online!



1

Extended BrainFuck : 158

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

Okazuje się:

Brainfuck: 185

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

Wymaga interpretera, który ma 0 lub brak zmiany jako znacznik EOF. beef, dostępne z repozytoriów Ubuntu, działa pęczniejąc:

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

Nieskluczony kod EBF:

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

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

;;; Macros

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

{eol_end 
   )
}

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

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

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

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


;;; Main program 

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

1

Rebol - 87 79

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

Ładnie sformatowana wersja:

r: do input

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

Przykład użycia:

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. Ten kod działa obecnie tylko w Rebol 2 ( używana funkcja INPUT nie jest jeszcze w pełni zaimplementowana w Rebol 3).


1

R , 125 bajtów

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

Wypróbuj online!

Konwertuje ciąg znaków na UTF8, umieszcza w macierzy, której kolumny to wiersze tekstu (usuwając znaki nowej linii), a następnie powtarza każdy znak i wygenerowane linie przed drukowaniem oddzielnie od nowych linii.


Nawiasem mówiąc, gratulujemy 1K! :-)
Giuseppe

ty :-)! Wspaniale jest zobaczyć odpowiedzi R na większość pytań, a nawet wiele odpowiedzi na niektóre pytania.
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

Wygląda ciekawie. Ale pojawia się błąd: „Błąd: nie można znaleźć funkcji„ str_split ””. Czy muszę jawnie zainstalować pakiet stringr , aby móc uruchomić kod? (Przepraszamy, nie znam R.)
manatwork

czy nie brakuje wezwania catdo wydrukowania go jako standardowego? Dodatkowo każdy element sznurka powinien być nie tylko powtarzany n razy długości, ale powtarzany również w szerokości.
plannapus

Możesz także nieco bardziej rozegrać swoją funkcję: <-możesz =, paste0możesz ją tutaj zastąpić, pasteponieważ i tak używasz argumentu zwinięcia, a argument eachmożna skrócić e. Zobacz tutaj kilka podstawowych pomysłów na
grę

W przeciwnym razie jest to niezła próba (moja najkrótsza próba wciąż zawiera około 200 znaków :))
plannapus

@manatwork ok, już nie ma błędu bez ładowaniastringr
petermeissner

0

MATLAB: 20 ​​znaków

['' imresize(ans,n)]

To rozwiązanie zakłada, że ​​obraz jest przechowywany w pliku o nazwie startup.mi że podczas wywoływania Matlaba można podać liczbę replikacji, można to zrobić za pomocą:!matlab -r "n=3"&

MATLAB, wywołanie bez argumentu: 23 znaki

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

W przeciwieństwie do pierwszego rozwiązania, dwa ostatnie zakładają, że nie można oczekiwać liczby replikacji w wywołaniu. W przypadku tych rozwiązań oczekiwany jest oryginalny ciąg i numer w pliku wywoływanym matlab.matw bieżącym katalogu.

MATLAB, matematyczna alternatywa: 27 znaków

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

Oczekuje ciągu wejściowego „i” zawierającego nowe wiersze „\ n” jako separatora.

Sformatowany

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 bajtów

CJam jest nowszy niż to wyzwanie (a główna funkcja, z której korzystam, jest bardzo nowa), więc ta odpowiedź nie kwalifikuje się do zaakceptowania - ale i tak nie pokonuje APL, więc ...

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

Sprawdź to tutaj.

Wyjaśnienie

Dzięki nowemu, e*który powtarza każdy znak w ciągu, jest to bardzo proste:

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.

Zdaję sobie sprawę, że to stara odpowiedź, ale możesz zapisać bajt, używając zamiast tego funkcji:{N/1$fe*e*N*}
Esolanging Fruit

0

RProgN 100 bajtów (Windows) Niekonkurencyjny

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

RProgN nie ma znaków ucieczki podczas pisania, co powoduje, że każda obsługa nowych linii wymaga fizycznej nowej linii. Jako taka, ta odpowiedź (i wszelkie dane wejściowe) musi używać CRLF, a nie tylko LF. :(

Ponadto funkcja „rep” została dodana dopiero po wydaniu tego wyzwania, dlatego nie jest konkurencyjna.


0

Vim, 39 naciśnięć klawiszy (bez wprowadzania danych, niekonkurowania)

gotcha i powodem, dla którego to nie konkuruje, jest to, że dane wejściowe należy wprowadzić dwukrotnie. Zamień oba 2na własne dane wejściowe.

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

Wyjaśnienie

  • qayl2phxl@aquurejestruje makro szarpiące postać, wklej ją i przejdź do następnego, a następnie odtwarza się. Następnie cofa zmiany. Ponieważ chcemy, aby pętla nie była nieskończona, nie usuwamy znaku, co oznacza, że ​​musimy usunąć zewnętrzną, ale nadal kończymy ruchem, który kończy się niepowodzeniem na ostatnim znaku.
  • :%norm @a<cr> uruchamia makro w każdej linii
  • gg0 wraca do samego początku
  • qbyy2P2jkddj@bq@bużywa tej samej techniki, co @aprzy kopiowaniu każdej linii, ale z rekurencyjnym makrem.

Wiem, że można to bardziej pograć w golfa, np. Przechodząc wstecz do duplikacji linii, ale z powodu wymogu wielokrotnego wprowadzania danych, zatrzymam się tam i oznaczę tę odpowiedź jako niekonkurującą.

Poprzednia odpowiedź (32 naciśnięcia klawiszy, tylko dwukrotnie)

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

Wyjaśnienie

  • qaylpl@aqurejestruje makro szarpiące postać, wklej ją i przejdź do następnego, a następnie odtwarza się. Cofnij zmianę.
  • :%norm @a<cr> uruchamia makro w każdej linii
  • :%s/.*/&\r&<cr> podwaja każdą linię

Chciałem zrobić zagnieżdżone makro, ale wewnętrzny (znaki) zatrzymuje zewnętrzny (linie) ... Więc muszę uruchomić dwa polecenia, dodając całkiem sporo naciśnięć klawiszy do skądinąd prostego rozwiązania.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.