ドミノ効果を書く


25

最も少ないUnicode文字を使用して、3つのパラメーターを受け入れる関数を作成します。

  • ドミノの総数
  • n影響を受けたドミノ
  • 影響を受けるドミノの倒れる方向(0またはL左、1またはR右)

ドミノを倒したら、残りのドミノを同じ方向に倒す必要があります。

あなたは、出力とドミノすべき|スタンディングドミノを表すと\し、/ドミノを表すには、それぞれ左右に倒します。

10, 5, 1戻る||||//////
6, 3, 0べきです\\\|||


3番目のパラメーターは文字列にする必要がありますか、それともbool / intは0:left、1:rightのようになりますか?
user80551

10個のドミノがあり、5個が正しくノックされている場合、ノックオーバーされた10個のドミノのうち6個を表示する必要があることを例が示しています。
algorithmshark 14

1
@algorithmshark 5番目のドミノが正しくノックされた場合、結果を表示する必要があると思います。
user80551 14

@ rybo111 3番目のパラメーターをintにすると、比較演算が短くなる可能性があります。単にif(third_parameter)代わりにif(third_paramter=='l')
user80551

パラメータの順序を選択できますか?
ジャスティン14

回答:


14

ルビー、38(46)文字

e=->n,k,r{k-=r;'\|'[r]*k+'|/'[r]*n-=k}

この関数は、方向を整数として取ります(1右、0左)。文字列を受け取る関数は8文字長くなります。

