ゴルフアスキーアートをコーディングする簡単な方法!


18

仕事:

このサイトには、このようなアスキーアートにアレンジされた多くの回答があります。通常、配置は手動で行われますが、プログラムはそれを助けませんか?:)

プログラムには3つの入力があります。

  • 1行のコード
  • パターンの行数(必要でない場合は省略できます)
  • *sまたは別のchar としてのパターン自体

ルール:

  • stdinから読み取るプログラム(関数ではない)を作成する必要があります
  • テキストは行ごとに左から右に配置されます
  • パターンを埋めるのに十分なテキストがない場合は.、残りのスペースにsを入れます
  • パターンを埋めるにはテキストが多すぎる場合は、出力後に印刷してください
  • 、バイト単位の最短コードが勝ちます

サンプル実行:

入力(完全適合テスト)

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

出力

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

入力(余分な文字のテスト)

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

出力

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

入力(不十分な文字のテスト)

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

出力

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

2
プログラムのセマンティクスを変更せずにスペースと改行を挿入できる場所について、どのような仮定が必要ですか?
ピーターテイラー

1
@PeterTaylorコードを配置/分離する余裕がないようですので、セマンティクスは無視されると思いますか?
マーティンエンダー

1
スペック平均の部分を「省略することができる」と「または別のchar」行うことを我々している、と言う、行数があることを指定して自由にする必要があり省略することとアスタリスクは、たとえば、に置き換えられるべきであることXのために私たちのES動作するプログラム?
イルマリカロネン

1
@Bakuriuコメントがわかりません。ASCIIでプログラムを作成する場合、各文字は1バイトです。UTF-32で記述する場合、各文字は4バイトです。現在の仕様では、文字ではなくバイト単位の最短コードが優先さます。エンコードが必要になるように思えますが、なぜ必要なのかわかりません。あなたのコメントを誤解しましたか?
レインボルト

1
いくつかのルールが欠落しているいくつかの回答に基づいて、2つの例を追加し、わかりやすくするためにルールブロックの下にサンプルブロック全体を移動しました。
ヴェスカ

回答:


5

GolfScript、30文字

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

オンラインで実行します

例:

> 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 文字 EDIT:38ポイント(下を参照)

  #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#       #!#

あなたが私のひどいアートスキルに感謝しないなら、ここにゴルフがあります:

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

これは、評価時間で奇妙なことをします。

まず、BEGINキーワード[get.comb, "." xx *]が最初に評価され、「コード」を構成する文字のリストが配列に入れられ、その後に無限の"."sが続きます。

次に、get最後に評価され、ASCIIアートテンプレートの行数を取得します。xxオペレータは、プログラムの最初の部分にこの何度も繰り返されます。これcode() xx count()が基本的に砂糖であることに気付いたとき、これはより理にかなっていますcode() for 1..count()count()最初に評価されるべきです。

最後に、getプログラムの先頭にあるASCIIアートテンプレートの行を取得し、"*"すべてを、他のすべての前に作成した配列の先頭からシフトした値で置き換えます({shift BEGIN …})。

編集:

37文字までゴルフに加えて、コマンドラインスイッチ用に1つ追加しました。

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

これはオリジナルと同じ概念で、-pスイッチは各行を反復処理し(BEGIN「コード」を読み取った後)、すべて*のsを「コード」の次の文字で置き換えてから印刷します。この入力形式には、形式の行数を含めないでください。


6

Ruby 2.0、 53 52文字

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

仕様に従って、「行数」パラメーターは使用しません。

実行例:

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

出力:

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'
チャールズ、

@Charles私がインストールしたRubyのどのバージョンでも、そのエラーを受け取ることはできないようです。IDEONEで実行されるコードは次のとおりです
ポール・プレスティッジ2014年

変だ。IDEONEは正常に動作しました。とにかく、あなたは置き換えることによって、文字(スペース)を節約することができputs $><<、変化,への終わり+
未チャールズことを

@チャールズ良い電話。ありがとう!
ポールプレストリッジ

