Vergrößern Sie ASCII-Kunst

64

In dieser Herausforderung müssen Sie mehrzeilige ASCII-Grafiken als Eingabe verwenden, z.

 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      

Und Sie werden auch eine ganze Zahl als Eingabe nehmen. Sie müssen die ASCII-Grafik um den mit der Ganzzahl angegebenen Betrag vergrößert ausgeben. Wenn Sie beispielsweise ein zweites Argument von verwenden 3, lautet die Ausgabe

   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

Insbesondere muss sich jedes Zeichen in ein nBy- nFeld dieses Zeichens verwandeln , wobei nes sich um das ganzzahlige Argument handelt. Zum Beispiel eine Eingabe von

ab
cd

und 3 ergeben

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

Das ist , also gewinnt der kürzeste Code in Bytes.

Türknauf
quelle
ASCII-Kunst sieht interessant aus auf der
Justin
6
Ich denke, Sie sollten eine Sekundär- / Bonusrunde für eine Methode abschließen, die ein korrektes Aliasing in die vergrößerte Kunst einführt. Ihre riesige Codegolfkunst schaut recht blocky.
AmeliaBR
5
@ AmeliaBR Siehe hier .
Howard

Antworten:

37

APL, 7 Zeichen / Byte *

{⍺/⍺⌿⍵}

Funktion, die die Zahl und die Eingabezeichenfolge als Parameter verwendet und das Ergebnis zurückgibt:

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

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ *: APL kann in einem eigenen (Legacy-) Einzelbyte -Zeichensatz geschrieben werden, der APL-Symbole den oberen 128-Byte-Werten zuordnet
. Aus diesem Grund kann ein Programm mit N Zeichen , das nur ASCII-Zeichen und APL-Symbole verwendet, als N Byte lang betrachtet werden.

Tobia
quelle
1
...: O Wie geht das?
Türklinke
4
@DoorknobofSnow Die Standarddarstellung für eine mehrzeilige Zeichenfolge lautet APL. Es handelt sich um eine rechteckige Zeichenmatrix (mit nachgestellten Leerzeichen, wenn die Zeilen eine ungleichmäßige Breite haben ... ja, APL ist so alt.) Die /Funktion (nicht zu verwechseln mit dem /Operator ... ja, dasselbe Symbol ) dupliziert und / oder entfernt Spalten aus einer Matrix gemäß dem Argument auf der linken Seite. Wenn dies ein Skalar (einfache Zahl) ist, wird er für alle Eingabespalten repliziert. Daher 2/mist eine Matrix mit allen Spalten verdoppelt. Die Variante macht das gleiche, aber für Zeilen (oder Ebenen der ersten Achse im allgemeinen Fall.)
Tobia
6
Schöne Sprache, nicht wahr? Es ist eigentlich ziemlich lesbar, sobald Sie ein paar Dutzend Symbole gelernt haben. Viel mehr als die ASCII-Linienrauschsprachen, die Sie hier sehen ...
Tobia
Cool. War ich immer in der Sprache? Es war nicht im Buch von Gilman und Rose enthalten, und ein Buch von Iverson über APL \ 360 erwähnt / [1], aber nicht ⌿.
Mark Plotnick
2
Beeindruckend. Das. Ist. Gerade. Genial. Ich bin. Stark. Ehrfürchtig. Durch. Diese. Code. Ich möchte mehr als nur +1 anbieten, aber meine Wiederholung ist für ein Kopfgeld noch ziemlich niedrig.
Erik der Outgolfer
35

GolfScript, 20 Zeichen

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

Nimmt alle Eingaben von STDIN, die erste Zeile ist der Skalierungsfaktor, der Rest die Mehrzeileneingabe. Sie können das Beispiel online ausprobieren .

Eingang

3
ab
cd

Ausgabe

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