d=->n,k,r{n-=k;r<?r??\\*k+?|*n :?|*~-k+?/*-~n}

使用例:

puts e[10, 5, 1] # or d[10, 5, 'r']
||||//////
puts e[10, 5, 0] # or d[10, 5, 'l']
\\\\\|||||

2番目の例でドミノが5つしか残っていないのはなぜですか?
クライドロボ14

1
@ClydeLobo位置5から開始し、ドミノを左にノックすると、合計で5つのドミノが4つドッキングされます。最初の例では、位置5からドミノを6つドッキングします。 5位のプラス5の右側にあります。
Ventero

8

ハスケル、70

f R i l=(i-1)#'|'++(l-i+1)#'/'
f L i l=i#'\\'++(l-i)#'|'
(#)=replicate

Directionがあり、コンストラクターRLがあると仮定します。


8

J- 32 26文字

Jは、リストを使用せずに3つ以上の引数を処理することはできません。また、ボックス化せずに非同種リストを処理することはできません。したがって、入力を3つの整数のリストとして持つことが理想的です。パラメータの順序は、標準の順序の逆です。左が0、右が1、次に位置、そしてドミノの合計数です。この理由は、Jがそれらを右から左に通過するためです。

{`(('|/\'{~-@>:,:<:)1+i.)/

これが何が起こっているかです。F`G/リストに適用するx,y,zと評価されx F (y G z)ます。y G zドミノが倒れた可能性のある両方の方法を構築し 、2つのうちどちらをF使用xするかを選択するために使用します。

以下は、関数がどのように一緒に構築されるかを説明するJ REPLの前後です。インデントされた行はREPLに入力され、応答は左マージンと同じ高さになります。括弧がない限り、Jは厳密に右から左に評価することを思い出してください。

   1 ] 3 (]) 10            NB. ] ignores the left argument and returns the right
10
   1 ] 3 (] 1+i.) 10       NB. hook: x (F G) y  is  x F (G y)
1 2 3 4 5 6 7 8 9 10
   1 ] 3 (>: 1+i.) 10      NB. "greater than or equal to" bitmask
1 1 1 0 0 0 0 0 0 0
   1 ] 3 (-@>: 1+i.) 10    NB. negate
_1 _1 _1 0 0 0 0 0 0 0
   1 ] 3 (<: 1+i.) 10      NB. "less than or equal to"
0 0 1 1 1 1 1 1 1 1
   1 ] 3 ((-@>:,:<:)1+i.) 10          NB. laminate together
_1 _1 _1 0 0 0 0 0 0 0
 0  0  1 1 1 1 1 1 1 1
   1 ] 3 (('|/\'{~-@>:,:<:)1+i.) 10   NB. turn into characters
\\\|||||||
||////////
   1 { 3 (('|/\'{~-@>:,:<:)1+i.) 10   NB. select left or right version
||////////
   {`(('|/\'{~-@>:,:<:)1+i.)/ 1 3 10  NB. refactor
||////////
   {`(('|/\'{~-@>:,:<:)1+i.)/ 0 3 10
\\\|||||||

数文字を犠牲にして、順序を標準の順序にすることができ@|.ます。関数の最後に追加するだけです:

   |. 10 3 1
1 3 10
   {`(('|/\'{~-@>:,:<:)1+i.)/@|. 10 3 1
||////////

ただし、これを方向の文字列引数で動作するように適合させるには、はるかにコストがかかります。


私はそれがされています知っている間、あなたはこの答えを書いて以来、それが構成されている方法は非常にクールです。動名詞をどのように使用したか/、2つの出力を作成して目的の出力を選択する方法がとても気に入っています。これにはふさわしい認識がないと思う。
コール

@coleが言ったことに、私はwas敬の念を抱きました。
FrownyFrog

7

PowerShell、66

filter d($n,$k,$d){"$('\|'[$d])"*($k-$d)+"$('|/'[$d])"*($n-$k+$d)}

おそらく他の人が持っていたのと同じ考え。

  • 方向パラメーターとして0または1を取ります(それぞれ左と右)

6

Golfscript(44 53

初めてのGolfscriptプログラム。必要以上に長くかかったし、おそらくもっと賢く、より簡潔な方法で行うことができました(誰かがそれを証明すると確信しています:)):

:d;:j;:^,{:x j<d&'\\'{x^j)->d!&'/''|'if}if}%

サンプル入力は10 5 0です。

ゴルフをしていない:

:d;:j;:^      # save input in variables and discard from stack, except total length ^
,             # create an array of numbers of length ^
{             # start block for map call
  :x          # save current element (= index) in variable
  j<          # check whether we are left of the first knocked over domino
  d           # check whether the direction is to the left
  &           # AND both results
  '\\'        # if true, push a backslash (escaped)
  {           # if false, start a new block
    x^j)->    # check whether we are on the right of the knocked over domino
    d!        # check whether the direction is to the right
    &         # AND both results
    '/'       # if true, push a slash
    '|'       # if false, push a non-knocked over domino
    if
  }
  if
}%            # close block and call map

1
証明済み;-)解決策にはまだ満足していませんが。
ハワード14

1
いくつかのヒント:/の代わりに/ を選択dすると、コードが短くなります。それ以外の場合、変数に格納する場合、oyuはとの2番目の比較の代わりにそれを使用できます。用語では、の代わりに英数字以外の変数名を使用すると、両方の空白を保存できます。01'l''r'd'l'=dx i ji
ハワード14

@Howardヒントをありがとう!'l'/ を選択し'r'たのは、整数を自由に使用できることをまだ見ていなかったためです。英数字以外のトリックは滑らかです、ありがとう!後で答えを更新するかもしれません。
インゴバーク14


4

パイソン-45 52

これには1、右と0左が必要です。

x=lambda n,k,d:'\\|'[d]*(k-d)+"|/"[d]*(n-k+d)

ここで取りバージョンだrlで、正しく58

def x(n,k,d):d=d=='r';return'\\|'[d]*(k-d)+"|/"[d]*(n-k+d)

使用例...

>>> print(x(10,3,0))
\\\|||||||
>>> print(x(10,3,1))
||////////
>>> print(x(10,5,1))
||||//////
>>> print(x(10,5,0))
\\\\\|||||
>>> print(x(10,3,0))
\\\|||||||

4

JS(ES6) - 79 74 72 65 62

@nderscoreに感謝します!

3番目のパラメーターはブール値です(0:左/ 1:右)

d=(a,b,c)=>"\\|"[a-=--b,c].repeat(c?b:a)+"|/"[c].repeat(c?a:b)

// Test
d(10,3,1); // => "||////////"
d(10,3,0); // => "\\\\\\\\||"

1
D:このエントリは、ECMAScriptの6参照カードとすることができる
BEBE

@bebeハハ、そしてそれは最終的な形でさえありません。ES6は非常に汚れている可能性があります。
xem 14

1
65:d=(a,b,c)=>"\\"[r="repeat"](!c&&a-b+1)+"|"[r](--b)+"/"[r](c&&a-b)
nderscore 14

1
すばらしいです!私はこのクレイジーなものも見つけましたが、より長いです(67):d =(a、b、c、d = a-b + 1)=> "\\ |" [c] .repeat(c?b-1:d )+ "| /" [c] .repeat(c?d:b-1)
xem 14

エイリアシングを繰り返すことは価値がないと思います。[r='repeat'][r]15文字。.repeat.repeat14文字
-edc65

3

Python2 / 3-54

最後にルールに追加されたものは非常に素晴らしかったです( 'l' / 'r'の代わりに0/1)。鉱山を実際に既存のpythonソリューションよりも小さくしました。0は左、1は右

def f(a,b,c):d,e='\|/'[c:2+c];h=b-c;return d*h+e*(a-h)

# Usage:
print(f(10,5,1)) # => ||||//////
print(f(10,5,0)) # => \\\\\|||||

3

Haskell、42バイト

(n%k)b=["\\|/"!!(b-div(k-b-c)n)|c<-[1..n]]

オンラインでお試しください!

ドミノ、「ドミノ倒れ、方向」のような入力(%) n k bn受け取ります。kb

算術式を使用して文字インデックス0、1、または2を計算することによりc1〜の範囲の各位置で文字を検索しnます。

ここから取ったテストケース。


Haskell、44バイト

(n%k)b=take n$drop(n+n*b+b-k)$"\\|/"<*[1..n]

オンラインでお試しください!

少し長くなった興味深い戦略。各シンボルの連続コピーを含む文字列"\\|/"<*[1..n]を生成し、開始位置が算術的に決定された連続文字のnスライスをn取得します。


2

Python 2.7、68 65 61 59 58文字

d=1左とd=0右に 使用

f=lambda a,p,d:['|'*(p-1)+'/'*(a-p+1),'\\'*p+'|'*(a-p)][d]

注:さらにゴルフをしてくれた@TheRareに感謝します。


1
どうしてd and'\\'...or'/'...
seequ 14

あなたも行うことができます('\\'...,'/'...)[d]
seequ

@TheRareこれらのリストのうち2つが必要です。
user80551 14

そうは思いません。f=lambda a,p,d:('|'*(p-1)+'/'*(a-p+1),'\\'*p+'|'*(a-p))[d]
seequ 14

@TheRare Also, I don't think your code works when falling left.証明するテストケースを教えていただけ ますか?
user80551 14

2

Javascript、46文字

0 = lおよび1 = rを行うために不正行為のように見えますが、あります。少し再帰して縮小します。

f=(a,p,d)=>a?'\\|/'[(p-d<1)+d]+f(a-1,p-1,d):''

編集:明らかなキャラクターを見逃した


2

JavaScript(ES6)61 63

編集それはバグだらけだった-私には恥。

@xemとそれほど違いはありませんが、自分で見つけたので短いです。左/右のパラメーターdは0/1

F=(a,p,d,u='|'.repeat(--p),v='\\/'[d].repeat(a-p))=>d?u+v:v+u

Firefoxコンソールでテストする

for(i=1;i<11;i+=3) console.log('L'+i+' '+F(10,i,0) + ' R'+i+' '+ F(10,i,1))

出力

L1 \\\\\\\\\\ R1 //////////
L4 \\\\\\\||| R4 |||///////
L7 \\\\|||||| R7 ||||||////
L10 \||||||||| R10 |||||||||/

1
あるべき--p
アンダースコア14

@nderscoreはい、パラメーターを間違えた、ばかげている。
edc65

2

Perl、 67 65文字

sub l{($t,$p,$d)=@_;$p-=$d;($d?'|':'\\')x$p.($d?'/':'|')x($t-$p)}

最初の3つのパラメーター(合計、位置、方向を整数[0左、1右]として)を割り当てます。エキストラはエーテルに入ります。右に向かっている場合は、位置から1を引くと、位置Xのドミノも反転します。


1
に置き換え$p--if$d$p-=$d2つの文字を失います:)
中国のperlゴス




1

PHP-64

function f($a,$b,$c){for($w='\|/';++$i<=$a;)echo$w[$c+($i>$b)];}

単純なループ、およびキャラクターのエコー。

を生成しNotice: Undefined variable: i、エラーをサイレントにする別のバージョンがあります(65文字):

function f($a,$b,$c){for($w='\|/';@++$i<=$a;)echo$w[$c+($i>$b)];}

エラーのないバージョン(69文字):

function f($a,$b,$c){for($w='\|/',$i=0;++$i<=$a;)echo$w[$c+($i>$b)];}

PHPの他の機能:

sprintf/ printfパディング

function f($a,$b,$c){printf("%'{${0*${0}=$c?'|':'\\'}}{$a}s",sprintf("%'{${0*${0}=$c?'/':'|'}}{${0*${0}=$a-$b+$c}}s",''));}

str_pad/ str_repeat関数を介したパディング

function f($a,$b,$c){$f='str_repeat';echo$f($c?'|':'\\',$b-$c).$f($c?'/':'|',$a-$b+$c);}
function f($a,$b,$c){echo str_pad(str_repeat($c?'|':'\\',$b-$c),$a,$c?'/':'|');}

printfstr_repeat関数の両方を使用する

function f($a,$b,$c){printf("%'{${0*${0}=$c?'|':'\\'}}{$a}s",str_repeat($c?'/':'|',$a-$b+$c));}
function f($a,$b,$c){$w='\|/';printf("%'$w[$c]{$a}s",str_repeat($w[$c+1],$a-$b+$c));}

1

Scala 75文字

def f(l:Int,p:Int,t:Char)=if(t=='l')"\\"*p++"|"*(l-p) else "|"*(l-p):+"/"*p

1

CJam-20

q~
:X-_"\|"X=*o-"|/"X=*

メインコードは2行目にあり、1行目は標準入力からパラメーターを取得するためのものです(そうでない場合は、パラメーターをコードに入れる必要があります)。

http://cjam.aditsu.net/で試してください

例:

12 4 1
|||/////////

8 5 0
\\\\\|||

説明:

:X変数Xに格納し、最後のパラメータ(0/1方向)
-ノックオーバー位置から減算X、文字の最初のシーケンス(レッツ・コールそれL)の長さを得ることは
_Lのコピーを作る
"\|"X=最初に使用する文字を取得します。\ためにX = 0及び|X = 1回の
*文字L回数こと反復
oストリングアウトプリントを、スタックからそれを除去する
-ドミノの数から減算L、文字の第二の配列の長さを求めるには(LETの呼び出しがR)
"|/"X=の文字を取得します次を使用:|X = 0の場合、/X = 1の場合
*、その文字をR回繰り返します


1

Common Lisp

これはコードゴルフでは勝てませんが、Common Lispの正当化フォーマットディレクティブを強調しています。

(lambda (n p d &aux (x "\\|/"))
   (format t "~v,,,v<~v,,,v<~>~>" n (aref x d) (+ d (- n p)) (aref x (1+ d))))

算術は悪くありません n。ドミノの総数です。p最初に倒れたドミノの位置です。dは、0または1(コメントで許可されているように)左右を表し、x; へのインデックスとして使用されます。 x文字列であり\|/。書式文字列は、2つの(ネストされた)位置合わせディレクティブを使用します。各ディレクティブはパディング文字を許可します。したがって:

(dotimes (d 2)
  (dotimes (i 10)
    ((lambda (n p d &aux (x "\\|/"))
       (format t "~v,,,v<~v,,,v<~>~>" n (aref x d) (+ d (- n p)) (aref x (1+ d))))
     10 (1+ i) d)
    (terpri)))

\|||||||||
\\||||||||
\\\|||||||
\\\\||||||
\\\\\|||||
\\\\\\||||
\\\\\\\|||
\\\\\\\\||
\\\\\\\\\|
\\\\\\\\\\
//////////
|/////////
||////////
|||///////
||||//////
|||||/////
||||||////
|||||||///
||||||||//
|||||||||/

1

PHP、89文字

function o($a,$p,$d){for($i=0;$i<$a;$i++)echo$d==0?($i+1>$p)?'|':'\\':($i+1<$p?'|':'/');}

PHPが大好きだからです。

編集:次のコードは同じことを行います。

function dominoes ($number, $position, $direction) {
    for ($i=0; $i<$number; $i++){
        if ($direction==0) {
            if (($i+1) > $position) {
                echo '|';
            } else {
                echo '\\';
            }
        } else {
            if (($i+1) < $position) {
                echo '|';
            } else {
                echo '/';
            }
        }
    }
}

より詳細なバージョンを入手しましたか?
マーティン

1
@Martijn、投稿を編集して投稿を含めました。
TribalChief 14

今、私はそれが何をするかを見ることができます。派手なものはありませんが、+ 1 :)
Martijn 14

ありがとう!@NPlayのソリューションは派手に見えます!
TribalChief 14

いくつかのゴルフのヒント:1)で不要な括弧($i+1>$p)。2)三項式を書き換えて、$d?($i+1<$p?'|':'/'):$i+1>$p?'|':'\\'さらに3バイトを節約します。または==0、方向を削除して逆にします。3)では、投稿条件から$i++<$a削除$i++して$i$i+1(-6バイト)の代わりに使用できます。4)$i=0不要です。ただし、--n削除する場合は通知(オプション)を抑制する必要があります(-4バイト)。
タイタス


1

05AB1E、19 バイト

αα©„\|³è×¹®-„|/³è×J

私はまだそれが少し長い感じがしますが、それは動作します。

入力順序は、チャレンジの場合と同じです:合計の長さ、インデックス、1/ 0それぞれ左/右。

オンラインそれを試してみてくださいまたは両方のテストケースを確認してください

説明:

α                     # Take the absolute difference of the first two (implicit) inputs
                      #  i.e. 10 and 5 → 5
                      #  i.e. 6 and 3 → 3
 α                    # Then take the absolute difference with the third (implicit) input
                      #  i.e. 5 and 1 → 4
                      #  i.e. 3 and 0 → 3
  ©                   # Store this number in the register (without popping)
   \|                # Push "\|"
      ³è              # Use the third input to index into this string
                      #  i.e. 1 → "|"
                      #  i.e. 0 → "\"
        ×             # Repeat the character the value amount of times
                      #  i.e. 4 and "|" → "||||"
                      #  i.e. 3 and "\" → "\\\"
         ¹®-          # Then take the first input, and subtract the value from the register
                      #  i.e. 10 and 4 → 6
                      #  i.e. 6 and 3 → 3
            „|/       # Push "|/"
               ³è     # Index the third input also in it
                      #  i.e. 1 → "/"
                      #  i.e. 0 → "|"
                 ×    # Repeat the character the length-value amount of times
                      #  i.e. 6 and "/" → "//////"
                      #  i.e. 3 and "|" → "|||"
                  J   # Join the strings together (and output implicitly)
                      #  i.e. "||||" and "//////" → "||||//////"
                      #  i.e. "///" and "|||" → "///|||"

0

C ++ 181

#define C(x) cin>>x;
#define P(x) cout<<x;
int n,k,i;char p;
int main(){C(n)C(k)C(p)
for(;i<n;i++){if(p=='r'&&i>=k-1)P('/')else if(p=='l'&&i<=k-1)P('\\')else P('|')}
return 0;}

1
実際に明示的にreturn 0from する必要はありませんmain
zennehoy

cinとcoutがグローバル名前空間にないため、コンパイルされません-どのコンパイラを使用していますか?また、C(n)>>k>>pそうでC(n)C(k)C(p)はないよりも短絡されますか?そして、P()の定義が引数を文字列化できれば、すべての引用符の文字を保存できませんか?pを 'l'および 'r'と比較すると、0と1が短くなります-特に== 'r'の代わりに> 0、== 'l'の代わりに<1(( r / l-<'r'が== 'l'よりもまだ短く、> 'l'が== 'r'よりもまだ短い場合)
ジェリージェレミア14

@JerryJeremiah for cin and cout need "using namespace std".
bacchusbeale

I know but since it is only used twice it is shorter to qualify the functions. Neither way works on my compiler without the include.
Jerry Jeremiah

0

PHP - 105,97, 96

 function a($r,$l,$f){$a=str_repeat('|',$l-$f);$b=str_repeat($r?'/':'\\',$f);echo$r?$a.$b:$b.$a;}

Example results:

a(true,10,4);  -> \\\\||||||
a(false,10,5); -> |||||/////
a(false,10,2); -> ||||||||//

0

Javascript, 81 85 characters

function e(a,b,c){l='repeat';d='|'[l](--a-b++);return c>'q'?d+"/"[l](b):"\\"[l](b)+d}

First time trying codegolf, was fun thanks :)


Might as well modify the function to be an ES6 function, as string repeat is ES6 (doesn;t work in Chrome).
Matt

0

JavaScript - 85 chars

function d(a,b,c){for(r=c?"\\":"/",p="",b=a-b;a--;)p+=c?a<b?"|":r:a>b?"|":r;return p}

1 = Left, 0 = Right

d(10,3,1)
\\\|||||||
d(10,3,0)
||////////
d(10,7,1)
\\\\\\\|||
d(10,7,0)
||||||////

0

Clojure, 81 chars

(defn g[a,p,d](apply str(map #(nth "\\|/"(+(if(>= % (- p d)) 1 0) d))(range a))))

0

vb.net (~75c)

Dim f=Function(l,p,d)(If(d="l",StrDup(p,"\"),"")& StrDup(l-p-If(d="l",1,0),"|")).PadRight(l,"/")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.