22

チャレンジ

あみだくじの方法を使用して、数値と有効な文字列パターンが与えられた場合に、数値解を出力する文字数による最短のコード。

入力:3、
"| | | | | | | |
 |-| | = | | | | |
 |-| | |-| | = | |
 | |-| |-| | |-| "

出力:2

入力:2、
"| | | = | |
 |-| |-| |
 | |-| | |"

出力:1

明確化

  1. 入力を気にしないでください。他の場所で与えられた値を考慮してください。
  2. 両方の入力値が有効です。列番号は既存の列に対応し、パターンには記号、、、(および[スペース]、[LF])のみが含まれ|ます。また、隣接する2つの列の両方にダッシュを含めることはできません(同じ行に)。-=
  3. パターンの寸法は不明です(最小1x1)。

明確化#2

  1. 2つの無効なパターンがあります:|-|-|そして|=|=|それは曖昧さを生み出します。指定された入力文字列にそれらが含まれることはありません。
  2. 入力変数はすべて同じです。パターンを表す数値と文字列。
  3. 応募者は関数を作成する必要があります。

テストケース

与えられたパターン:
"|-| | = |-| = | LF | |-| | |-| LF | = | |-| | | LF | | |-| = |-|"

|-| | = |-| = |
| |-| | |-|
| = | |-| | |
| | |-| = |-|

与えられた値:期待される結果
 1:6
 2:1
 3:3
 4:5
 5:4
 6:2

編集:期待される結果を修正

4

6 に答える 6

13

JavaScript :169158148141127125123122 文字_ _ _ _ _


縮小およびゴルフ:

function g(n,s){for(l=s.split('\n'),n*=2;k=l.shift();)for(j=3;j;)n+=k[n-3]==(c=--j-1?'=':'-')?-2:k[n-1]==c?2:0;return n/2}


読み取り可能なバージョン:

function g(n, str) {
   var c, i, j;
   var lines = str.split('\n');
   n = (n * 2) - 2;

   for (i = 0; i < lines.length; i++) {
      for (j = 0; j < 3; j++) {
         c = (j == 1) ? '-' : '=';

         if (lines[i].charAt(n-1) == c) n-=2;          // Move left
         else if (lines[i].charAt(n+1) == c) n+=2;     // Move right
      }
   }

   return 1+n/2;
}


説明:

  1. str行の配列に分割されます。
  2. n0から始まる各行の文字数をカバーするようにスケーリングされます。
  3. 各行で3回繰り返します。各レイヤーで1回です。各線が3つの層に分割されていると想像してください。上層と下層は、=標識の脚が取り付けられている場所です。中間層は-標識の脚用です。
  4. n隣接する標識に従って左または右に移動します。各行のすべてのレイヤーに対して可能な移動は1つだけです。したがってn、1列に最大3回移動する可能性があります。
  5. を返しnます。1から垂直線の数まで正規化されます。


テストケース:

var ghostLegs = [];

ghostLegs[0] = "|-| |=|-|=|\n" +
               "| |-| | |-|\n" +
               "|=| |-| | |\n" +
               "| | |-|=|-|";

ghostLegs[1] = "| | | | | | | |\n" +
               "|-| |=| | | | |\n" +
               "|-| | |-| |=| |\n" +
               "| |-| |-| | |-|";

ghostLegs[2] = "| | |=| |\n" +
               "|-| |-| |\n" +
               "| |-| | |";

ghostLegs[3] = "|=|-|";

for (var m = 0; m < ghostLegs.length; m++) {
   console.log('\nTest: ' + (m + 1) + '\n');

   for (var n = 1; n <= (ghostLegs[m].split('\n')[0].length / 2) + 1; n++) {
      console.log(n + ':' + g(n, ghostLegs[m]));
   }
}


結果:

Test: 1
1:6
2:1
3:3
4:5
5:4
6:2

Test: 2
1:1
2:3
3:2
4:4
5:5
6:6
7:8
8:7

Test: 3
1:3
2:1
3:4
4:2
5:5

Test: 4
1:3
2:2
3:1
于 2010-04-28T09:58:27.447 に答える
9

AWK- 687779文字

ダニエルの解決策のほとんどの翻訳(私たちはあなたの男が大好きです;)

{for(i=0;i<3;){s=++i-2?"=":"-";if(s==$x)x--;else if(s!=$++x)x--}}END{print x}

