Der einfache Weg zum Code-Golf-Ascii!


18

Aufgabe:

Es gibt viele Antworten auf dieser Website, die wie diese in ASCII-Kunst gegliedert sind . Normalerweise wird die Anordnung manuell vorgenommen, aber würde ein Programm dabei nicht helfen? :)

Ihr Programm wird 3 Eingaben annehmen:

  • Der Code als eine einzelne Zeile
  • Die Anzahl der Zeilen im Muster (kann weggelassen werden, wenn dies nicht erforderlich ist.)
  • Das Muster selbst, als *s oder ein anderes Zeichen

Regeln:

  • Sie müssen ein Programm schreiben (keine Funktion), das von stdin liest
  • Der Text wird zeilenweise von links nach rechts platziert
  • Wenn nicht genügend Text vorhanden ist, um das Muster auszufüllen, setzen Sie .s in die verbleibenden Leerzeichen
  • Wenn zu viel Text vorhanden ist, um das Muster auszufüllen, drucken Sie ihn nach der Ausgabe aus
  • , also der kürzeste Code in Bytes gewinnt

Probeläufe:

Eingabe (Exakter Fit Test) :

qwertyuiopasdfghjklzxcvbnm
4
***** * ***
*   * * *
*   * * *
***** * ***

Ausgabe :

qwert y uio
p   a s d
f   g h j
klzxc v bnm

Eingabe (Sonderzeichentest) :

qwertyuiopasdfghjklzxcvbnm12345
4
***** * ***
*   * * *
*   * * *
***** * ***

Ausgabe :

qwert y uio
p   a s d
f   g h j
klzxc v bnm
12345

Eingabe (Test auf unzureichende Zeichen) :

qwertyuiopasdfg
4
***** * ***
*   * * *
*   * * *
***** * ***

Ausgabe :

qwert y uio
p   a s d
f   g . .
..... . ...

2
Welche Annahmen sollten darüber getroffen werden, wo Leerzeichen und Zeilenumbrüche eingefügt werden dürfen, ohne die Semantik des Programms zu ändern?
Peter Taylor

1
@PeterTaylor es scheint, dass es keinen Spielraum für das Platzieren / Trennen des Codes gibt, also nehme ich an, dass Semantik ignoriert wird?
Martin Ender

1
Wenn die Angaben "kann weggelassen werden" und "oder ein anderes Zeichen" in der Spezifikation bedeuten, dass wir beispielsweise festlegen können, dass die Anzahl der Zeilen weggelassen werden muss und dass die Sternchen beispielsweise durch " Xes" für unsere ersetzt werden sollen Programm zur Arbeit?
Ilmari Karonen

1
@ Bakuriu Ich verstehe deinen Kommentar nicht. Wenn Sie ein Programm in ASCII schreiben, ist jedes Zeichen ein Byte. Wenn Sie in UTF-32 schreiben, besteht jedes Zeichen aus 4 Bytes. Der kürzeste Code in Bytes , nicht in Zeichen, gewinnt gemäß der aktuellen Spezifikation. Es hört sich so an, als ob Sie möchten, dass die Kodierung eine Anforderung wird, aber ich verstehe nicht, warum dies erforderlich ist. Habe ich deinen Kommentar falsch verstanden?
Rainbolt

1
Aufgrund einiger Antworten, denen einige der Regeln fehlen, habe ich zwei Beispiele hinzugefügt und den gesamten Beispielblock aus Gründen der Übersichtlichkeit unter den Regelblock verschoben.
Veskah

Antworten:


5

GolfScript, 30 Zeichen

