パス上のすべての座標を見つける


21

入力として2D文字列を指定します。改行または行のリストを含む文字列として、リスト内(x, y)のすべてのハッシュ(#)の座標を出力します。入力にはハッシュとスペースのみが含まれます。(入力を2D文字列として取得することを選択した場合は改行)

ハッシュがない場合は、何でも出力できます。

出力は、どの番号がどの番号とペアになっているかについて明確でなければなりません。

例:

##

出力する必要があります:

(0,0), (1,0)

これは、左上から始まる0から始まるインデックス付けを前提としています。任意のコーナーから開始し、0または1ベースのインデックスを使用するか、y最初に出力することができます。(例えば、フォームでy,x)。

その他のテストケース(ここでも、すべて0から(x, y)始まる左上のインデックスを使用):

    #
#####
#

(4, 0), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (0, 2)


# ###
### #

(0, 0), (2, 0), (3, 0), (4, 0), (0, 1), (1, 1), (2, 1), (4, 1)

これらのテストケースはすべて、パスをたどるのではなく、行ごとにリストされることに注意してください。

ハッシュが連続したトレイルを形成する、つまり# #入力にならないことを想定できます。(おそらく重要ではありませんが、誰かがこれを正規表現したい場合)

また、垂直列、水平行、または並べ替えられていないリストなど、任意の順序で座標を出力できます。


入力にハッシュとスペースのみが含まれると仮定できますか?
DJMcMayhem

@DJMcMayhemはい、それを質問に編集します。
Rɪᴋᴇʀ

だろうこのまたはこれが有効な出力形式も?
ズガルブ

@Zgarbは基本的に余分な1,1とハッシュを備えていますか?ええ、確かに。
Rɪᴋᴇʀ

回答:


10

スリップ、2 + 1 = 3バイト

pフラグ用に+1バイト。コード:

`#

説明:

p-flag戻り、次の各出現の位置:

`#      // The character '#'

ここで試してみてください!


1
勝者はいると思います
アダム

説明はありますか?
Rɪᴋᴇʀ

@EasterlyIrkバックティックは、単一の文字を文字列としてエスケープします。フラグは位置結果を要求します。
アダム

@Adámああ、クール!
Rɪᴋᴇʀ

8

グライム、5バイト

pa`\#

オンラインでお試しください! 出力形式は少しファンキーですが、OPは有効であると述べています。

説明

グライムは私の2Dパターンマッチング言語です。後の部分`パターンで、この場合は- #文字を含む1×1の正方形です。Grimeは入力グリッドで一致を検索し、デフォルトで最初に見つかったものを出力します。前の部分に`はオプションが含まれます。この場合、すべての一致(a)がその位置とサイズ(p)とともに印刷されることを示します。


8

MATL7 6 5バイト

これは(1,1)、左上隅で1ベースのインデックスを使用しています。

oo&fh

説明:

o        % convert char to double 
 o       % remainder mod 2 ('#' == 35, ' '==32) makes spaces falsy
  &f     % apply `find` with 2d-output 
    h   % concatenate outputs to display x- and y-coordinates side by side

-1バイトごとに@DJMcMayhemと@LuisMendoに感謝します!

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


3
あなたはooH#fh1バイトを保存することができます。(整数に変換、mod2)スペースは偶数(mod 2 == 0、falsy)および#奇数(mod 1 == 1、truey)であるため
DJMcMayhem

ああ、ありがとう、ありがとう!=)
flawr

7

Python、67バイト

これは、実際には、同様のトピックに関するStack Overflowの答えのゴルフです。

lambda a,e=enumerate:[[(i,j)for j,B in e(A)if'!'<B]for i,A in e(a)]

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

2Dリストをループし、ハッシュ文字を記録して、結果を返します。入力はハッシュとスペースのみで構成され、感嘆符()よりも大きい文字はハッシュ()のみであるため、char > '!'ではなくを使用してバイトを保存します。char == '#'0x230x21


5

JavaScript(ES6)、70 67バイト

s=>s.replace(/./g,(c,i)=>c>' '?[i%l,i/-l|0]+' ':'',l=~s.indexOf`
`)

改行とスペースで区切られた座標のリストを出力します。例えば

4,0
0,1 1,1 2,1 3,1 4,1
0,2

奇妙な出力形式でもっと短くすることができます:

