미국 에서는 통행이 허용되는 경우 도로에서 교통의 두 반대 방향이 파선으로 노란 선으로 구분되고 통행이 허용되지 않으면 두 개의 실선으로 노란 선으로 구분됩니다.
(그쪽을 지나갈 수 있도록 한쪽 만 파선 할 수 있으며 노란색 선은 중앙 또는 가역 차선과 같은 다른 것을 의미 할 수 있지만 그러한 경우에는 관심이 없습니다.)
A의 소요 프로그램 쓰기 런 길이하여 인코딩 된 문자열을 P
위한 통과 하고N
위해 아무 전달 하고, 해당 도로의 ASCII 버전을 인쇄합니다. 중심선을 제외하고 도로의 패턴은 항상 동일하며 아래 예에서 쉽게 추론 할 수 있습니다.
각 전에 긍정적 인 진수가있을 것입니다 P
및 N
입력 문자열입니다. 이 숫자는 통과 길이를 정의합니다 또는 통과하지 않음을 현재 도로 부분의 영역의 .
예
를 입력하면 통과하지 않는12N
12 개의 열이 생성됩니다 (중심선 모두 ).=
____________
============
____________
입력은 12P
12 열의 통과 도로를 생성합니다 (중심선 -
반복) :
____________
- - - - - -
____________
통과 와 통과 를 결합 할 수 없습니다 . 예 4N4P9N7P1N1P2N2P
:
______________________________
====- - =========- - - -=-==-
______________________________
이들은 4 개의 통과하지 않는 열, 4 개의 통과 , 9 안함 등입니다.
참고 • 그래도 통과 영역은 항상 (대시로 시작-
맨 왼쪽 측면에서)이 아닌 공백 ( ). 필수입니다.
세부
- 입력에는 두 개의
N
구역 또는 두 개의 구역 이 없습니다P
구역이 연속으로 포함 . 예를 들어4P5P
발생하지 않습니다. - 선행 양수가 없으면 문자를 지원할 필요가 없습니다. 일반은
P
항상있을 것입니다1P
, 일반N
은 항상있을 것1N
입니다. - 도로의 마지막 열을 넘어 확장되지 않는 한 후행 공백이있을 수 있습니다. 선택적인 후행 줄 바꿈이 하나있을 수 있습니다.
- 프로그램 대신 실행 길이 인코딩 된 문자열을 가져와 ASCII 도로를 인쇄하거나 반환하는 함수를 작성할 수 있습니다.
- 표준 방식 (stdin, command line, function arg)으로 입력을받습니다.
바이트 단위의 가장 짧은 코드가 이깁니다. Tiebreaker는 이전 게시물입니다.
답변
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 "- "
답변
자바 스크립트 (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
답변
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/
#N
and를 제거합니다 #P
.
((?:(=|-| ))+)/A\1\n\n\n\1\n\nA\1\n
+(A_*)(.)/\1_
위와 아래에 밑줄을 설정하여 다음을 제공하십시오.
A______________________________
====- - =========- - - -=-==-
A______________________________
마지막으로 다음을 제거합니다 A
.
A/
답변
하스켈, 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
는 맨 위 줄 (중간 줄의 모든 문자가로 대체 됨 _
), 줄 바꿈, 가운데 줄, 빈 줄 및 맨 아래 줄 (위와 동일)로 구성된 개행과 함께 다섯 개의 요소 목록을 결합합니다 .
답변
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
여기에서 온라인으로 사용해보십시오 .
답변
파이썬 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
답변
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 바이트가됩니다.