İleride yol boyama


12

İki parametre şeridi deseni ve yol uzunluğu verildiğinde , yolları boyamak için Yollar ve Trafik Hizmeti için şerit işaretlerinin ASCII temsilini yazdırın.

Örnek giriş / çıkış

Giriş:, BTHMLRPHU 21

Eğer iki parametre almak ya da dize sonuna numarasını bitiştirmek umurumda değil, bu açık.

Giriş, STDIN'den, işlev argümanı, ortam değişkenleri, dilinizde anlamlı olan ne olursa olsun alınabilir.

Çıktı:

!   |      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      !

Her karakter 0,5 metre genişliğinde ve bir kilometre uzunluğundadır.

Şartname

Şerit işaretleri

Her 10 km yol için işaretler 2, 3, 9 ve 10 km'de (çıktının "tepesinden") boyanır. İşaretler şeritte ortalanmıştır. Bisiklet şeridi ve ortanca hariç, tüm şeritler 3 metre (6 karakter) genişliğindedir.

ASCII elmas ve ok karakterler vardır değil örnek çıktısı belirtildiği üzere işaretler yerine izin verdi.

  • B: Bisiklet şeridi. Bişaretleme. 1,5 metre (3 karakter) genişliğinde.
  • T: Taşıma. Elmas markalama
  • H: Yüksek kapasiteli araç şeridi. HOV3işaretleme
  • Lve R: Dönüş şeridi. Ok işareti
  • P: Geçen şerit. Düzeltme işaretleri
  • U: Sınırsız şerit. İşaret yok

Ayırıcılar (öncelik sırasına göre)

  • Medyan: ##( Mgiriş dizesinde ile gösterilir, hendek dahil olmak üzere diğer ayırıcıların yerini alır)
  • Hendek (aşırı sol ve aşırı sağ): !Ünlem işareti
  • HOV şeritli alternatif arasında xve |her 5 km
  • Normal: |

Kısıtlamalar

İşleviniz veya programınız:

  • STDOUT'a yazdır (bu System.out.print, Java, console.logJavaScript vb . İçin eşdeğerleri anlamına gelir )
  • 0-10 medyan ile 1-9 şerit basabilme
  • 50 km'ye kadar yol (50 çıkış hattı) basabilme
  • Herhangi bir standart boşluk kullanmayın
  • \nÇıktının sonunda isteğe bağlı bir istisna dışında boşluk bırakılması kabul edilemez

Mümkün olan en büyük çıktı: 3700 bayt (74 karakter * 50 satır).

Mümkün olan en küçük çıkış: 5 bayt (giriş ile B, 1)

Varsayımlar

  • Bitişik medyan yok (alt dize MMoluşmaz)
  • İkinci işaret çizgisi kesilebilir (örneğin, uzunluk 9 veya 12 km ise)
  • Şeritler mantıklı olmayabilir (herhangi bir düzen mümkündür, örneğin yolun solunda sağa dönüş şeridi)

Bu , yani en kısa kod (bayt cinsinden) kazanır!


1
Ve orada, tek aralıklı yazı tiplerini seviyorsunuz
WayToDoor

Yanıtlar:


4

Yakut, 245

Şerit ayrımlarını ilgiliyse yazdırın, ardından şeridi yazdırın.

Kazanmayı beklemiyorum.

->(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:?!}}

Değişiklikler

245 şok stderr ve dizileri etkili bir şekilde ayırır.

263 Dizin dizini oluşturmanın daha iyi yolu

268 sadece her satırı yazdırın, standart sürümü hesaplamayın.

330 ilk taahhüt


Ruby'nin de kazanmasını beklemezdim ama önümüzdeki hafta içinde başka cevaplar yoksa o zaman kazanacağınızı tahmin ediyorum: - P İkinci bir notta, Ruby'i bilgisayarıma yüklemeden test edebileceğim herhangi bir yer var mı?
rink.attendant.6

@ rink.attendant.6 ideone.com
Charles

2

JavaScript (ES6), 316 bayt

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,' '))}}

gösteri

Yazma sırasında Firefox ve Edge'de çalışmalıdır, Chrome / Opera, deneysel özelliklerin etkinleştirilmesini gerektirir.

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 bayt

ð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»

Oldukça kötü bir yaklaşım, ama işe yarıyor ve yapmak eğlenceliydi. Yine de kesinlikle biraz daha golf edilebilir.

İki bitişik HHşerit için hata düzeltmesi olarak +1 bayt .

Çevrimiçi deneyin.

Açıklama:

Adım 1: 10 numaralı tüm olası şeritleri oluşturun:

ð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. Adım: Girdi dizesini dizinlere dönüştürün (1. adımda oluşturduğumuz listeye dizin oluşturmak için kullanacağız):

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

Adım 3: Bu indeksleri şerit listesine indekslemek için kullanıyoruz. Ve sonra bu şerit listesini tamsayı-girişinin boyutuna genişletmek / kısaltmak da dahil olmak üzere doğru çıkışa dönüştürürüz:

è                 # 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)

Bu 05AB1E ipucuma bakın (bölümler Sözlüğün parçası olmayan dizeler nasıl sıkıştırılır? Ve Büyük tamsayılar nasıl sıkıştırılır? ) Neden Ž5Eolduğunu anlamak için 1289; .•o¤[‹‡•olduğu "tlrpbhmu"; ŽDýolduğu 10201; •δ~¬]•olduğu 1119188999; Ž\nÿolduğunu 19889.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.