아스키 아트를 코딩하는 쉬운 방법!


18

직무:

같은 아스키 아트에 배치 된이 사이트에 대한 답변을 많이가 있습니다 이 하나 . 일반적으로 배열은 수동으로 수행되지만 프로그램이 도움이되지 않습니까? :)

프로그램은 3 개의 입력을받습니다 :

  • 한 줄로 된 코드
  • 패턴의 라인 수 (필요하지 않은 경우 생략 가능)
  • *s 또는 다른 문자 로 패턴 자체

규칙 :

  • 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
사양의 "생략 가능"및 "또는 다른 문자"부분은 행의 수를 생략 해야 하며 별표를 Xes 로 대체해야한다는 것을 의미합니다. 작동하는 프로그램?
Ilmari Karonen

1
@Bakuriu 나는 당신의 의견을 이해하지 못합니다. ASCII로 프로그램을 작성하면 각 문자는 바이트입니다. UTF-32로 쓰면 각 문자는 4 바이트입니다. 문자가 아닌 바이트 단위 의 가장 짧은 코드가 현재 사양에 따라 이깁니다. 인코딩이 요구 사항이되기를 원하는 것처럼 들리지만 왜 필요한지 모르겠습니다. 내가 당신의 의견을 오해 했습니까?
Rainbolt

1
일부 규칙이 누락 된 일부 답변을 기반으로 두 가지 예를 추가하고 명확성을 기하기 위해 전체 예제 블록을 규칙 블록 아래로 옮겼습니다.
Veskah

답변:


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 자 편집 : 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를 붙입니다.

다음으로 getASCII 아트 템플릿의 줄 수를 가져 와서 끝 부분을 평가합니다. xx오퍼레이터는 프로그램의 첫 번째 부분이 여러 번 반복한다. 당신이이 생각하는 경우에 더 의미 code() xx count()설탕 기본적으로 code() for 1..count(): count()먼저 평가해야한다.

마지막으로, get프로그램의 시작 부분에서 ASCII 아트 템플릿의 줄을 가져 와서 "*"모든 것보다 먼저 배열의 시작 부분에서 벗어난 값으로 모든 값을 대체 합니다 ( {shift BEGIN …}).

편집하다:

37 자까지 줄이자 명령 행 스위치를위한 문자 하나를 추가했습니다.

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

이것은 원본과 같은 개념이며, -p스위치는 각 줄을 반복하며 ( BEGIN"코드"로 읽은 후 ) 모든 *코드를 "코드"에서 다음 문자로 대체 하여 인쇄합니다. 이에 대한 입력 형식에는 형식의 행 수가 포함되어서는 안됩니다.


6

루비 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에서 실행되는 코드는 다음과 같습니다. ideone.com/3HG3Fb
Paul Prestidge

기묘한. IDEONE은 잘 작동했습니다. 어쨌든, 당신은 대체하여 문자 (공간)을 절약 할 수 있습니다 puts $><<하고 변경 ,A와 끝에서+
아니 그 찰스

@Charles 좋은 전화. 감사!
Paul Prestidge

2

PowerShell , 63 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

자바 스크립트-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에서 stdin을 처리하는 방법, 특히 줄 바꿈을 사용하는 방법을 잘 모르겠습니다. 제안?
Matt

@ 매트 노드? 거미 원숭이?
찰스

아마도 그것을 기능으로 만드는 것입니다.
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

자바 스크립트 (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

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

사용자의 제안을 듣는 것이 좋습니다. :)


1

펄, 70 자

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

또는 경계 검사없이 56 자

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

이 코드는 스펙에서와 같이 두 번째 줄을 사용하지 않으며 3 자로 단축 될 수 있습니다. <>;


1

세게 때리다, 166156111 106

표준 입력에서 읽고 라인 수를 계산하지 않습니다. 입력의 첫 줄은 아스키 아트에 넣고 자하는 코드이며, 이후의 모든 줄은 @캐릭터 로 구성된 아스키 아트 입니다. 입력의 최대 길이는 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-두 번째로 실행할 때 프로그램을 혼동합니다.

여기에서 대부분의 작업은

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

첫 번째 줄 @은 해당 기술 의 첫 번째 줄을 첫 번째 코드 문자로 대체합니다 . 두 번째 줄은 코드의 첫 문자를 제거합니다.

도형을 채우기에 충분한 코드가없는 경우으로 주요 아스키 아트 출력 후 줄 바꿈이 인쇄됩니다 echo $i.


1

C, 98 , 91 자

100 자 미만의 매우 간단한 C 솔루션입니다. 이것은 라인 카운트 입력을 사용하지 않습니다. (그렇지 않으면 두 번째 불필요한 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

감사합니다! 하지만 나는 추가 여부를 모른다\n 가 문제 .
MarcDefiant

1

파이썬 2.7, 165 155 150 138 119 자

좋아,하지만 파이썬으로 그것을하는 가장 작은 방법이라고 생각합니다.

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 버전 :

편집 2 : map(r,['']*input())[r()for _ in[1]*input()] 사용하지 않는 가져 오기 대신 제거

Edit3 : 하나의 문자 '>'*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 바이트를 절약 할 수 있습니다 . 그리고 1 바이트를 절약하는 input()대신 int(r()).
nyuszika7h

감사합니다 input! 불행히도 첫 번째 조언은 문자열 길이> 0만큼 긴 점을 출력하기 때문에 작동하지 않습니다.
avall

내 제안이 틀린 이유를 알 수 있습니다. (l+['.']).pop(0)대신 사용해보십시오 . 그래도 작동하지 않으면 l and대신을 사용하여 4 바이트를 절약 할 수 있습니다 len(l)and.
nyuszika7h 12

(l+['.']).pop(0)요소를 제거하지 않으므로 l첫 문자 만 인쇄되지만 l조건이 작동합니다. :)
avall


0

05AB1E , 18 17 15 바이트

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

코드를 첫 번째 입력으로 사용하고 패턴을 두 번째로 사용합니다 ( 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.