2

PowerShell63 86 83 82バイト

@Veskahに感謝+20バイト

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

オンラインでお試しください!

少ないゴルフ:

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バイト

@hは入力テキストです

@はパターンです

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)

オンラインで試す



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

パターンで使用されていない場合、テキスト入力に余分な文字を出力し、埋め込み「。」を使用します 十分でない場合。

編集:テキストとパターンを受け入れる関数に変更


4
素晴らしい...しかし、これはハードコーディングされた入力を使用します。
TheDoctor

JSの標準入力を処理する方法、特に改行を使用する方法がわかりませんでした。提案?
マット

@Matt Node?クモザル?
チャールズじゃない

おそらくそれを機能にする...
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))}
マイケル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))}

注:OP提案されているように、私は関数を使用しています。しかし、プログラムが必要な場合は、93文字のソリューションがあります。

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

EDIT1:大きな変更、私はなぜこれを初めて実現しなかったのか分かりません:P 40文字を保存しました。


使用法

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

テスト入力:(仕様による不要なオプション番号なし)

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

出力

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

未ゴルフコード

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

ユーザーからの提案を聞いていただければとても嬉しいです:)


1

Perl、70文字

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

または、境界チェックなしで56文字

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

このコードは仕様のように2行目を使用していないため、3文字短くすることができます。 <>;


1

バッシュ、 166156111 106

標準入力から読み取り、行数をとりません。入力の最初の行は、ASCIIアートに配置するコードです。後続のすべての行は、@文字で構成されるASCIIアートです。入力の最大長は999文字で、スラッシュを含めることはできません。(使用しない*#、Bashで特別な意味を持つために選択しました)。

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

警告:このプログラムはというファイルを使用しますp。プログラムを実行した後、削除p-2回目に実行するとプログラムが混乱します。

ここでのほとんどの作業は、

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

最初の行は最初の行を置き換えます @は、技術の最初をコードの最初の文字にます。2行目は、コードの最初の文字を削除します。

図形を埋めるのに十分なコードがない場合、メインのASCIIアート出力の後に改行が印刷されecho $iます。


1

C、98、91の文字

これは、100文字未満の非常に単純なCソリューションです。これは、行カウント入力を使用しません。(それ以外の場合は、2番目の不要なgets()が必要です)。

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

なし:

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

puts(s)代わりにprintf("%s",s)を使用して、7バイトを節約できます。
nyuszika7h

@ nyuszika7hありがとう!しかし、追加\nが問題かどうかはわかりません。
MarcDefiant

1

Python 2.7、 165 155 150 138 119文字

さて、かなりですが、私はそれがPythonでそれを行う最も小さな方法だと思います。

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

編集:使用バイト数がさらに少ない新しい機能1.0.1バージョン:

Edit2: 使用されていないインポートのmap(r,['']*input())代わりに[r()for _ in[1]*input()]削除

Edit3: 1文字'>'*input()['']*input()保存して、パターンにプロンプ​​ト文字を追加する代わりに:)

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)

(['.']+l).pop(0)代わりに(len(l)and l.pop(0)or'.')を使用して、9バイトを節約できます。そしてinput()int(r())1バイトを節約する代わりに。
nyuszika7h

ありがとうinput!残念ながら、最初のアドバイスは、文字列の長さが0を超える限りドットを出力するため、機能しません。
avall

私の提案が間違っている理由がわかります。(l+['.']).pop(0)代わりに試してください。ただし、それでもうまくいかない場合は、のl and代わりにを使用して4バイトを節約できますlen(l)and
nyuszika7h

(l+['.']).pop(0)は要素を削除しないlため、最初の文字のみが出力されますが、l条件は機能します:)
avall


0

05AB1E18 17 15 バイト

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

コードを最初の入力、パターンを2番目の(としての0代わりに#)として受け取ります。

オンラインそれを試してみたり、すべてのテストケースを確認してください

18入力を逆順にすることによる15バイトの代替:

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

オンラインでお試しください

説明:

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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.