전방 도로 도장


12

차선 패턴도로 길이 라는 두 가지 매개 변수가 주어지면 도로와 교통 서비스에 도로 표시를위한 차선 표시의 ASCII 표현을 인쇄하십시오.

입 / 출력 예

입력 : BTHMLRPHU , 21

두 개의 매개 변수를 사용하거나 문자열 끝에 숫자를 연결해도 상관 없습니다. 모호하지 않습니다.

STDIN에서 함수 인수, 환경 변수 등의 언어로 입력 할 수 있습니다.

산출:

!   |      x      ##      |      |      x      x      !
! B |  /\  x HOV3 ##  <-  |  ->  |  ^^  x HOV3 x      !
! B |  \/  x HOV3 ##   |  |  |   |  ^^  x HOV3 x      !
!   |      x      ##      |      |      x      x      !
!   |      x      ##      |      |      x      x      !
!   |      |      ##      |      |      |      |      !
!   |      |      ##      |      |      |      |      !
!   |      |      ##      |      |      |      |      !
! B |  /\  | HOV3 ##  <-  |  ->  |  ^^  | HOV3 |      !
! B |  \/  | HOV3 ##   |  |  |   |  ^^  | HOV3 |      !
!   |      x      ##      |      |      x      x      !
! B |  /\  x HOV3 ##  <-  |  ->  |  ^^  x HOV3 x      !
! B |  \/  x HOV3 ##   |  |  |   |  ^^  x HOV3 x      !
!   |      x      ##      |      |      x      x      !
!   |      x      ##      |      |      x      x      !
!   |      |      ##      |      |      |      |      !
!   |      |      ##      |      |      |      |      !
!   |      |      ##      |      |      |      |      !
! B |  /\  | HOV3 ##  <-  |  ->  |  ^^  | HOV3 |      !
! B |  \/  | HOV3 ##   |  |  |   |  ^^  | HOV3 |      !
!   |      x      ##      |      |      x      x      !

각 문자는 너비 0.5 미터, 길이 1 킬로미터를 나타냅니다.

사양

차선 표시

10km 길이의 도로마다 마킹은 2, 3, 9 및 10 킬로미터 (출력의 "상단"에서)에 페인트됩니다. 표시는 차선 중앙에 있습니다. 자전거 차선 및 중앙값을 제외하고 모든 차선의 폭은 3 미터 (6 자)입니다.

예제 출력에 표시된대로 표시 대신 ASCII 다이아몬드 및 화살표 문자를 사용할 수 없습니다 .

  • B: 자전거 도로. B마킹. 폭 1.5 미터 (3 자)
  • T: 대중 교통. 다이아몬드 마킹
  • H: 높은 차량 차선. HOV3마킹
  • LR: 터닝 레인. 화살표 마킹
  • P: 추월 차선. 캐럿 표시
  • U: 무제한 차선. 표시 없음

구분 기호 (우선 순위)

  • 중앙값 : ##( M입력 문자열 로 표시되고 도랑을 포함한 다른 구분 기호를 대체 함)
  • 배수로 (왼쪽 및 오른쪽 극단) : !느낌표
  • HOV 차선 대체 사이 x|모든 5km
  • 표준: |

제약

귀하의 기능 또는 프로그램은 다음을 충족해야합니다.

  • STDOUT으로 인쇄 ( System.out.printJava, console.logJavaScript 등의 항목과 동일 함)
  • 0-10 개의 중앙값으로 1-9 개의 레인을 인쇄 할 수 있습니다.
  • 최대 50km의 도로 (50 줄 출력)를 인쇄 할 수 있습니다.
  • 표준 허점을 사용하지 마십시오
  • \n출력 끝의 옵션 을 제외하고 후행 공백은 허용되지 않습니다.

가장 큰 출력 : 3700 바이트 (74 자 * 50 줄).

가능한 최소 출력 : 5 바이트 (입력 B, 1)

가정

  • 인접한 중앙값 없음 (하위 문자열 MM이 발생하지 않음)
  • 두 번째 표시선이 잘릴 수 있습니다 (예 : 길이가 9km 또는 12km 인 경우)
  • 차선은 논리적으로 의미가 없을 수 있습니다 (예 : 도로 왼쪽의 우회전 차선과 같은 모든 순서 가능)

이것은 이므로 가장 짧은 코드 (바이트)가 이깁니다!


1
그리고 당신은 모노 스페이스 폰트를 좋아합니다
WayToDoor

답변:


4

루비, 245

해당되는 경우 레인 분할을 인쇄 한 다음 레인을 인쇄하십시오.

나는 이길 것으로 기대하지 않는다.

