경로의 모든 좌표 찾기


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

@ Zgarb는 기본적으로 여분의 1,1과 해시를 가지고 있습니까? 물론 이죠
Rɪᴋᴇʀ

겠습니까 내 다른 형식은 유효?
ETHproductions

답변:


10

슬립 , 2 + 1 = 3 바이트

p플래그의 경우 +1 바이트 암호:

`#

설명:

p-flag 반환 다음의 각 선두로부터의 위치 :

`#      // The character '#'

여기 사용해보십시오!


1
우리는 승자가 있다고 생각합니다
Adám

어떤 설명?
Rɪᴋᴇʀ

@EasterlyIrk 백틱은 단일 문자를 문자열로 이스케이프합니다. 플래그는 위치 결과를 요청합니다.
Adám

@ Adám 아, 멋지다!
Rɪᴋᴇʀ

8

Grime , 5 바이트

pa`\#

온라인으로 사용해보십시오! 출력 형식은 약간 펑키하지만 OP는 유효하다고 명시했습니다.

설명

Grime은 2D 패턴 일치 언어입니다. 이후 부분 `패턴 이며,이 경우 문자를 포함하는 #1x1 정사각형 입니다. Grime은 입력 그리드에서 일치하는 항목을 검색하고 기본적으로 찾은 첫 번째 항목을 인쇄합니다. 앞 부분 `에는 옵션이 포함되어 있으며,이 경우 모든 일치 항목 ( a)과 위치 및 크기 ( p) 가 인쇄되어야 함을 나타 냅니다.


8

MATL , 7 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, 허위) #홀수 (mod 1 == 1, 진실)
DJMcMayhem

오, 정말 고마워요! =)
flawr

7

파이썬 , 67 바이트

이것은 실제로 비슷한 주제에 대한 내 스택 오버플로 답변 의 골프 일뿐 입니다.

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

자바 스크립트 (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#

두 번째 테스트 사례 어느 숫자가 어떤 숫자와 짝을 이루는지는 여전히 분명합니다 ...



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) 쌍의 목록을 제공합니다.

⍸⎕='#'

어디에

입력

= 같다

'#' 이 캐릭터 *

* 그것은 대체하여 한 바이트의 비용으로 문자를 저장할 수 있습니다 '#'⍕#(루트 네임 스페이스를 포맷)

TryAPL 온라인! 참고 로 에뮬레이트 된 i TryAPL 버전 14.0을 실행하기 때문이다.


Dyalog APL에서 1 문자 = 1 바이트를 인코딩하는 것이 확실합니까?
devRicher

@devRicher 일반적으로 단일 바이트 버전에는 포함되지 않습니다. "바이트"링크를 참조하십시오.
Adám

3

자바 스크립트 (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

하스켈, 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

루아, 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

수학, 12 바이트

Position@"#"

의 연산자 형식입니다 Position. 문자의 2D 배열을 가정합니다. 왼쪽 상단에서 시작하여 1- 색인. 형식으로 좌표 목록을 출력합니다 {row,column}.


작업 설명을 읽는 방식으로 문자열을 지원하는 언어에는 2D 문자 배열을 사용할 수 없다고 생각합니다.
smls


나는 확신하지 못한다. 우선,이 질문에 초점을 맞 춥니 다. char[]실제로 C 기반 언어로 문자열을 저장하는 일반적인 방법입니다. 또한이 작업 설명에서는 "줄 바꿈이있는 문자열 또는 줄 목록"을 구체적으로 언급하고 문자 목록 또는 문자의 2D 행렬을 언급하지 않습니다.
SMLS

@smls 정확합니다. 합의는 질문이 문자열을 지정하면 일련의 문자를 의미하며, 언어에 두 가지 이상의 표현 방법이 있으면 골프 요구에 맞는 것을 자유롭게 선택할 수 있다는 것입니다. "줄 바꿈이있는 문자열 또는 행 목록"을 지정하면 각 행을 문자 배열로 표시하면 정확히 2D 문자 배열을 얻게되므로 변경하지 않습니다.
ngenisis 2012 년

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("#")}

행 목록으로 입력을받습니다.
각 좌표에 대해 (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

그루비, 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.