ASCII 아키텍트


15

비싼 건축 프로그램에 돈을 지불하고 싶지 않으므로 자신의 롤을 결정합니다. 건물을 설계하기 위해 ASCII를 사용하기로 결정했습니다. 프로그램은 특정 방식으로 단일 문자열 형식을 취하며 프로그램은 건물을 출력합니다.

입력

입력은 한 줄의 문자로 구성됩니다. 문자 만 포함한다고 가정 할 수있다 a-j, 숫자 1-9및 기호 -등을 +.

출력 설명

각 문자 a-j에 대해 프로그램은 다음과 같이 세로선을 출력합니다. 이것을 열이라고 부릅니다.

         .
        ..
       ...
      ****
     *****
    ******
   -------
  --------
 +++++++++
++++++++++
abcdefghij

예를 들어, 입력 abcdefgfedefghgfedc은 다음과 같이 출력됩니다.

             .
      *     ***
     ***   *****
    ***** *******
   ---------------
  -----------------
 ++++++++++++++++++
+++++++++++++++++++

문자 앞에 양의 정수 nn붙으면 열 아래 에 공백 문자 가 추가 됩니다. 이것을 오프셋이라고합니다. 예를 들어 S공백을 표기하기 위해 입력 3b2b3b하면 다음과 같이 출력됩니다.

+ +
+++
S+S
SSS
SSS

문자 앞에 음의 정수 가 붙을 수도 있습니다. 이 경우 열의 맨 아래 비 공백 문자 -m제거 됩니다 (공백으로 바꾸지 말고 완전히 제거하십시오). 이것을 슬라이스라고합니다. 예를 들어, 입력 은 다음과 같이 출력됩니다.m -1j-2j-3j-4j-5j-6j-7j-8j

.
..
...
*...
**...
***...
-***...
--***...
+--***..

오프셋과 슬라이스를 같은 줄에 적용 할 수 있지만 오프셋이 먼저 가야합니다. 즉, 문자 앞에 접두사를 붙일 수 있습니다 n-m. 여기서 n오프셋 m의 크기는 슬라이스의 크기입니다. 예를 들어 S공백을 표기하기 위해 '2-4j'를 입력하면 다음과 같이 출력됩니다.

.
.
.
*
*
*
S
S