->(n,i){i.times{|d,t|*e=''
g=e+%w{HOV3 ^^ B}
n.chars{|c|$><<(c==?M?'##':!t ??!:(t+c)[?H]&&d%10<5??x:?|)if(M=t!=?M)
$><<((e+[(%w{/\\ <- ->}+g)[v='TLRUHPB'.index(c)],(%w{\\/ \ | |\ }+g)[v]]+e*4)*2)[d%10].center(v>5?3:6)if(t=c)!=?M}
puts M ? e:?!}}

변경 로그

245 초크 stderr 및 효과적으로 배열을 분할합니다.

263 배열을 색인하는 더 좋은 방법

268 은 각 줄을 인쇄하고 표준 버전을 계산하지 마십시오.

330 초기 커밋


루비가 이길 것으로 기대하지는 않지만 다음 주 안에 다른 답변이 없다면 다음과 같이 이길 것입니다.
rink.attendant.6

@ rink.attendant.6 ideone.com
찰스가 아닌

2

자바 스크립트 (ES6), 316 바이트

f=(x,n)=>{for(i=0;n>i++;){b=!(r=i%10)|r==3;y=[...`! ${[...x].join` | `} !`[o='replace'](/[\W] ?M [\W]?/g,'##')].map(c=>~(q='LPRTU'.indexOf(c))?` ${'<- |^^^^->| /\\\\/    '.substr(4*q+2*b,2)} `:c=='H'?'HOV3':c).join``;y=r&&r<6?y[o](/\| H/g,'x H')[o](/3 \|/g,'3 x'):y;console.log(b|r==2|r==9?y:y[o](/[^!\|x#]/g,' '))}}

데모

글을 쓰는 시점에 Firefox와 Edge에서 작동해야하며 Chrome / Opera는 실험 기능을 사용하도록 설정해야합니다.

console.log = x => O.innerHTML += x + '\n';

f = (x, n) => {
  for (i = 0; n > i++;) {
    b = !(r = i % 10) | r == 3;
    y = [...
      `! ${[...x].join` | `} !` [o = 'replace'](/[\W] ?M [\W]?/g, '##')
    ].map(c => ~(q = 'LPRTU'.indexOf(c)) ? ` ${'<- |^^^^->| /\\\\/    '.substr(4*q+2*b,2)} ` : c == 'H' ? 'HOV3' : c).join ``;
    y = r && r < 6 ? y[o](/\| H/g, 'x H')[o](/3 \|/g, '3 x') : y;
    console.log(b | r == 2 | r == 9 ? y : y[o](/[^!\|x#]/g, ' '))
  }
}

// Snippet stuff
var demo = () => {
  O.innerHTML = '';
  document.forms[0].checkValidity() && f(document.getElementById('P').value, document.getElementById('N').valueAsNumber);
};

document.getElementById('P').addEventListener('change', demo);
document.getElementById('N').addEventListener('change', demo);

demo();
<form action='#'>
  <p>
    <label>Lane pattern:
      <input type=text pattern=^M?([BHLPRTU]M?)+$ maxlength=19 required id=P value=MLTPUMHUTBR>
    </label>
  </p>
  <p>
    <label>Kilometres:
      <input type=number id=N min=1 value=21 max=50 step=1 required>
    </label>
  </p>
  <pre><output id=O></output></pre>
</form>


1

05AB1E , 175 (174) 175 바이트

ðTиDU'|TиX'BŽ5ES©ǝX„\/TbSDVè®ǝ€ºX4×"HOV3"®ǝX'<18SǝX„|-Yè®ǝøJDí'<'>:X'^®ǝ2×'#Tи2×'x5и'|5и«'!Tи)I.•o¤[‹‡•uŽDýSтì€ûŽe1ª904ûª8ª₄«ª‡•δ~¬]•2ôDí«Ž
ÿT∍S:ð.ø8ðì‚8:1ðì‚ð:SðT:èεI∍}øJ»

꽤 나쁜 접근법이지만 작동하고 재미있게 만들었습니다. 그래도 확실히 더 골프를 칠 수 있습니다.

인접한 두 HH레인의 버그 수정으로 +1 바이트

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

설명:

1 단계 : 크기가 10 인 가능한 모든 레인을 만듭니다.

ðTи               # Push a space character, repeated 10 times as list
   DU             # And store a copy in variable `X`
'|Tи             '# Push "|", repeated 10 times as list
X                 # Push the list of spaces of variable `X`
 'B              '# Push a "B"
   Ž5E            # Push compressed integer 1289
      S           # Converted to a list of digits: [1,2,8,9]
       ©          # Store it in variable `®` (without popping)
        ǝ         # Replace the spaces in the pushed `X` with the "B" at these (0-based)
                  # indices
X                 # Push `X` again
 \/              # Push string "\/"
    TbS           # Push 10, converted to binary, as list: [1,0,1,0]
       DV         # Store a copy in variable `Y`
         è        # Index each into this string: ["/","\","/","\"]
          ®       # Push list `®` again ([1,2,8,9])
           ǝ      # And replace the spaces with these characters
            €º    # And then mirror each line (" "→"  "; "/"→"/\"; "\"→"\/")
X                 # Push `X` again
 4×               # Extend each space to four spaces
   "HOV3"         # Push string "HOV3"
         ®ǝ       # And replace the spaces with this string at the indices of `®` again
X                 # Push `X` again
 '<              '# Push string "<"
   18S            # Push 18 as list: [1,8]
      ǝ           # Replace the spaces with "<" at those indices
       X          # Push `X` yet again
        „-|       # Push string "-|"
           Yè     # Use list `Y` ([1,0,1,0]) to index into this string: ["-","|","-","|"]
             ®ǝ   # And replace the spaces at the indices of `®` again
               ø  # Then zip-pair the two lists together
                J # And join each pair of characters to a string
Dí                # Create a copy and reverse each string
  '<'>:           # And replace all "<" with ">"
X'^®ǝ            '# Push `X` with the spaces at indices `®` replaced with "^" 
     2×           # Extend each character to size 2
'#Tи             '# Push "#", repeated 10 times as list
    2×            # And extend each character to size 2
'x5и             '# Push "x" repeated 5 times as list
    '|5и         '# Push "|" repeated 5 times as list
        «         # And merge the lists together
'!Tи             '# Push "!", repeated 10 times as list
)                 # And finally wrap all lists of the stack into one big list of lanes

2 단계 : 입력 문자열을 인덱스로 변환합니다 (1 단계에서 만든 목록으로 색인을 생성하는 데 사용).

I                 # Push the input-string
 .•o¤[‹‡•         # Push compressed string "tlrpbhmu"
         u        # And uppercase it
ŽDý               # Push compressed integer 3567
   S              # Converted to a list of digits: [3,5,6,7]
    тì            # Prepend each with "100": ["1003","1005","1006","1007"]
      €û          # And palindromize each: ["1003001","1005001","1006001","1007001"]
Že1               # Push compressed integer 10201
   ª              # And append it to the list
904ûª             # Push 904 palindromized to "90409", and also append it to the list
8ª                # Append 8 to the list
₄Â                # Push 1000, and bifurcate it (short for Duplicate & Reverse copy)
  «               # Merge them together: "10000001"
   ª              # And also append it to the list
                 # Now transliterate all uppercase characters in the input to these numbers
•δ~¬]•            # Push compressed integer 1119188999
      2ô          # Split into parts of size 2: [11,19,18,89,99]
        Dí        # Create a copy, and reverse each item: [11,91,81,98,99]
          «       # And merge the lists together: [11,19,18,89,99,11,91,81,98,99]
Ž\nÿ              # Push compressed integer 19889
    T            # Extended to size 10: 1988919889
      S           # As a list of digits: [1,9,8,8,9,1,9,8,8,9]
:                 # Replace all [11,19,18,89,99,11,91,81,98,99] with [1,9,8,8,9,1,9,8,8,9]
                  # in the converted string
ð.ø               # Surround the string with spaces
8ðì               # Push 8 with a prepended space: " 8"
   ‚             # Bifurcate and pair: [" 8","8 "]
     8:           # And replace all those for 8 in the string
1ðì‚ð:           # Do the same for [" 1","1 "] → " "
S                 # Convert the string to a list of characters (digits and space)
 ðT:              # Replace the spaces for 10

3 단계 :이 지수를 사용하여 차선 목록에 색인을 생성합니다. 그런 다음 레인 목록을 정수 입력의 크기로 늘리거나 줄이는 것을 포함하여 레인 목록을 올바른 출력으로 변환합니다.

è                 # Index the indices in the integer-list into the lanes-list
 ε                # Map over each lane
  I               #  Push the second integer-input
                 #  Extend/shorten each 10-sized lane to this input-size
                # After the map: zip/transpose; swapping rows/columns
   J              # Join inner list together to a single string
    »             # And then join each string by newlines
                  # (after which the result is output implicitly)

내이 05AB1E 팁을 참조하십시오 (섹션 어떻게 압축 문자열이 아닌 사전의 일부에? 그리고 어떻게 큰 정수를 압축하는 방법? ) 이유를 이해하는 방법 Ž5E이다 1289; .•o¤[‹‡•이다 "tlrpbhmu"; ŽDý이다 10201; •δ~¬]•이다 1119188999; Ž\nÿ입니다 19889.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.