n/(\(;n*'*'/{@.!'.'*+([]+@+}*\

Online ausführen .

Beispiele:

> qwertyuiopasdfghjklzxcvbnm
> 4
> ***** * ***
> *   * * *
> *   * * *
> ***** * ***

qwert y uio
p   a s d
f   g h j
klzxc v bnm

> qwertyuiopasdfghjklzxcvbnm
> 1
> ***** * ***

qwert y uio
pasdfghjklzxcvbnm

> qwerty
> 2
> ***** * ***
> *   * * *

qwert y ...
.   . . .

10

Perl 6: 60 Zeichen BEARBEITEN : 38 Punkte (siehe unten)

  #C#O     D#E#G#O       #L#
#F    #.#S#       T#A#C#K
  get\     .subst(       "*"
,{    shift       BEGIN [
  get\     .comb,\       "."
xx    * ]},       :g)\ .\
  say\     xx get\       ()\
#E    #X#C#       H#A#N#G
  #E#.     #C#O#M#       #!#

Wenn Sie meine schrecklichen Kunstfertigkeiten nicht schätzen, ist hier das Golf:

get.subst("*",{shift BEGIN [get.comb,"."xx*]},:g).say xx get

Dieser macht komische Sachen mit Auswertungszeiten.

Erstens muss das BEGINSchlüsselwort [get.comb, "." xx *]zuerst ausgewertet werden, wobei die Liste der Zeichen, aus denen "der Code" besteht, in ein Array eingefügt wird, gefolgt von einer unendlichen Menge von "."s.

Als nächstes wird das getEnde ausgewertet und die Anzahl der Zeilen der ASCII-Grafikvorlage ermittelt. Der xxBediener wiederholt den ersten Teil des Programms so oft. Dies ist sinnvoller, wenn Sie feststellen, dass code() xx count()Zucker im Grunde genommen für Folgendes gilt code() for 1..count(): count()sollte zuerst bewertet werden.

Schließlich wird am getAnfang des Programms eine Zeile der ASCII-Grafikvorlage abgerufen und "*"durch einen Wert ersetzt, der vom Anfang des Arrays abweicht, das wir vor allem anderen erstellt haben ( {shift BEGIN …}).

BEARBEITEN:

Golfed bis zu 37 Zeichen, plus eine für die Befehlszeilenoption:

perl6 -pe's:g[\*]=shift BEGIN [get.comb,"."xx*]'

Dies ist das gleiche Konzept wie das Original, wobei der -pSchalter jede Zeile durchläuft (nachdem BEGIN"der Code" eingelesen wurde) und alle *s vor dem Drucken durch den nächsten Buchstaben aus "dem Code" ersetzt werden. Das Eingabeformat hierfür sollte nicht die Anzahl der Zeilen des Formats enthalten.


6

Ruby 2.0, 53 52 Zeichen

c=gets.chop
$><<gets($n).gsub(?*){c.slice!(0)||?.}+c

Verwenden Sie gemäß Spezifikation nicht den Parameter 'Anzahl der Zeilen'.

Beispiellauf:

qwertyuiopasd
***** * ***
*   * * *
*   * * *
***** * ***

Ausgabe:

qwert y uio
p   a s d
.   . . .
..... . ...

1
./ascii.rb: line 2: syntax error near unexpected token `(' ./ascii.rb: line 2: `puts gets($n).gsub(?*){c.slice!(0)||?.},c'
Nicht dass Charles

@Charles Ich kann den Fehler in keiner von mir installierten Version von Ruby finden. Hier ist der Code, der auf IDEONE ausgeführt wird: ideone.com/3HG3Fb
Paul Prestidge

seltsam. IDEONE hat gut funktioniert. Wie auch immer, können Sie ein Zeichen (der Raum) sparen durch Austausch puts mit $><<und die sich wandelnde ,am Ende ein+
nicht ,

@ Charles Guter Anruf. Vielen Dank!
Paul Prestidge

2

PowerShell , 63 86 83 82 Byte

+20 Bytes danke @Veskah

param($s,$p)-join($p|% *ht($s|% Le*)'*'|% t*y|%{if($_-eq42){$_=$s[$i++]}"$_."[0]})

Probieren Sie es online!

Weniger golfen:

param($string,$pattern)

$chars = $pattern |
    % PadRight ($string|% Length) '*' |
    % toCharArray |
    % {
        if($_-eq42){$_=$string[$i++]}    # $_ can become $null
        "$_."[0]                         # $_ or '.' if $_ is $null
    }
-join($chars)


2

T-SQL, 142 Bytes

@h ist der Eingabetext

@ ist das Muster

DECLARE @h varchar(max)='qwertyuiopasdfg'
DECLARE @ varchar(max)='
***** * ***
*   * * *
*   * * *
***** * ***'

WHILE @ like'%*'SELECT @=left(@,charindex('*',@)-1)+left(@h+'.',1)+stuff(@,1,charindex('*',@),''),@h=substring(@h,2,999)PRINT
concat(@,'
'+@h)

Probieren Sie es online aus



1

JavaScript - 199

text="qwertyuiopasdfghjklzxcvbnm";
pattern="***** * ***\n*   * * *\n*   * * *\n***** * ***";

function p(a,c){z=c.length,y=a.length,x=0;for(i=z;i-->0;)if(c[i]=="*")x+=1;if(x-y>0)for(i=x-y;i-->0;)a+=".";for(;i++<x;)c=c.replace(new RegExp("[*]"),a[i]);console.log(c);console.log(a.substring(x))}

p(text,pattern);

Gibt zusätzliche Zeichen in der Texteingabe aus, wenn sie nicht im Muster verwendet werden. Verwendet gepolstertes "." wenn es nicht genug gibt.

BEARBEITEN: geändert, um eine Funktion zu sein, die Text und Muster akzeptiert


4
Nizza ... aber dies verwendet fest codierte Eingabe.
TheDoctor

Ich war mir nicht sicher, wie ich mit Stdin von JS umgehen sollte, besonders mit den Newlines. Vorschläge?
Matt

@Matt Node? Spinnenaffe?
Nicht dass Charles

Vielleicht macht es eine Funktion ...
TheDoctor

4
136:function p(a,c){x=c.split(s='*').length-1;for(i=x-a.length;i--;)a+='.';for(;i++<x;)c=c.replace(s,a[i]);console.log(c+'\n'+a.substring(x))}
Michael M.

1

JavaScript (ES6) - 96 87

r=(c,p)=>{c=0+c;console.log(p.replace(/\*/g,t=>(c=c.substr(1),c[0]||'.'))+c.substr(1))}

Hinweis: Wie vom OP vorgeschlagen , verwende ich eine Funktion. Wenn Sie jedoch ein Programm benötigen, finden Sie hier eine 93-Zeichen-Lösung .

c=0+(x=prompt)();p=x();console.log(p.replace(/\*/g,t=>(c=c.substr(1),c[0]||'.'))+c.substr(1))

EDIT1: Große Änderung, ich weiß nicht, warum ich das zum ersten Mal nicht realisiert habe: P 40 Zeichen gespart.


Verwendung :

// r(code, pattern)
r("qwertyuiopasdfghjklzxcvbnm", "***** * ***\n*   * * *\n*   * * *\n***** * ***\n** ** **)

Testeingang : (ohne nicht benötigte optionale Nummer gemäß Spezifikation)

qwertyuiopasdfghjklzxcvbnm
***** * ***
*   * * *
*   * * *
***** * ***
** ** **

Ausgabe :

qwert y uio
p   a s d
f   g h j
klzxc v bnm
.. .. ..      // not much text was there to fill *s - replaced with dots as per spec

Ungolfed Code :

function run(code, pattern){
  code = "0" + code;  // prepend a zero; useful for the substring operation ahead

  pattern = pattern.replace(/\*/g, function(){  // replace the dots
    // by removing the first letter of code
    // and replacing dot with the first-letter of leftover code 
    // and if it isn't there (code finished)
    // return a dot

    code = code.substr(1); 
    return c[0] || '.';
  });
  }

  // after this operation; code contains the last letter of the org. code

  console.log(  p +  // the pattern has now code
                "\n" +   // and a newline
                c.substr(1) // if there is more than one letter of code left; display it
             );
}

Über Anregungen von Usern würde ich mich sehr freuen :)


1

Perl, 70 Zeichen

@_=split'',<>=~s/\n//r;<>;print/\*/?shift@_||'.':$_ for map{split''}<>

Oder ohne Begrenzungsprüfung 56 Zeichen

@_=split'',<>;<>;print/\*/?shift@_:$_ for map{split''}<>

Beachten Sie, dass dieser Code keine zweite Zeile wie in der Spezifikation verwendet und um drei Zeichen gekürzt werden kann <>;


1

Bash, 166 156 111 106

Liest von der Standardeingabe, nimmt keine Zeilenzählung an. Die erste Eingabezeile ist der Code, den Sie in ASCII-Kunst einfügen möchten, alle nachfolgenden Zeilen sind ASCII-Kunst, die aus dem @Zeichen besteht. Die Eingabe hat eine maximale Länge von 999 Zeichen und darf keine Schrägstriche enthalten . (Ich habe beschlossen, nicht zu verwenden *oder #weil sie in Bash eine besondere Bedeutung haben).

read -n999 -d/ i p
while [[ $p =~ @ && -n $i ]];do
p="${p/@/${i:0:1}}"
i=${i:1}
done
tr @ .<<<"$p"
echo $i

WARNUNG: Dieses Programm verwendet eine Datei namens p. Löschen pSie nach dem Ausführen des Programms - es verwirrt das Programm, wenn Sie es das zweite Mal ausführen.

Die meiste Arbeit wird hier von erledigt

p="${p/@/${i:0:1}}"
i=${i:1}

Die erste Zeile ersetzt die erste @in der Technik durch das erste Zeichen des Codes. Die zweite Zeile entfernt das erste Zeichen des Codes.

Wenn nicht genügend Code vorhanden ist, um die Form auszufüllen, wird eine neue Zeile nach der Hauptausgabe von gedruckt echo $i.


1

C, 98 , 91 Zeichen

Hier eine ziemlich einfache C-Lösung mit weniger als 100 Zeichen. Der Zeilenzähleingang wird nicht verwendet. (Andernfalls wird eine zweite nicht benötigte () benötigt).

char b[999],*s;c;main(){gets(s=b);while(~(c=getchar()))putchar(c^42?c:*s?*s++:46);puts(s);}

ungolfed:

char b[999],*s;c;
main(){
    gets(s=b);
    while(~(c=getchar()))
        putchar(c^42?c:*s?*s++:46);
    puts(s);
}

Sie können puts(s)anstelle von printf("%s",s)7 Bytes speichern.
nyuszika7h

@ nyuszika7h Danke! Aber ich weiß nicht, ob der Zusatz \nein Problem ist.
MarcDefiant

1

Python 2.7, 165 155 150 138 119 Zeichen

Okay, so ziemlich, aber ich denke, es ist der kleinste Weg, dies mit Python zu tun.

import sys
r=raw_input
l=list(r())
w=sys.stdout.write
for c in"\n".join([r()for _ in[1]*input()]):w(c=='*'and(l and l.pop(0)or'.')or c)
w("".join(l))

Edit: Neue funktionale Version 1.0.1 mit noch weniger verwendeten Bytes:

Edit2: map(r,['']*input()) statt [r()for _ in[1]*input()]und entfernt nicht verwendeten Import

Edit3: '>'*input() anstatt ['']*input()ein Zeichen zu speichern und ein Eingabeaufforderungszeichen für das Muster hinzuzufügen :)

r=raw_input
l=list(r())
print''.join(map(lambda c:c=='*'and(l and l.pop(0)or'.')or c,"\n".join(map(r,'>'*input())))+l)

Sie können (['.']+l).pop(0)anstelle von (len(l)and l.pop(0)or'.')9 Bytes speichern. Und input()anstatt int(r())1 Byte zu speichern.
nyuszika7h

Danke dafür input! Ihr erster Ratschlag funktioniert leider nicht, da er Punkte ausgibt, solange die Länge der Zeichenfolge> 0 ist.
Avall

Ich sehe, warum mein Vorschlag nicht korrekt ist. Versuchen Sie es (l+['.']).pop(0)stattdessen, aber wenn dies auch nicht funktioniert, können Sie trotzdem 4 Bytes sparen, indem Sie l andanstelle von verwenden len(l)and.
nyuszika7h

(l+['.']).pop(0)ll
Entfernt


0

05AB1E , 18 17 15 Bytes

s0¢.$«0¹S.;0'.:

Nimmt den Code als erste Eingabe, das Muster als zweites (mit 0statt #).

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

18 15 Bytes Alternative, indem die Eingaben in umgekehrter Reihenfolge vorgenommen werden:

0¢.$¹ì0IS.;0'.:

Probieren Sie es online aus .

Erläuterung:

s                # Swap with implicit inputs, so the stack order is now: [code, pattern]
 0¢              # Count the amount of "0" in the pattern
   .$            # Remove that many leading characters from the code
     «           # Append it to the (implicit) pattern input
      0¹S.;      # Replace every "0" one by one with the characters of the first code input
           0'.: '# Then replace any remaining "0" with "."
                 # (after which the result is output implicitly as result)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.