마지막으로 +두 열 사이에 사용 된 연산자는 별도의 열이 아니라 동일한 열에서 서로 위에 쌓여 야한다는 것을 나타냅니다. 예를 들어, 입력`2-4ja '는 다음을 출력합니다 :

.
.
.
*
*
*
S
S+

입력 2-4j+a출력은 다음과 같습니다.

+
.
.
.
*
*
*
S
S

다음은 샘플 입력입니다.

abiehef+ehfhabc

그리고 결과 출력 :

      *
      -
  .   -
  . . +. .
  * * +* *
  * * ****
  ********
  --------
  --------  -
 +++++++++ ++
+++++++++++++

일종의 오래된 파괴 된 성 탑처럼 보입니다.

다음은 또 다른 샘플 입력입니다.

6b5b+a6b1-2d+3-4f1-2d+-2c+2-4f+1-2d+-2c2-2d+1-4g+1-2c+b+-2c+-4e2-7j+-4g+d+-2c+-4f2-7j+-5h+b+-2c+a+-3f2-7j+-7i+-4e+b+b+a+-4f2-7i+a+-7h+-4f+b+b+a+-4f2-7j+-7h+-4f+a+-7h+a+-7i+-4f2-7j+-7i+-6h+a+-7i+b+-4e3-7i+a+-7h+-4e+a+-7h+b+1-7h3-7j+1-4f+-7h+b+-4f+a3-7j+2-4f+a+-4f+b3-2d+-2d+3-4g+b3-2d+-2d+-2c

그리고 결과 출력 :

      ****** +++
     ******+.*++
     ---++.+ ***
    -+-+++..++**
    -+--+++.+++*
    --++++.+..*
      +++++.+**
+++****.******  -
+++*****.**..  --
 +   ***....+..--
      ...+.....--
    --.........--
   ---......
   --

(그것은 마리오 였어야했지만 아주 좋지는 않았습니다 ...)

사양이 여전히 명확하지 않으면 Python 2.7로 작성된 골프 이외의 구현 이 있습니다. 사양을 작동시키는 방법에 대한 느낌을 얻기 위해이를 실행하고 실험 할 수 있습니다. 내 프로그래밍 기술을 비웃을 수도 있습니다.

이것은 코드 골프이므로 가장 짧은 엔트리가 승리합니다. 불분명 한 경우 의견에 질문하십시오.


두 개 이상의 타워를 쌓는 것이 유효합니까? 귀하의 예 중 하나에 "2c + b + -2c"가 표시되지만, 이것이 어떻게 쌓여 있는지 알아낼 수 없습니다.
AndoDaan

1
@AndoDaan Towers는 +를 사용하여 무한대로 쌓을 수 있습니다. 예를 들어 a+a+a+a+a5 개의 더하기 부호가 서로 위에 출력됩니다.
압생트


@Howard Huh, 당신은 맞습니다. 이것들은 놀랍게도 비슷합니다 (탑을 자르고 탑을 쌓을 수있는 유일한 추가 기능).
Martin Ender

@Howard Huh. 제목을 입력 할 때 나타나는 비슷한 질문에 표시되지 않았습니다. 공백의 구현은 조금 다릅니다. 내 게시물을 중복으로 표시하고 개조자가 어떻게 생각하는지 보겠습니다.
absinthe

답변:


10

루비, 223214 바이트

g=$*[0].split(/(?<=[a-j])(?!\+)/).map{|r|r.scan(/(\d*)(-\d+)?([a-j])/).map{|a,b,c|' '*a.to_i+'++--***...'[-b.to_i..c.ord-97]}*''}
puts g.map{|s|s.ljust(g.map(&:size).max).chars.reverse}.transpose.map(&:join).join$/

재미있었습니다. :)

분명히 분명해야하지만 문자열을 열로 구성 한 경우 이러한 행을 열로 수행하고 모든 것을 조인하기 전에 문자 배열을 바꾸는 새로운 방법을 발견했습니다.

g=$*[0].split(/(?<=[a-j])(?!\+)/)               # Split into columns.
       .map{|r|                                 # For each column
            r.scan(/(\d*)(-\d+)?([a-j])/)       # Split into components.
             .map{|a,b,c|                       # For each component
                ' '*a.to_i+                     # Prepend spaces if any.
                '++--***...'[-b.to_i..c.ord-97] # Select the appropriate slice of the tower.
            }*''                                # Join all components together.
        }
puts g.map{|s|                                  # For each column
            s.ljust(g.map(&:size).max)          # Pad with spaces on the right such that. 
                                                # all columns are the same height.
            .chars.reverse                      # Turn into character array and reverse.
      }
      .transpose                                # Mirror in the main diagonal.
      .map(&:join)                              # Join lines.
      .join$/                                   # Join columns.

최종 라인의 다른 스타일을 시도하고 다음과 같이 나왔습니다 puts (0..z=g.map(&:size).max-1).map{|i|g.map{|y|(v=y[z-i])?v:?\ }*''}. 그러나 조바꿈 없이는 재미가 없을 것입니다.
벡터화

@ bitpwner 감사합니다. 나중에 살펴보고 테스트하겠습니다.
Martin Ender

2

코브라-473

나는 코브라가이 중 하나를 이길 것이라고 생각하지 않습니다.

use System.Text.RegularExpressions
class P
    def main
        r=Regex.matches(Console.readLine,r'(?<=^|[a-j])(([^a-j]*[a-j])+?)(?=[^+]|$)')
        z,l=0String[](r.count)
        for m in r.count,for n in'[r[m]]'.split('+'),l[m]+=' '.repeat(int.parse('0[Regex.match(n,r'(?<!-)\d+')]'))+'++--***...'[int.parse('0[Regex.match(n,r'(?<=-)\d+')]'):' abcdefghij'.indexOf(n[-1:])]
        for y in l,if y.length>z,z=y.length
        for x in-z+1:1
            for y in l,Console.write(if(-x<y.length,y[-x],' '))
            print

모든 좋은 의견 :

편집 : 이것은 이것이 루비 솔루션과 비슷하게 보인다는 것을 깨달았습니다. 큰 마음은 다 비슷 하네?

use System.Text.RegularExpressions
class P
    def main
        r=Regex.matches(Console.readLine,r'(?<=^|[a-j])(([^a-j]*[a-j])+?)(?=[^+]|$)')
        # Split into columns
        z,l=0,String[](r.count)
        # Assign the column-array
        for m in r.count
        # Loop through columns
            for n in'[r[m]]'.split('+')
            # Loop through individual letter instructions
            # - within columns
                l[m]+=
                # Add characters to the last column
                    ' '.repeat(int.parse('0[Regex.match(n,r'(?<!-)\d+')]'))+
                    # Any spaces, plus
                    '++--***...'[:' abcdefghij'.indexOf(n[-1:])]
                    # The default column string
                        [int.parse('0[Regex.match(n,r'(?<=-)\d+')]'):]
                        # Sliced to the right length
        for y in l,if y.length>z,z=y.length
        # Determine the maximum length of any column
        for x in-z+1:1
            for y in l
            # Loop through columns so that they rotate to the left
                Console.write(if(-x<y.length,y[-x],' '))
                # Write the character in the current position
            print
            # Insert newlines

2

루아-451

a=arg[1]j='++--***...'I=io.write M=string.match U=string.sub T=table.insert n=''y=0 t={}m=0 for i in a:gmatch('[%-%d]*[a-j]%+?')do b=M(i,'-(%d)')b=b or 0 s=M(U(i,1,1),'%d')s=s or 0 n=n..(' '):rep(s)..U(U(j,1,M(U(i,-2),'[a-j]'):byte()-96),1+b,-1)if U(i,-1,-1)~="+"then T(t,n)m=m<#n and #n or m n=""y=y+1 end end T(t,n)n=''for k,v in pairs(t)do n=#v<m and n..v..(' '):rep(m-#v)or n..v end for i=m,1,-1 do for k=0,m*y-1,m do I(U(n,i+k,i+k))end I'\n'end

특별한 것은 없습니다. 그래도 한 번만 함수의 버트로드 이름을 바꾸는 것이 재미있었습니다. 나중에 ungolfed 코드를 편집하겠습니다.

여기서 사용해보십시오. 샘플 출력 :

샘플 출력


1

PowerShell을 , 214 212 209 206 200 바이트

-3 바이트 덕분에 @Veskah

switch -r($args-split'(-?.)'){\+{$c=1}\d{sv('ps'[0-gt$_])$_}[a-j]{if(!$c){$t+=,''}$t[-1]+=' '*$p+-join'++--***...'[-$s..($_[0]-97)];$c=$p=$s=0}}($t|% Le*|sort)[-1]..1|%{-join($t|% *ht $_|% ch*($_-1))}

온라인으로 사용해보십시오!

덜 골프 버전 :

# make table with lines instead columns
switch -r($args-split'(-?.)'){
    \+ {$c=1}
    \d {set-variable ('ps'[0-gt$_]) $_}
    [a-j] {
        if(!$c){$t+=,''}
        $t[-1]+=' '*$p+-join'++--***...'[-$s..($_[0]-97)]
        $c=$p=$s=0
    }
}
# transpose
($t|% Length|sort)[-1]..1|%{
    -join($t|% padRight $_|% chars($_-1))
}

1
정규식 (-?.)도 작동해야 함
Veskah

대박! 감사.
mazzy 2016 년

0

파이썬 3, 268 바이트

import re
q,t=[(p,' '*int(o or 0)+'++--***...'[-int(s or 0):ord(l)-96])for p,o,s,l in re.findall('(\+?)(\d?)(-\d)?(.)',input())],[]
while q:p,s=q.pop(0);t+=[t.pop()+s if p else s]
t=[*zip(*[[*c.ljust(max(map(len,t)))]for c in t])][::-1]
for l in t:print(*l,sep='')

대부분 골퍼되지 않은 :

# import the regex module
import re

# array to store initial input
q = []
# array to store translated output
t = []

# split string from stdin into column groups, like: ('plus or blank', 'offset or blank', 'slice or blank', 'letter')
# ex: 6b1-2d+a would become:
# [('','6','','b'), ('', '1', '-2', 'd'), ('+', '', '', 'a')]
i = re.findall('(\+?)(\d?)(-\d)?(.)',input())

# iterate through the groups returned by the regex
for p,o,s,l in i:
    # create offset string
    # int() cannot parse '', but empty strings are falsey,
    # so (o or 0) is equivalent to 'parse the string as an int, or return 0 if it is empty'
    offset = ' ' * int(o or 0)

    # get the starting point of the slice
    # since the regex returns the minus, it must be negated after converting the string to an int
    # as before, (s or 0) ensures that the slice is converted to an int properly
    start = -int(s or 0)
    # since 'a' is ordinal 97, this ensures that the end position will be 1-9
    end = ord(l) - 96
    # slice the largest possible column string with the calculated start and end positions
    a = '++--***...'[start:end]
    # add the space offset
    a = offset + a
    # add the plus sting and the column string to the array
    q.append( (p, a) )

# while q is not empty
while q:
    # remove the first item from the list and separate it into a plus variable and a column string
    p, s = q.pop(0)

    # if p is not blank, it is a '+'
    # if p is truthy, remove the last item added and add s to it
    # otherwise just return s
    # append the resulting item to the ongoing list
    t += [t.pop()+s if p else s]

temp = []
for c in t:
    # call len() on all items in t, then return the maximum length
    m = max(map(len, t))
    # left justify c by adding spaces to the right, up to m total characters
    c = c.ljust(m)
    # unpack c into a list
    # this is equivalent to list(c), but shorter
    c = [*c]
    # add the list of characters to the array
    temp.append(c)

t = temp

# t is currently a list of rows, and needs to be rotated so that it displays correctly
# input: 'abcdefghij'
# before:
#
# +
# ++
# ++-
# ++--
# ++--*
# ++--**
# ++--***
# ++--***.
# ++--***..
# ++--***...
#
# after:
#
#  ++++++++++
#   +++++++++
#    --------
#     -------
#      ******
#       *****
#        ****
#         ...
#          ..
#           .
# 
t = [*zip(*t)]
# t is currently upside down, reverse the list
t = t[::-1]

# for each line (currently a list of characters)
for l in t:
    # unpack the list into print as arguments, do not add a space between arguments
    print(*l,sep='')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.