Code

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
quelle
Hallo! Sie haben ein besseres Eingabeformat, eine bessere Punktzahl und eine bessere Zeit als ich: - / +1
John Dvorak
Außerdem habe ich es irgendwie verloren, es zu lesen.
John Dvorak
2
@ JanDvorak Fügte eine Erklärung hinzu.
Howard
Beeindruckend. Heute habe ich gelernt 1/. Ich muss auch value function +mehr verwenden.
John Dvorak
2
@CoryKlein: Es wäre irgendwie hilfreich, wenn Sie uns sagen würden, welcher Fehler vorliegt, aber ... * blickt in die Kristallkugel * ... es kann sein, golfscript.rbdass die erste Zeile nicht als ausführbar markiert ist oder dass der Pfad zum Ruby-Interpreter falsch ist für Ihr System. Oh, und das echosollte vermutlich sein cat. Probieren Sie es aus cat inputFile | ruby golfscript.rb scriptFile(oder versuchen Sie es einfach ruby golfscript.rb scriptFile < inputFile) und sehen Sie, ob das funktioniert.
Ilmari Karonen
19

J, 20 bis 17 Zeichen

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

Definiert ein Verb f, das das tut, was erforderlich ist. Verwendungszweck:

   3 f a
aaaccc
aaaccc
aaaccc
bbbddd
bbbddd
bbbddd

wo aist die Eingabezeichenfolge.
Unter Windows ist ein zusätzliches Zeichen erforderlich, um Folgendes zu entfernen \r:

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

Erklärung :

];._2Zerlegt die Eingabezeichenfolge basierend auf dem letzten Zeichen der Zeichenfolge in Blöcke. In diesem Fall ist dies a \n. Windows hat \r\nso müssen wir verwenden }:ein zusätzliches Zeichen zu hacken: }:;._2. Verbdokumentation ausschneiden