しかし、私たちはそれを廃止しif/elseて置き換えることができます?:

{for(i=0;i<3;){s=++i-2?"=":"-";s==$x?x--:s!=$++x?x--:x}}END{print x}

x変数として定義された開始位置で実行します。

$ for x in `seq 6`; do echo $x\ ;awk -F\| -vx=$x -f ghost.awk<<__EOF__
|-| |=|-|=|
| |-| | |-|
|=| |-| | |
| | |-|=|-|
__EOF__
done

1 6
2 1
3 3
4 5
5 4
6 2
于 2010-04-28T20:24:18.733 に答える
6

ルビー-66959283 文字_ _

(ダニエルの答えからの交互の行のアイデア)

def f s,m
m.each_line{|r|%w{= - =}.map{|i|s+=i==r[2*s-3]?-1:i==r[2*s-1]?1:0}}
s
end

92文字

def f s,m
  s=s*2-2
  m.each_line{|r|%w{= - =}.each{|i|s+=i==r[s-1]?-2:i==r[s+1]?2:0}}
  1+s/2
end

使用法

map="|-| |=|-|=|
| |-| | |-|
|=| |-| | |
| | |-|=|-|"

1.upto(6) do |i|
    p f(i, map)
end

出力

6
1
3
5
4
2
于 2010-04-28T08:21:34.247 に答える
4

Perl、9291文字

sub g{for$s(pop=~/.+/g){map$_[0]-=1-abs(index substr(" $s",$_[0]*2-2,3),$_),qw[= - =]}pop}

別のアプローチ、98 97 95 949392 文字