s=>s.replace(/#/g,(c,i)=>[i%l,i/-l|0]+c,l=~s.indexOf`
`)

この出力

    4,0#
0,1#1,1#2,1#3,1#4,1#
0,2#

2番目のテストケースの場合。どの番号がどの番号とペアになっているのかはまだ明らかです...



4

ゼリー、8バイト

n⁶T€,€"J

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

文字の2D配列(=文字列のリスト)が与えられた場合:

            Implicit input (example):
               [[' ', ' ', ' ', ' ', '#']
               ,['#', '#', '#', '#', '#']
               ,['#', ' ', ' ', ' ', ' ']]
n⁶          Not-equal to space (⁶).
               [[0, 0, 0, 0, 1]
               ,[1, 1, 1, 1, 1]
               ,[1, 0, 0, 0, 0]]
  T€        Indices of 1s in each row
               [[5], [1,2,3,4,5], [1]]
    ,€"J    Pair each, vectorizing, with y-indices
               [[[5,1]], [[1,2],[2,2],[3,2],[4,2],[5,2]], [[1,3]]]

3

Dyalog APL 16.0、5文字= 9 バイトまたは6文字= 8 バイト

左上から(y、x)ペアのリストを提供します。

⍸⎕='#'

どこで

入力

= 等しい

'#' このキャラクター*

*それは置き換えることにより、1バイトのコストで文字を節約することが可能である'#'⍕#(ルート名前空間をフォーマット)

TryAPLオンライン!TryAPLがバージョン14.0を実行しているi ため、エミュレートされていることに注意してください。


Dyalog APLで1文字= 1バイトをエンコードしているのは確かですか?
devRicher

@devRicher通常、しかしシングルバイトバージョンには含まれていません。「バイト」リンクを参照してください。
アダム

3

JavaScript(Firefox 30-57)、61バイト

s=>[for(c of(x=0,y=1,s))if(c<' '?(y++,x=0):(x++,c>' '))[y,x]]

1から始まる座標を返します。注文[y, x][x, y]注文を簡単に切り替えられます。ゴルフをしていない:

function coords(s) {
    var x = 0;
    var y = 1;
    for (Var c of s) {
        if (c == "\n") {
            y++;
            x=0;
        } else {
            x++;
        }
        if (c == "#") {
            console.log(y, x);
        }
    }
}

2

Vim、37バイト

:%s/#/\=line('.').','.col('.').' '/g<cr>

Vはほとんど下位互換性があるため、オンラインで試すことができます!

単純な正規表現ソリューション。各 '#'が見つかった場所に置き換えられます(1ベースのインデックス付け)。これを書いている間、行の最初の場所を置き換えた後に場所が変わることを少し心配していましたが、それは問題ではないようです。TBHこのソリューションがどれほどシンプルになってしまったのか、とても嬉しく思います。

残念ながら、vimscriptは非常に冗長であるため、ほとんどのバイトは結果を分離するためのものであるため、依然として判読可能です。そうでなければ、私たちはできる

:%s/#/\=line('.').col('.')/g

しかし、これにより、解釈が非常に難しい出力が作成されます。さらに、グリッドが常に9x9以下である場合にのみ機能します。

これは、それが表すハッシュの位置で座標の各ペアを表示するため、非常に楽しいソリューションです。たとえば、入力

# ###
### #

出力

1,1  1,3 1,4 1,5 
2,1 2,2 2,3  2,5 

もちろん、Vを使用している場合、末尾の改行を削除して正規表現を圧縮できます。その後、単純に

Í#/½line('.').','.col('.').' '/g

(32バイト)

しかし、これはまったく同じアプローチであり、依然として痛々しいほど冗長であるため、ゴルフ言語を使用する価値はありません。


2
さて、「ハッシュの位置で座標の各ペアを表示する」全体はかなりクールです。1
Rɪᴋᴇʀ

2

Haskell、53バイト

concat.zipWith(\y l->[(x,y)|(x,'#')<-zip[0..]l])[0..]

入力は文字列のリストとして取得されます。出力は(x,y)ペアのリスト(0インデックス)です。たとえば

*Main> concat.zipWith(\y l->[(x,y)|(x,'#')<-zip[0..]l])[0..] $ ["# ###","### #"]
[(0,0),(2,0),(3,0),(4,0),(0,1),(1,1),(2,1),(4,1)]

2

Lua、141バイト

w=io.read()x=w:sub(1,w:find("\n")-1):len()_,c=w:gsub("\n","")for i=0,x do for j=0,c+1 do if w:sub(c*x+i,c*x+i)=="#"then print(i,j)end end end

午前2時30分、ベッドにいて、電話で。なぜこれをしているのですか?


1

Mathematica、12バイト

Position@"#"

の演算子形式Position。文字の2D配列を想定しています。左上のエントリから始まる1インデックス。座標のリストをフォームに出力します{row,column}


タスクの説明を読む方法では、文字列をサポートする言語では文字の2D配列を取ることは許可されていないと思います。
smls


私は確信していません。一つには、その質問はに焦点を当てていますchar[]。これは、実際にはCベースの言語で文字列を保存する一般的な方法です。また、このタスクの説明では、「改行を含む文字列または行のリスト」として具体的に言及し、文字のリストのリストまたは文字の2Dマトリックスについては言及していません。
sml

@smlsまさに。コンセンサスは、質問が文字列を指定する場合、それは文字のシーケンスを意味し、あなたの言語がそれを表現する方法が複数ある場合、ゴルフのニーズに合ったものを自由に選択できるということでした。「改行または行のリストを含む文字列として」を指定しても、各行を文字の配列として表す場合、正確に2Dの文字配列を取得するため、変更はありません。
-ngenisis

1

PHP、69バイト

for(;$a=$argv[++$i];)for($j=0;""<$c=$a[$j++];)echo$c>" "?"$j $i,":"";

左上から1から始まるインデックスを使用します。
次のように使用します:

php -r 'for(;$a=$argv[++$i];)for($j=0;""<$c=$a[$j++];)if($c>" ")echo"$j $i,";' '    #' '#####' '#    '

出力されます:

5 1,1 2,2 2,3 2,4 2,5 2,1 3,

1

C、113バイト

i,j,k,l;f(char**p){i=strlen(*p);l=strlen(p);for(j=0;j<l;j++)for(k=0;k<i;k++)if(p[j][k]==35)printf("%d,%d ",k,j);}

テストケースからの出力:

0,0 2,0 3,0 4,0 0,1 1,1 2,1 4,1 
4,0 0,1 1,1 2,1 3,1 4,1 0,2 

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


1

RBX.Lua、131バイト

入力が有効であると仮定する必要があります(Zはフラット軸、空白はWhiteタイル、ハッシュは他の色にすることができ、左上の部分はに0, 0, 0あります)。すべての部分は同じモデルの一部であり、Mそれ以外の場合はモデルは空です。

for k,v in pairs(workspace.M:GetChildren())do if v.BrickColor~=BrickColor.new("White")then print(v.Position.X,-v.Position.Y)end end

サンプル入出力:

例


有効なI / Oの例を提供できますか?
Rɪᴋᴇʀ

@EasterlyIrkそこで、答えを編集しました。
-devRicher

1

Perl 6、25バイト(22文字)

{^∞ZX@_».indices("#")}

入力を行のリストとして受け取ります。
各行に1つのリストを出力します。各リストには、座標の(y、x)タプルが含まれます。
オンラインでお試しください!

使い方

{                    }  # A lambda.
{    @_»             }  # For each input line:
        .indices("#")   #    get x-coordinates.  (4) (0 1 2 3 4) (0)
 ^∞                     # Range from 0 to Inf.    0   1           2 ...
   Z                    # Zip with:              (0 (4)) (1 (0 1 2 3 4)) (2 (0))
    X                   #    Cartesian product.  ((0 4)) ((1 0) (1 1) (1 2) (1 3) (1 4)) ((2 0))

1

Groovy、80 68バイト

{y=0;it.each{it.eachWithIndex{x,i->print(x=='#'?"($i,$y)":"")};y++}}

入力例:

[#   #,#   #,#####]

出力例:

(0,0)(4,0)(0,1)(4,1)(0,2)(1,2)(2,2)(3,2)(4,2)

タスクの説明ですでに分割された行のリストを取得できるのに、なぜ入力を行に分割するのですか?
smls


0

C、80バイト

x,y;f(char*s){for(x=y=0;*s;printf(*s-35?"":"%d,%d ",x,y),*s++==10?++y,x=0:++x);}

入力を改行区切り文字配列として必要とし、出力を画面に出力します。

ゴルフをしていない&使用法:

x,y;

f(char*s){
 for(
  x = y = 0;             //init coordinates
  *s;                //iterate until end
  printf(*s-35 ? "" : "%d,%d ", x, y),     //print coordinates or empty string
  *s++==10 ? ++y, x=0 : ++x              //advance to the right or the next line
 );
}


main(){
 f("    #\n#####\n#    ");
 puts("");
 f("# ###\n### #");
}

1
78バイト:x,y;f(char*s){for(x=y=0;*s;*s++==10?++y,x=0:++x)*s==35&&printf("%d,%d ",x,y);}
gastropner
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.