길이 길이 인코딩


21

미국 에서는 통행이 허용되는 경우 도로에서 교통의 두 반대 방향이 파선으로 노란 선으로 구분되고 통행이 허용되지 않으면 두 개의 실선으로 노란 선으로 구분됩니다.

도로 라인 규칙 그래픽

(그쪽을 지나갈 수 있도록 한쪽 만 파선 할 수 있으며 노란색 선은 중앙 또는 가역 차선과 같은 다른 것을 의미 할 수 있지만 그러한 경우에는 관심이 없습니다.)

A의 소요 프로그램 쓰기 런 길이하여 인코딩 된 문자열을 P위한 통과 하고N 위해 아무 전달 하고, 해당 도로의 ASCII 버전을 인쇄합니다. 중심선을 제외하고 도로의 패턴은 항상 동일하며 아래 예에서 쉽게 추론 할 수 있습니다.

각 전에 긍정적 인 진수가있을 것입니다 PN입력 문자열입니다. 이 숫자는 통과 길이를 정의합니다 또는 통과하지 않음을 현재 도로 부분의 영역의 .

를 입력하면 통과하지 않는12N 12 개의 열이 생성됩니다 (중심선 모두 ).=

____________


============

____________

입력은 12P12 열의 통과 도로를 생성합니다 (중심선 - 반복) :

____________


- - - - - - 

____________

통과통과 를 결합 할 수 없습니다 . 예 4N4P9N7P1N1P2N2P:

______________________________


====- - =========- - - -=-==- 

______________________________

이들은 4 개의 통과하지 않는 열, 4 개의 통과 , 9 안함 등입니다.

참고 • 그래도 통과 영역은 항상 (대시로 시작- 맨 왼쪽 측면에서)이 아닌 공백 ( ). 필수입니다.

세부

  • 입력에는 두 개의 N구역 또는 두 개의 구역 이 없습니다P 구역이 연속으로 포함 . 예를 들어 4P5P발생하지 않습니다.
  • 선행 양수가 없으면 문자를 지원할 필요가 없습니다. 일반은 P항상있을 것입니다 1P, 일반N 은 항상있을 것 1N입니다.
  • 도로의 마지막 열을 넘어 확장되지 않는 한 후행 공백이있을 수 있습니다. 선택적인 후행 줄 바꿈이 하나있을 수 있습니다.
  • 프로그램 대신 실행 길이 인코딩 된 문자열을 가져와 ASCII 도로를 인쇄하거나 반환하는 함수를 작성할 수 있습니다.
  • 표준 방식 (stdin, command line, function arg)으로 입력을받습니다.

바이트 단위의 가장 짧은 코드가 이깁니다. Tiebreaker는 이전 게시물입니다.


도로가 비대칭이어야합니까, 아니면 라인의 양쪽에 4 개의 도로 공간을 인쇄 할 수 있습니까?
orlp

@orlp 도로가 5 행보다 넓을 수 있는지 묻는다면 아니오. 공백 문자를 중심선 위 또는 아래의 빈 줄에 넣을 수 있는지 묻는 경우, 세부 사항 글 머리 기호 3을 가지고있는 한 예입니다.
Calvin 's Hobbies

예를 들어서, 이것들 중 하나가 유효한 출력입니까? gist.github.com/orlp/0e0eae16d6e1fcda5e9b
orlp

@orlp도 마찬가지입니다.
Calvin 's Hobbies

답변:


5

CJam, 38 바이트

"_  - _":N3'=t:P;q~]2/e~z'
*"--"/"- "*

작동 원리

우리는 첫번째 변수에 올바른 길 열을 지정 N하고 P다음 단순히 입력 문자열을 평가합니다. 이렇게하면 길이와 열 쌍이 스택에 남습니다. 우리는 그것들을 그룹화하고 그 위에 RLD를 실행하여 전체 열을 가져오고 조인을 바꾼 다음 마지막으로 연속 --을 로 변환합니다 -.

:_  - _":N                    e# This is the no passing column. We assign it to N
          3'=t:P              e# Replace the '-' in N with '=" and assign it to P
                q~]2/         e# Read the input, evaluate it and then group it in pairs
                     e~       e# Run a run-length-decoder on the pairs
                       z'