Der Rest des Codes (mit Ausnahme der Zuweisung f=.) ist ein Fork .
Es bricht so zusammen:[ #&.|: #

Wenn dies aunsere Eingabezeichenfolge ist, lautet die Berechnung 3 # a(wir nennen dieses Ergebnis x), dann 3 [ a(wir nennen dieses Ergebnis y) y #&.|: x.

3 # amacht nur drei Kopien von jedem Mitglied von a. Verbdokumentation kopieren
Dies dreht sich

ab
cd

in

aaabbb
cccddd

3 [ aGibt gerade 3 zurück. Dokumentation des linken Verbs

Endlich y #&.|: xwird ykopiert und transponiert x. Das #funktioniert wie zuvor, aber das &.|:weist J an, den Eingang zuerst zu transponieren und ihn dann wieder zurück zu transponieren, wenn er fertig ist. Unter Verbindung Dokumentation , Verb Dokumentation transponieren .

Die Transponierung dreht sich

aaabbb
cccddd

in

ac
ac
ac
bd
bd
bd

dann ändert sich die Kopie in

aaaccc
aaaccc
aaaccc
bbbddd
bbbddd
bbbddd

und es zurück zu transponieren gibt Ihnen

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd
Gareth
quelle
4
Windows ist zum Kotzen, oder? : P
cjfaure
@ Trimsty Tatsächlich.
Gareth
Dies ist kürzer: [##"1Ich bin mir auch nicht sicher über die ungeschriebenen Regeln des Golfspiels in J, aber ich würde sagen, dass die Aufteilung der Saiten und die Zuweisung weggelassen werden könnten, angesichts der losen Anforderungen der Frage. Das habe ich in meiner APL-Antwort auf jeden Fall getan. Beispiel:2 ([##"1) 'abcde',:'fghij'
Tobia
17

Haskell, 49 Bytes

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

Die Vergrößerungsfunktion verwendet eeine Zählung und eine Zeichenfolge und gibt eine Zeichenfolge zurück:

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

APL, 11 Zeichen

@Gareth hat im Wesentlichen dasselbe zuerst in J getan, daher ist dieser APL-Eintrag nur für Ausstellungen gedacht, nicht für Wettbewerbe - er ist der Gewinner.

      E←{⍉⍺/⍉⍺/⍵}

Verwendung: Vergrößerung in linkem Argument (⍺), Grafik in Form einer 2D-Zeichenmatrix in rechtem Argument (⍵).
⍺ / ⍵ repliziert Elemente in jeder Zeile eines Vektors oder einer Matrix (2 / 'OO' wird zu 'OO OO').
⍉⍺ / ⍉ transponiert das, repliziert die Elemente, transponiert das.

(Wenn wir Klarheit statt Programmlänge wünschen, könnte der Code E ← {⍺ / [1] ⍺ / ⍵} lauten.)

      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
Mark Plotnick
quelle
Ich sollte jedoch darauf hinweisen, dass ich 5 Zeichen verwende, um die Zeichenfolge in ein Zeichen-Array umzuwandeln, sodass Sie mich wirklich nur um 1 Zeichen schlagen. :-)
Gareth
2
J wird von diesem lästigen Entwurfsziel behindert, bei dem Operatoren auf den ASCII-Zeichensatz beschränkt sind. :)
Mark Plotnick
2
Wenn wir jedoch wie im OP angegeben in Bytes messen, sind dies 44 Bytes (was natürlich Unicode bedeutet, nicht utf-8) und @ Gareths ist immer noch 17. Das ist der Nachteil von Sprachen, die nicht auf ASCII beschränkt sind.
cjfaure
5
@Trimsty Aber APL hat einen eigenen Zeichensatz, der jedes Zeichen einem einzelnen Byte zuordnet. Das sind also wohl immer noch 11 Bytes.
Volatility
1
@Volatility Hm. Das ist wirklich komisch, sorry, wusste es nicht: P
cjfaure
13

Bash / Sed-Schrift, 48 Zeichen

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

Als Skript speichern chmod +xund ausführen:

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

Wie funktioniert es?

Das Fleisch davon ist im sedBefehl. Wenn beispielsweise n = 3 ist, wird der sed-Befehl folgendermaßen erweitert:

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

Dieser zusammengesetzte sedBefehl kann unterteilt werden in:

  • s/./&&&/g - Dieser Ersatzbefehl entspricht jedem Zeichen und ersetzt es durch das dreimal wiederholte Zeichen
  • 3x pBefehle - Hiermit wird nur dreimal der gesamte Musterbereich (dh die aktuelle Zeile) gedruckt

Wir übergeben -nsed die Anweisung, nichts zu drucken, es sei denn, es wird ausdrücklich dazu aufgefordert, sodass wir die volle Kontrolle darüber haben, was und wie oft gedruckt wird.

Ich konnte keinen schnellen Weg finden, um sich wiederholende Strings in beliebiger Länge direkt zu generieren. Deshalb sedhabe ich bashstattdessen einige Tricks angewendet :

printf -vr "%3s"

Dies druckt einen String (nicht spezifiziert, dh leer) mit 3 führenden Leerzeichen und weist das Ergebnis der bashVariablen zu r.

Wir verwenden dann die bashParametererweiterung, um diese Zeichenfolge in das zu transformieren, was wir in den sedAusdruck einsetzen müssen:

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

Es gelang mir, Anführungszeichen um den printfFormatbezeichner und den sedAusdruck zu entfernen , da keines der enthaltenen Zeichen in der bashShell maskiert werden musste.

Zeichenanzahl:

$ submission='r=`printf %$1s`
> sed -n s/./${r// /&}/g${r// /;p}'
$ echo ${#submission}
48
$ 
Digitales Trauma
quelle
Ich habe keine Ahnung, wie das funktioniert, aber es funktioniert!
Tomas
1
Variable n verstößt gegen Regel 1: "Darf NICHT fest codiert sein".
Manatwork
1
Verwenden $1und entfernen n=3;Sie einfach , Sie werden sogar 4 Zeichen und möglicherweise auch das {}im printf speichern .
Tomas
Und wie wir $ 1 annehmen kann , wird numerisch sein, die Anführungszeichen um printfdas Argument sind nicht notwendig, es zu 52 Zeichen reduziert: r=`printf %$1s`;sed -n "s/./${r// /&}/g${r// /;//p}".
Manatwork
1
@Tomas - Sie haben wahrscheinlich herausgefunden, wie es jetzt funktioniert, aber ich habe eine Beschreibung hinzugefügt, falls Sie interessiert sind.
Digital Trauma
9

PERL,  41 39 25   22 Zeichen

PERL, einfach und effektiv - passend zur Aufgabe. Wenn mit aufgerufen -pi3, wo 3ist der Parameter n:

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

Klassische Lösung (39 Zeichen):

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

Klassische Lösungsbedürfnisse die nin der ersten Eingabezeile angegeben sind, z

3
ab
cd

Danke @manatwork für den $&Trick.

Tomas
quelle
1
Cool. Aber Sie müssen nicht die angepassten Zeichen erfassen: s/./$&x$n/ge.
Manatwork
8

Ruby:  64  49 Zeichen

Alle auf STDIN empfangenen Daten: Zuerst den Skalierungsfaktor, dann die ASCII-Grafik.

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

Probelauf:

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 Zeichen

Angenommen, jede Eingabezeile wird mit einem Zeilentrennzeichen abgeschlossen. Vielen Dank an @Ventero.

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

Probelauf:

bash-4.2$ ruby -ne '$.<2?n=$_.to_i: $><<$_.gsub(/./){$&*n}*n' <<< '3
> ab
> cd'
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd
Mann bei der Arbeit
quelle
1
Ein kürzerer Weg zum Setzen n: $.<2?n=$_.to_i: $><<$_.gsub(/./){$&*n}*n(Leider ist der Abstand nach dem Doppelpunkt notwendig, sonst wird der Parser verwirrt). Laufen Sie mit ruby -n.
Ventero
Doh. Ich habe Dutzende von Ansätzen versucht, um die Zuweisung auf n zu verkürzen, aber ich habe den ternären Operator verpasst. Vielen Dank, @Ventero.
Manatwork
6

Python 3 - 84

Nicht die kürzeste, aber dennoch eine andere Antwort. Ein interessanter Einzeiler.

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

Geben Sie zuerst eine Zahl ein, dann die ASCII-Grafik als Python-Liste, zB:

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

GolfScript, 29 Zeichen

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

Dies definiert einen Block f, der beim Aufruf die gewünschte Ausgabe erzeugt. Es wird davon ausgegangen, dass sich Argumente auf dem Stapel befinden (da die Argumente im Grunde genommen in GolfScript so übergeben werden).

Ungolfed (macht das überhaupt Sinn?: 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
Türknauf
quelle
5

Golfscript, 23 Zeichen

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

Ich habe beschlossen, ein gesamtes Programm zu schreiben, da es weniger Overhead hat als eine anonyme Funktion:

  • ~(:i;- die Eingabe auswerten, dann den Multiplikator dekrementieren, als speichern iund verwerfen.
  • n/{...}%n* - durch Zeilenumbrüche teilen, jede Zeile zuordnen, durch Zeilenumbrüche verbinden
    • {...}:c%c, - nimm einen Block, wende ihn auf jedes Map-Element an und wende ihn dann auf die gesamte Zeile an.
      • {.}i*- dupliziere dieses Element imal

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

Anwendungsbeispiel:

;'"abc
def"3'
~(:i;n/{{{.}i*}:c%c}%n*
John Dvorak
quelle
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))

Geben Sie zuerst die Nummer und dann die Zeichenfolge ein. Sollte selbsterklärend sein ...

Vielen Dank an Waleed Khan für den Vorschlag, das zu entfernen []

Vielen Dank an Volatility für den Vorschlag, aeine Liste zu erstellen.

Justin
quelle
7
Gerade bemerkt; Die NSA beobachtet jede Eingabe
Justin
Kürzester Code in Bytes. Würde das nicht auch Zeilenumbrüche beinhalten? Sollte Ihre Zählung nicht 112 sein?
cjfaure
Entschuldigung, ich meinte 111.
cjfaure
@Trimsty du hast recht; Ich dachte wordcounter.net zählt Zeilenumbrüche.
Justin
2
Machen Sie aeine Liste, machen Sie a+=[''.join(c*n for c in s)]*n, dann machen Sie print('\n'.join(a))am Ende. Das sollte funktionieren.
Volatility
5

Java - 217

Versuchen Sie zuerst, Golf zu spielen. Scheint so, als ob Java nicht die Sprache ist, in der das gemacht wird.

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

Unter Windows müssen Sie "\ n" durch "\ r \ n" ersetzen.

java M 3 "ab
cd"
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd
Danny
quelle
2
Die Eingabezeichen müssen sowohl nach unten als auch nach oben erweitert werden ( in Ihrem obigen Ausgabebeispiel sollten also 3 Zeilen mit aaabbbund 3 Zeilen mit vorhanden sein cccddd).
Gareth
2
Sie können Folgendes sparen: 1 Zeichen durch Initialisieren von i in der Deklaration anstelle von for; 8 Zeichen mit a anstelle von x ( a=a[1].split("\n")und ändern Sie alle x mit a).
Manatwork
3
Ja, in jeder Sprache, in der nur die Deklaration von mainmehr Bytes als ganze Programme in anderen Sprachen benötigt, werden die Teilnehmer Bogeys bekommen.
Mark Plotnick
2
Hm, ok. Hier sind 3 Zeichen, die durch ein kleines Umstellen des Outter for Loop gespart wurden: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
Weitere 4 Bytes: Integer.valueOf(a[0])->new Integer(a[0])
Yurii Shylov
5

(Bearbeiten: Diese Lösung ist jetzt ungültig, da sich die Semantik der Anweisung geändert hat. Ich habe nicht bemerkt, dass ich die Anweisung bereits verwendet habe, als ich sie geändert habe. Sie können dieses Programm jedoch korrigieren, indem Sie es einfach in ändern die neuere Anweisung .)

Sclipting , 19 Zeichen

Erwartet, dass die Eingabe durch \n(Nein \r) getrennt wird und die erste Zeile den Multiplikationsfaktor enthält.

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

Erläuterung

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

Am Ende sieht der Stack so aus:

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

Alles über der Marke wird automatisch verkettet und ausgegeben, der Rest wird verworfen.

Timwi
quelle
这太有意思了你是原创者对吧!?
theGreenCabbage
@theGreenCabbage 对 对. 踢木外是这个电脑语言的
Justin
1
@ Timwi Entschuldigung für den Anruf 踢 踢 外 (Kick Holz außerhalb, ausgesprochen Tee-Moo-warum) ...
Justin
@Quincunx: Hehe, ich fand es lustig :) Aber das Finale iwird ausgesprochen [iː], nicht [ɑi]; Wie würden Sie es jetzt auf Chinesisch schreiben?
Timwi
@ Timwi Dachte, so wird es ausgesprochen (aber ich konnte mir keinen entsprechenden Charakter vorstellen). Ich schrieb durch Suchen und Kopieren-Einfügen (auf mdbg.net/chindict/chindict.php )
Justin
3

J, 7 Zeichen

([#"1#)

Genau das gleiche wie in der APL-Antwort von @ Tobia, aber in ASCII-Zeichen.

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

2 ([#"1#) a
  00  
  00  
00  00
00  00
  00  
  00  
Barbermot
quelle
3

Powershell (96)

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

Ich dachte, ich würde das in PS ausprobieren. Verwenden Sie Piping in foreachs (%), um es hier kurz zu halten, aber die functionund ToCharArraysorgen dafür, dass es einen Treffer gibt.

Um es zu benutzen, rufen Sie es von der Kommandozeile wie folgt auf:

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

Hier ist die nicht minimierte Version:

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
quelle
2
Mazzy schlug function m($n,$s){-split$s|%{,(-join($_-split''|%{$_*$n}))*$n}}für 63 Bytes vor
ovs
2

Julia, 74 Zeichen / 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 weniger, wenn ich nur die Zeichenfolge zurückgeben. julia>ist die interaktive Eingabeaufforderung.

gggg
quelle
1
Dies ist das erste Julia Golf, das ich gesehen habe.
cjfaure
@Trimsty codegolf.stackexchange.com/search?q=julia immer noch sehr selten, aber es waren einige (auch von einem der Designer der Sprache).
Plannapus
@plannapus Interessant! Es gibt einen neuen, seltenen Esolang namens ~ - ~! Das habe ich auch benutzt, obwohl es fürchterlich zum Golfen ist.
cjfaure
2

Powershell, 54 Bytes

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

Testskript:

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

Erläuterung:

  • $s-replace'.',('$0'*$n) wiederholt jedes Symbol mit Ausnahme einer neuen Zeile.
  • -split'``n' Teilt die breite Zeichenfolge durch eine neue Zeile
  • |%{,$_*$n} Wiederholt jede Zeile als Array-Element und gibt das Array zurück

Das Ergebnis ist eine Reihe breiter und wiederholter Zeichenfolgen.

mazzy
quelle
2

R 83/72 Bytes

Alt Ansatz mit regulären Ausdrücken

Wenn wir eine abschließende Zeile mit 72 Bytes zulassen:

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

Probieren Sie es online!

Ansonsten 83 Bytes:

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

Probieren Sie es online!

J.Doe
quelle
1

K, 20

.....

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

Extended BrainFuck : 158

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

Es verwandelt sich in:

Gehirnfick: 185

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

Es wird ein Interpreter benötigt, der entweder 0 oder keine Änderung als EOF-Marker hat. beef, erhältlich bei Ubuntu Repos, funktioniert wie folgt:

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

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

Rebol - 87 79

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

Schön formatierte Version:

r: do input

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

Anwendungsbeispiel:

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. Dieser Code funktioniert derzeit nur in Rebol 2 (Die verwendete INPUT- Funktion ist in Rebol 3 noch nicht vollständig implementiert).

draegtun
quelle
1

R , 125 Bytes

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

Probieren Sie es online!

Konvertiert die Zeichenfolge in UTF8, fügt sie in eine Matrix ein, deren Spalten Textzeilen sind (Entfernen von Zeilenumbrüchen), und wiederholt dann jedes Zeichen und die generierten Zeilen, bevor sie durch Zeilenumbrüche getrennt gedruckt werden.

JayCe
quelle
Glückwunsch übrigens zu 1K! :-)
Giuseppe
ty :-)! Es ist großartig zu sehen, dass R die meisten Fragen beantwortet und manche Fragen sogar mehrfach beantwortet.
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
Petermeißner
quelle
Sieht interessant aus. Aber ich bekomme eine Fehlermeldung: "Fehler: Funktion" str_split "konnte nicht gefunden werden". Muss ich das stringr- Paket explizit installieren , um Ihren Code ausführen zu können? (Sorry, nicht vertraut mit R.)
Manatwork
Fehlt nicht ein Aufruf catzum Drucken als Standardausgabe? Zusätzlich sollte jedes Element der Zeichenkette nicht nur n-mal in der Länge wiederholt werden, sondern auch in der Breite.
Plannapus
Sie können auch ein bisschen mehr Golf spielen: <-kann sein =, paste0kann hier durch ersetzt werden, pasteda Sie ohnehin das Collapse-Argument verwenden und das Argument eachauf kürzen können e. Sehen Sie hier einige grundlegende Ideen auf Golf spiel mit R.
plannapus
Ansonsten ist es ein schöner Versuch (mein kürzester Versuch ist immer noch in den 200 Zeichen oder so :))
Plannapus
@manatwork ok, kein Fehler mehr ohne Ladenstringr
petermeissner
0

MATLAB: 20 ​​Zeichen

['' imresize(ans,n)]

Diese Lösung setzt voraus, dass das Bild in einer aufgerufenen Datei gespeichert ist startup.m und dass matlab beim Aufrufen die Anzahl der Replikationen mitteilen darf. Dies kann folgendermaßen erfolgen:!matlab -r "n=3"&

MATLAB, Aufruf ohne Argument: 23 Zeichen

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

Im Gegensatz zur ersten Lösung gehen die beiden letzteren davon aus, dass die Anzahl der Replikationen im Anruf möglicherweise nicht erwartet wird. Für diese Lösungen werden die ursprüngliche Zeichenfolge und Nummer in einer Datei mit dem Namen erwartetmatlab.mat in Ihrem aktuellen Verzeichnis .

MATLAB, mathematische Alternative: 27 Zeichen

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

Erwartet die Eingabezeichenfolge "i" mit den neuen Zeilen "\ n" als Begrenzer.

Formatiert

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))));
 }
