道路長エンコーディング


21

米国では、道路上の交通の2つの反対方向は、通過が許可されている場合は黄色の破線で、通過が許可されていない場合は黄色の実線で区切られています。

道路線ルールのグラフィック

(片側だけを通過させてその側を通過させることができ、黄色の線は中央やリバーシブルレーンなどの他のことを意味する場合がありますが、これらの場合は関係ありません。)

かかるプログラム書くランレングスエンコードされた文字列Pのために渡すNするために無通過し、対応する道路のASCIIバージョンを出力します。中心線を除き、道路は常に同じパターンを持っています。これは、以下の例から簡単に推測できます。

各入力文字列の前PおよびN入力文字列には正の10進数があります。この数は、長さ定義通過又は無通過する道路の現在の一部の領域を。

の入力は、通過しない道路の12N12列を生成します(中心線all ):=

____________


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

____________

の入力は12P通過する道路の12列を生成します(中心線が- 繰り返されます)。

____________


- - - - - - 

____________

渡す何の通過は、その後組み合わせることができません、例えば、4N4P9N7P1N1P2N2P生成します:

______________________________


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

______________________________

これらは、4つの通過しない列、4つの通過、9つの通過なしなどです。

通過ゾーン-は、スペース()ではなく、常に左端のダッシュ()で始まることに注意してください。これは必須です。

詳細

  • 入力に2つのNゾーンまたは2つのPゾーンが連続することはありません。たとえば、4P5P発生することはありません。
  • 先頭に正の数字がない文字をサポートする必要はありません。平野Pは常に1P、平野Nは常にです1N
  • 道路の最後の列を超えない限り、後続スペースが存在する場合があります。オプションの末尾の改行が1つある場合があります。
  • プログラムの代わりに、ランレングスでエンコードされた文字列を取り込んで、ASCIIロードを出力または返す関数を作成できます。
  • 任意の標準的な方法(stdin、コマンドライン、関数arg)で入力を受け取ります。

バイト単位の最短コードが優先されます。Tiebreakerは以前の投稿です。


道路は非対称である必要がありますか、それとも線の両側に4つのスペースを印刷することは許可されていますか?
orlp

@orlp道路を5行より広くすることができるかどうかを尋ねる場合、いいえ。空白文字は[はいであれば、詳細弾丸3で保持するよう、中央線の上または下の空行に入れることができるならば、あなたは求めている場合
カルバンの趣味

例で聞いてみましょう、これらのどちらかが有効な出力ですか? gist.github.com/orlp/0e0eae16d6e1fcda5e9b
orlp

@orlpどちらでもありません。
カルビンの趣味

回答:


5

CJam、38バイト

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

使い方

私たちは、最初の変数に正しい道列を割り当てるNPして、単純に入力された文字列を評価します。これにより、スタックに長さと列のペアが残ります。それらをグループ化し、その上で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

JavaScript(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文字

収束演算子を 1時間前にMartinBüttnerのRetinaのリッピングとして追加したため、これはカウントされないかもしれませんが...私はとにかく競争するためにここにいるわけではありません。これは正規表現ベースのソリューションを作成するのが楽しいだけです。

(\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's 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

次の2行は同じパターンを続けます。

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

最初の行は、残りの行をダッシュ​​スペースパターンで置き換えます。2番目のものは奇数を処理します。最後のダッシュとそれに続く単一の整数(など-5)をダッシュ​​スペース(-)に置き換えます。現在、出力は次のとおりです。

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

今、物事は適所に落ち始めています。次の行:

#\D/

ただ削除#Nして#P

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

上下にアンダースコアを設定して、以下を提供します。

A______________________________


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

A______________________________

最後に、次のものを削除しAます。

A/

2

Haskell、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は、5行のリストを、最上行(中央行のすべての文字をに置き換えたもの_)、改行、中間行、空行、および最下行(topと同じ)で構成される改行で結合します。


2

Python 3、169 168バイト。(Python 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の下でそれを得ることができません
ティム

p+=['='*v,('- '*v)[:v]][_[-1]=='P']前のセミコロンで前の行の最後に置くと、1バイト節約できます。
mbomb007

また、代わりにPython 2を使用すると、で1バイト節約されますprint
mbomb007

@ mbomb007がそれらを追加しました:)私はpython 2の感じがあります、それはさらに短くなるかもしれません...しかし、私は確信がありません。
ティム

2

Python 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");

コードは1行のままにすることができます。ここでは、読みやすくするために複数行で表示されています(書式設定に使用される空白と改行はカウントされていません)。

末尾の改行を印刷しないことにより、2バイトを節約できます。で実際の改行文字を使用すると、さらに5バイトを保存できますecho()

echo("$a


$o

$a");

$o$o='';)の初期化を省略することで6バイト追加できますが、これは通知をトリガーします。この通知は、コマンドラインを使用してスクリプトを実行することで抑制できます。

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

これらにより、174バイトになります。


2

ルビー、 137 135バイト

私が思いつくことができる最短ではありませんが、最も良いに近い。オプティマイザーの回答から一部を借りました。

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バイト改善(およびpython 2の回答を上回る)できるはず(a.shift.zip(*a).map(&:join)*?\n).gsub'--','- 'です。
ブルトレンジ

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回など)繰り返します。

各反復は1を出力しcharます。の値はcharコードで記述されますl%5?l^2?32:c^78?++x&1?45:32:61:95

  • 行番号が5または0の場合、95(_)を
  • それ以外の場合、行番号が2に等しくない場合、スペースを出力します
  • それ以外の場合、シンボルが「N」の場合、61(=)を
  • それ以外の場合は、x1 ずつ増やします(2に初期化されましたsscanf
  • 奇数の場合は45(-)を印刷し、そうでない場合は32(スペース)を印刷します

0

Scala、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(267 b)

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から文字列を取得し、4番目の文字列を取得します。 注意空行が入力を得ることに運ぶためにスキャンのためにそれらのスペース(か何か)を必要とすることに。

    「====--=========----=-==-」

  • これは、置き換え=でSをNS、-してPS。

    「NNNNPPPPNNNNNNNNNPPPPPPPNPNNPP」

  • そして、それはそれぞれの間にスペースを挿入NPしてのPN

    「NNNN PPPP NNNNNNNNN PPPPPPP NP NN PP」

  • スキャンは文字列をスペースで分割します

    「NNNN」「PPPP」「NNNNNNNNN」「PPPPPPP」「N」「P」「NN」「PP」

  • 次に、文字列の長さがバインドされます(rbind、各文字列の最初の文字で)

    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.