*                             e# Transpose and join with new lines.
 "--"/                        e# Split on two continuous occurrence of -
      "- "*                   e# Join by an alternate "- "

여기에서 온라인으로 사용해보십시오


6

자바 스크립트 (ES6), 114

템플릿 문자열을 사용 하면 5 개의 줄 바꿈이 중요합니다.

f=s=>(b=(s=s.replace(/(\d+)(.)/g,(x,n,b)=>(b<'P'?'=':'- ').repeat(n).slice(0,n))).replace(/./g,'_'))+`


${s}

`+b

5

rs , 252 자

한 시간 전에 수렴 연산자를 Martin Büttner 's Retina의 ripoff로 추가 했기 때문에 이것은 중요하지 않습니다 ... 어쨌든 경쟁하기 위해 여기에 있지는 않습니다. 이를 위해 정규식 기반 솔루션을 만드는 것이 재미 있습니다.

(\d+\D)/#\1
+(\d*)#(?:(((((((((9)|8)|7)|6)|5)|4)|3)|2)|1)|0)(?=\d*\D)/\1\1\1\1\1\1\1\1\1\1\2\3\4\5\6\7\8\9\10#
\d(?=\d*#N)/=
(^|(?<=\D))\d(?=\d*#P)/-
+(?<=-)\d\d(?=\d*#P)/ -
(?<=-)\d(?=\d*#P)/ 
#\D/
((?:(=|-| ))+)/A\1\n\n\n\1\n\nA\1\n
+(A_*)(.)/\1_
A/

수년간 프로그래밍 언어에 대한 Martin의 Retina 답변 에서 2 행을 받았습니다. .

설명

(\d+\D)/#\1
+(\d*)#(?:(((((((((9)|8)|7)|6)|5)|4)|3)|2)|1)|0)(?=\d*\D)/\1\1\1\1\1\1\1\1\1\1\2\3\4\5\6\7\8\9\10#

이것은 많은 마법을 수행합니다. 자세한 내용은 위의 링크를 참조하십시오.

기본적으로 input을 사용 4N4P9N7P1N1P2N2P하면 다음 과 같은 결과가 발생합니다.

4444#N4444#P999999999#N7777777#P1#N1#P22#N22#P

다음 것:

\d(?=\d*#N)/=

이는 통과하지 않는 기호 (N) 앞에있는 숫자를 등호로 바꿉니다. 이전 입력의 결과 :

====#N4444#P=========#N7777777#P=#N1#P==#N22#P

이:

(^|(?<=\D))\d(?=\d*#P)/-

통과 기호 (P) 앞에 오는 첫 번째 숫자를 첫 번째 대시로 바꿉니다. 결과:

====#N-444#P=========#N-777777#P=#N-#P==#N-2#P

다음 두 줄은 같은 패턴을 계속합니다.

+(?<=-)\d\d(?=\d*#P)/ -
(?<=-)\d(?=\d*#P)/ 

첫 번째 줄은 나머지 줄을 대시 공간 패턴으로 바꿉니다. 두 번째는 홀수를 처리합니다. 마지막 대시 뒤에 단일 정수 (예 -5:)를 대시 공백 ( -)으로 바꿉니다 . 이제 출력은 다음과 같습니다.

====#N- - #P=========#N- - - -#P=#N-#P==#N- #P

이제 상황이 시작되었습니다. 다음 줄 :

#\D/

#Nand를 제거합니다 #P.

((?:(=|-| ))+)/A\1\n\n\n\1\n\nA\1\n
+(A_*)(.)/\1_

위와 아래에 밑줄을 설정하여 다음을 제공하십시오.

A______________________________


====- - =========- - - -=-==- 

A______________________________

마지막으로 다음을 제거합니다 A.

A/

2

하스켈, 165 바이트

k 'N'="="
k _="- "
d c=c>'/'&&c<':'
p[]=[]
p s=take(read$takeWhile d s)(cycle$k a)++p r where(a:r)=dropWhile d s
f s=unlines[q,"\n",p s,"",q]where q=map(\x->'_')$p s

예제 실행 ( f문자열을 반환하므로 더 나은 표시 인쇄를 위해) :

*Main> putStr $ f "4N4P9N7P1N1P2N2P"
______________________________


====- - =========- - - -=-==- 

______________________________

작동 방식 : p입력 문자열을 재귀 적으로 구문 분석하고 검색 함수에서 찾은 주어진 수의 심볼을 연결하여 중간 줄을 반환합니다 k. main 함수 f는 맨 위 줄 (중간 줄의 모든 문자가로 대체 됨 _), 줄 바꿈, 가운데 줄, 빈 줄 및 맨 아래 줄 (위와 동일)로 구성된 개행과 함께 다섯 개의 요소 목록을 결합합니다 .


2

Python 3, 169 168 바이트 (파이썬 2에서 167)

p,s='',str.split
for _ in s('N '.join(s('P '.join(s(input(),'P')),'N'))):
 v=int(_[:-1]);p+=['='*v,('- '*v)[:v]][_[-1]=='P']
l=len(p)
u='_'*l
print(u+'\n'*3+p+'\n\n'+u)

상당히 골프하지 않은 :

p=''
for i in'N '.join('P '.join(input().split('P')).split('N')).split():

  v=int(i[:-1])         # Get the number from the input section

  if i[-1]=='N':        # Check the letter (last char) from the input section
      p+=('='*v)        # Repeat `=` the number from input (v)
  else:
      p+=('- '*v)[:v]   #Repeat `- ` v times, then take first v chars (half)
l=len(p)                #Get the length of the final line markings
print('_'*l+'\n\n\n'+p+'\n\n'+'_'*l)

print('_'*l                          # Print _ repeated the length of p
           +'\n\n\n'                 # 3 new lines
                    +p+              # print out p (the markings)
                       '\n\n'        # 2 new lines
                             +'_'*l) # Print _ repeated the length of p

for i in
        'N '.join(
                  'P '.join(
                            input().split('P'))
                                               .split('N'))
                                                           .split():
                            # Split the input into items of list at P
                  # Join together with P and ' '
                                                # Split at N...
         # Join with N and ' '
                                                           # Split at space
# Loop through produced list

여기에서 온라인으로 사용해보십시오 .


바이트 수를 업데이트하는 것을 잊었습니다.
mbomb007

@ mbomb007 그것은 카운트를 변경하지 않았다 : / 나는 169 atm 이하로 그것을 얻을 수 없다
Tim

p+=['='*v,('- '*v)[:v]][_[-1]=='P']선행 세미콜론을 사용하여 이전 줄의 끝에 넣으면 1 바이트가 절약됩니다.
mbomb007

또한 Python 2를 사용하면에 1 바이트가 절약 print됩니다.
mbomb007

@ mbomb007 추가했습니다 :) 나는 파이썬 2 느낌이 더 짧을 수도 있습니다 ...하지만 확실하지 않습니다.
Tim

2

파이썬 2, 136 바이트

놀랍게도 수입 re은 실제로 가치가있는 것 같습니다.

import re
s=""
for x,y in re.findall("(\d+)(.)",input()):s+=(("- ","==")[y=="N"]*int(x))[:int(x)]
t="_"*len(s);print t+"\n"*3+s+"\n"*2+t

2

PHP, 187 바이트

preg_match_all('/(\d+)(\w)/',$argv[1],$m,2);
$o='';
foreach($m as $p)
    $o.=str_replace('--','- ',str_repeat($p[2]<'P'?'=':'-',$p[1]));
$a=preg_replace('/./','_',$o);
echo("$a\n\n\n$o\n\n$a\n");

코드는 한 줄로 유지 될 수 있습니다. 여기에 여러 줄로 표시되어보다 읽기 쉽게 표시됩니다 (서식에 사용 된 공백 및 줄 바꿈은 계산되지 않음).

후행 줄 바꾸기를 인쇄하지 않으면 2 바이트를 절약 할 수 있습니다. 다음에 실제 줄 바꿈 문자를 사용하면 5 바이트를 더 절약 할 수 있습니다 echo().

echo("$a


$o

$a");

$o( $o='';) 의 초기화를 생략하여 6 바이트를 더 절약 할 수 있지만 알림이 트리거됩니다. 명령 행을 사용하여 스크립트를 실행하면 통지를 억제 할 수 있습니다.

$ php -d error_reporting=0 <script_name> 4N4P9N7P1N1P2N2P

이것으로 174 바이트가됩니다.


2

루비, 137 바이트

내가 얻을 수있는 가장 짧은 것은 아니지만 가장 좋은 것에 가깝습니다. 옵티마이 저의 답변에서 일부 빌 렸습니다.

require'scanf'
N='_  = _'
P='_  - _'
a=[]
scanf('%d%c'){|l,t|a+=[eval(t).chars]*l}
puts (a.shift.zip(*a).map(&:join)*?\n).gsub'--','- '

언 골프 드 :

require 'scanf'

N = '_  = _'
P = '_  - _'
columns = [] # array of columns
# scan stdin for a number followed by a single char
scanf('%d%c') do |length, type|
  columns += [eval(type).chars] * length
done

# Convert to an array of rows, and join into a string
rows = columns.shift.zip(*columns).map(&:join)
str = rows * "\n" # join lines

# Replace '--' by '- ' and print
puts str.gsub(/--/, '- ')

마지막 줄을로 변경하여 이것을 2 바이트 개선하고 파이썬 2 답변을 이길 수 있어야합니다 (a.shift.zip(*a).map(&:join)*?\n).gsub'--','- '.
blutorange

1

C, 155 바이트

main(l,v,k,n,x,s,c)char*s,**v,c;{for(l=6;l--;puts(s))for(s=v[1];*s;s+=k)for(x=sscanf(s,"%d%c%n",&n,&c,&k);n--;)putchar(l%5?l^2?32:c^78?++x&1?45:32:61:95);}

더 읽기 쉬운 :

main(l,v,k,n,x,s,c)
    char*s,**v,c;
{
    for(l=6;l--;puts(s))
        for(s=v[1];*s;s+=k)
            for(x=sscanf(s,"%d%c%n",&n,&c,&k);n--;)
                putchar(l%5?l^2?32:c^78?++x&1?45:32:61:95);
}

외부 루프는 5에서 0까지의 행을 계산합니다.

가운데 루프는 인코딩 된 문자열의 일부를 반복합니다.

4N4P9N7P1N1P2N2P
4P9N7P1N1P2N2P
9N7P1N1P2N2P
7P1N1P2N2P
1N1P2N2P
1P2N2P
2N2P
2P
string is empty - exit

내부 루프는 같은 부분을 디코딩 7P하고 필요한 횟수 (예 : 7)를 반복합니다.

각 반복은 하나를 인쇄합니다 char. 의 값은 char코드로 설명됩니다l%5?l^2?32:c^78?++x&1?45:32:61:95 .

  • 줄 번호가 5 또는 0이면 95 (_ )를
  • 그렇지 않으면 행 번호가 2가 아닌 경우 공백을 인쇄하십시오.
  • 그렇지 않으면 기호가 'N'이면 61을 인쇄하십시오 (= )을
  • 그렇지 않으면 x1 씩 증가시킵니다.sscanf )
  • 홀수 인 경우 45 ( -)를 인쇄하고 그렇지 않으면 32 (공백)를 인쇄하십시오.

0

스칼라, 163 바이트

(s:String)=>{val r=(("\\d+(P|N)"r) findAllIn(s) map(r=>{val l=r.init.toInt;if(r.last=='N')"="*l else ("- "*l).take(l)})).mkString;val k="_"*r.length;s"$k\n\n\n$r\n\n$k"}

먼저 시도해보십시오. 더 골프를 칠 수도 있습니다.


0

루비, 94 바이트

14mRh4X0r의 답변gsub'--','- ' 에서 아이디어를 차용합니다 . 그래도 답은 더 흥미 롭다고 생각하지만 더 짧습니다.

f=->x{n=?_*x.gsub!(/(\d+)(.)/){($2==?P??-:?=)*$1.to_i}.size
"#{n}


#{x.gsub'--','- '}

#{n}"}

테스트 :

f=->x{n=?_*x.gsub!(/(\d+)(.)/){($2==?P??-:?=)*$1.to_i}.size
"#{n}


#{x.gsub'--','- '}

#{n}"}

puts f['4N4P9N7P1N1P2N2P']

생산 :

______________________________


====- - =========- - - -=-==- 

______________________________

0

matlab 버전을 포함 시키겠습니다

MATLAB (267b)

function d=p(V,a),j=numel(V)-1;if (a==0),d=0;return; end,d=(V(a)-48+10*p(V,a-1))*(V(a)<64);fprintf('%c%.*s%c%.*s',(a>=j)*10,(a==j|a==1)*eval(strcat(regexprep(V,'[NP]','+'),48)),ones(99)*'_',(a<3)*10,(V(a+1)>64)*d,repmat((V(a+1)==78)*'=='+(V(a+1)==80)*'- ',[1 99]));end

입력

공백으로 꼬리가 붙은 ASCII 형식의 문자열 (matlab에 체인 '\ 0'이 없기 때문에

V = '12N13P'


산출

도로의 패턴 표현

_________________________


============- - - - - - -

_________________________

기능

함수는 tail-1에서 호출해야합니다 (빈 문자는 제거됨)

: p (V, numel (V) -1)

시뮬레이션

온라인으로 해보 십시오


0

R, 132 바이트

이것에 크게 만족하지는 않았지만, 약간의 재미가 gsub있었습니다. 더 좋은 방법이 있다고 생각합니다.

cat(rbind(nchar(a<-scan(,'',t=gsub('PN','P N',gsub('NP','N P',chartr('- =','PPN',scan(,'',sep='|')[4]))))),substring(a,1,1)),sep='')
  • scanSTDIN에서 문자열을 가져 와서 네 번째 문자열을 가져옵니다. 참고 빈 라인 입력을 받고 계속하기 위하여 스캔 그들에 공백 (또는 무언가)를 필요로하는.

    "====--=========----=-==-"

  • =s를 Ns, -및 and 로 바꿉니다 P.

    "NNNNPPPPNNNNNNNNNPPPPPPPNPNNPP"

  • 그런 다음 각각 NP과 사이에 공백을 삽입합니다PN

    "NNNN PPPP NNNNNNNNN PPPPPPP NP NN PP"

  • 스캔은 문자열을 공백으로 분할합니다

    "NNNN" "PPPP" "NNNNNNNNN" "PPPPPPP" "N" "P" "NN" "PP"

  • 문자열 길이는 rbind각 문자열의 첫 문자와 함께 bound ( )입니다.

    4 4 9 7 1 1 2 2
    "N" "P" "N" "P" "N" "P" "N" "P"

  • 그런 다음을 사용하여 배열을 출력 cat합니다.

시운전

cat(rbind(nchar(a<-scan(,'',t=gsub('PN','P N',gsub('NP','N P',chartr('- =','PPN',scan(,'',sep='|')[4]))))),substring(a,1,1)),sep='')
1: ____________
2:  
3:  
4: ============
5:  
6: ____________
7: 
Read 6 items
Read 1 item
12N
> 
> cat(rbind(nchar(a<-scan(,'',t=gsub('PN','P N',gsub('NP','N P',chartr('- =','PPN',scan(,'',sep='|')[4]))))),substring(a,1,1)),sep='')
1: ____________
2:  
3:  
4: - - - - - - 
5:  
6: ____________
7: 
Read 6 items
Read 1 item
12P
> cat(rbind(nchar(a<-scan(,'',t=gsub('PN','P N',gsub('NP','N P',chartr('- =','PPN',scan(,'',sep='|')[4]))))),substring(a,1,1)),sep='')
1: ______________________________
2:  
3:  
4: ====- - =========- - - -=-==- 
5:  
6: ______________________________
7: 
Read 6 items
Read 8 items
4N4P9N7P1N1P2N2P
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.