sub g{map{for$s(qw[= - =]){pos=$_[0]*2-2;$_[0]+=/\G((?<=$s)|.$s)/&&$&cmp$"}}pop=~/.+/g;pop}

テストスイート

$s=<<'__PATTERN__';
|-| |=|-|=|
| |-| | |-|
|=| |-| | |
| | |-|=|-|
__PATTERN__

for $n (1..6) {
    print g($n,$s);
}
于 2010-04-28T19:03:34.950 に答える
3

VB.Net:290文字(320バイト)

Option Strict Off、OptionExplicitOffが必要です

Function G(i,P)
i=i*2-1
F=0
M="-"
Q="="
Z=P.Split(Chr(10))
While E<Z.Length
L=(" "& Z(E))(i-1)
R=(Z(E)&" ")(i)
J=L & R=" "&" "
E-=(F=2Or J)
i+=If(F=1,2*((L=M)-(R=M)),If(F=2,2*((L=Q)-(R=Q)),If(J,0,2+4*(L=Q Or(L=M And R<>Q)))))
F=If(F=1,2,If(F=2,0,If(J,F,2+(L=Q Or R=Q))))
End While
G=(i-1)\2+1
End Function

読み取り可能なフォーム:

Function G(ByVal i As Integer, ByVal P As String) As Integer

    i = i * 2 - 1
    Dim F As Integer = 0
    Const M As String = "-"
    Const Q As String = "="
    Dim Z As String() = P.Split(Chr(10))
    Dim E As Integer = 0

    While E < Z.Length
        Dim L As Char = (" " & Z(E))(i - 1)
        Dim R As Char = (Z(E) & " ")(i)
        Dim J As Boolean = L & R = " " & " "

        E -= (F = 2 Or J)
        i += If(F = 1, 2 * ((L = M) - (R = M)), _
                If(F = 2, 2 * ((L = Q) - (R = Q)), _
                If(J, 0, 2 + 4 * (L = Q Or (L = M And R <> Q)))))

        F = If(F = 1, 2, If(F = 2, 0, If(J, F, 2 + (L = Q Or R = Q))))

    End While

    G = (i - 1) \ 2 + 1

End Function

テストケース

Sub Main()

    Dim sb As New StringBuilder
    Dim LF As Char = ControlChars.Lf
    sb.Append("|-| |=|-|=|")
    sb.Append(LF)
    sb.Append("| |-| | |-|")
    sb.Append(LF)
    sb.Append("|=| |-| | |")
    sb.Append(LF)
    sb.Append("| | |-|=|-|")

    Dim pattern As String = sb.ToString

    For w As Integer = 1 To pattern.Split(LF)(0).Length \ 2 + 1
        Console.WriteLine(w.ToString & " : " & G(w, pattern).ToString)

    Next

    Console.ReadKey()

End Sub

編集:

(まだこれを読んでいる人のために)

別のアプローチを試しました。私のアイデアは、予想されるさまざまなパターンをマッピングし、それに応じて行動することでした。まず、左に曲がるか右に曲がるかを決定してから、小さなアミダーモンキーが移動する列の数を決定する必要があります(必要に応じて文字列を逆にします)。

最初に完全なソリューションを提示します。

Function GhostLeg(ByVal i As Integer, ByVal p As String) As Integer

    i = i * 2 - 2

    Dim LeftOrRight As New Dictionary(Of String, Integer)
    LeftOrRight(" | ") = 0
    LeftOrRight("-| ") = -1
    LeftOrRight("=| ") = -1
    LeftOrRight("=|-") = -1
    LeftOrRight(" |-") = 1
    LeftOrRight(" |=") = 1
    LeftOrRight("-|=") = 1

    Dim ColumnAdd As New Dictionary(Of String, Integer)
    ColumnAdd("| | | ") = 0
    ColumnAdd("| | |-") = 0
    ColumnAdd("| |-| ") = 0
    ColumnAdd("| | |=") = 0
    ColumnAdd("| |=| ") = 0
    ColumnAdd("| |-|=") = 0
    ColumnAdd("| |=|-") = 0

    ColumnAdd("|=| | ") = 0
    ColumnAdd("|=| |-") = 0
    ColumnAdd("|=| |=") = 0
    ColumnAdd("|-| |-") = 1
    ColumnAdd("|-| | ") = 1
    ColumnAdd("|-| |=") = 1
    ColumnAdd("|-|=|-") = 2
    ColumnAdd("|-|=| ") = 2
    ColumnAdd("|=|-| ") = 2
    ColumnAdd("|=|-|=") = 3

    Const TRIPLESPACE As String = " | | "
    Dim direction As Integer

    For Each line As String In p.Split(Chr(10))
        line = TRIPLESPACE & line & TRIPLESPACE

        direction = LeftOrRight(line.Substring(i + 4, 3))
        If direction = 1 Then
            line = line.Substring(i + 5, 6)
            i += 2 * direction * ColumnAdd(line)

        ElseIf direction = -1 Then
            line = StrReverse(line.Substring(i, 6))
            i += 2 * direction * ColumnAdd(line)

        End If

    Next

    Return 1 + i \ 2

End Function

文字ごとに高価な辞書、および不要な'を削除し、|さらに'縮小'した後、次のようになります。

Function G(i,p)
D="- 0= 0=-0 -2 =2-=2"
A="- -1-  1- =1-=-2-= 2=- 2=-=3"
For Each l In p.Replace("|","").Split(Chr(10))
l="   "& l &"   "
w=InStr(D,Mid(l,i+2,2))
If w Then
w=Val(D(w+1))-1
s=InStr(A,If(w=1,Mid(l,i+3,3),StrReverse(Mid(l,i,3))))
i+=If(s,w*Val(A(s+2)),0)
End If
Next
G=i
End Function

私の以前の取り組み(282文字、308バイト)と比較すると、それほど大きなメリットはありませんが、このアプローチは、別のプログラミング言語を使用している他の人にとっては役立つかもしれません。

于 2010-04-28T12:29:34.260 に答える
3

C#でのダニエルの答え-173文字

Daniel Vassalloの解決策を見た後、私は恥ずかしすぎて投稿できませんでした。しかし、これがダニエルの答えであり、C#に移植されています。C#の大きな欠点の1つは、境界チェックを実行する必要があることでした。これには20文字のコストがかかります。

int G(string s,int n){var l=s.Split('\n');n*=2;for(int i=0,j,c;i<l.Length;i++)
for(j=0;j<3;n+=n>2&&l[i][n-3]==c?-2:n<l[i].Length&&l[i][n-1]==c?2:0)c=j++==1?45
:61;return n/2;}

フォーマット済み:

int G(string s, int n)
{
    var l = s.Split('\n');
    n *= 2;

    for (int i = 0, j, c; i < l.Length; i++)
        for (j = 0; j < 3; n += n > 2 && l[i][n - 3] == c ? -2 : n < l[i].Length && l[i][n - 1] == c ? 2 : 0)
            c = j++ == 1 ? 45 : 61;

    return n / 2;
}
于 2010-04-29T17:24:09.383 に答える