mikrobisch
quelle
0

CJam, 14 Bytes

CJam ist neuer als diese Herausforderung (und das Hauptfeature, das ich verwende, ist tatsächlich sehr neu), sodass diese Antwort nicht akzeptiert werden kann - aber es schlägt APL trotzdem nicht, also ...

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

Teste es hier.

Erläuterung

Mit dem neuen e*Befehl, der jedes Zeichen in einer Zeichenfolge wiederholt, ist dies wirklich einfach:

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
quelle
Mir ist klar, dass dies eine alte Antwort ist, aber Sie können ein Byte speichern, indem Sie stattdessen eine Funktion verwenden:{N/1$fe*e*N*}
Esolanging Fruit
0

RProgN 100 Bytes (Windows) Nicht konkurrierend

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

RProgN verfügt nicht über Zeichen, die beim Schreiben verloren gehen, sodass für die Bearbeitung neuer Zeilen eine physische neue Zeile erforderlich ist. Als solche muss diese Antwort (und jede Eingabe) CRLFs anstelle von nur LFs verwenden. :(

Außerdem wurde die 'rep'-Funktion erst hinzugefügt, nachdem diese Herausforderung ausgegeben wurde, da dies nicht konkurrierend ist.

Ein Taco
quelle
0

Vim, 39 Tastenanschläge (ohne Eingabe, nicht im Wettbewerb)

Das GOTCHA und der Grund dafür, dass dies nicht konkurriert, ist, dass die Eingabe zweimal eingegeben werden muss. Ersetzen Sie beide 2durch Ihre eigenen Eingaben.

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

Erläuterung

  • qayl2phxl@aquuZeichnet ein Makro auf, das einen Charakter reißt, ihn einfügt, zum nächsten übergeht und sich dann selbst wiederholt. Dann macht es die Änderungen rückgängig. Da wir möchten, dass die Schleife nicht unendlich ist, löschen wir das Zeichen nicht. Dies bedeutet, dass wir das überflüssige Zeichen löschen müssen, aber trotzdem mit einer Bewegung enden müssen, die beim letzten Zeichen fehlschlägt.
  • :%norm @a<cr> Führt das Makro in jeder Zeile aus
  • gg0 kehrt zum Anfang zurück
  • qbyy2P2jkddj@bq@bVerwendet die gleiche Technik, @aum jede Zeile zu kopieren, jedoch mit einem rekursiven Makro.

Ich weiß, dass man mehr Golf spielen kann, z. B. indem man zur Zeilenverdoppelung rückwärts fährt, aber wegen der Mehrfacheingabe werde ich anhalten und diese Antwort als nicht konkurrierend markieren.

Vorherige Antwort (32 Tastenanschläge, nur Doppelanschläge)

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

Erläuterung

  • qaylpl@aquZeichnet ein Makro auf, das einen Charakter reißt, ihn einfügt, zum nächsten übergeht und sich dann selbst wiederholt. Machen Sie die Änderung rückgängig.
  • :%norm @a<cr> Führt das Makro in jeder Zeile aus
  • :%s/.*/&\r&<cr> verdoppelt jede Zeile

Ich wollte ein verschachteltes Makro erstellen, aber das innere (Zeichen) stoppt das äußere (Zeilen) ... Daher muss ich zwei Befehle ausführen und einer ansonsten einfachen Lösung einige Tastenanschläge hinzufügen.

Christian Rondeau
quelle