Encontre todas as coordenadas em um caminho


21

Dada uma string 2D como entrada, como uma string com novas linhas ou uma lista de linhas, produza as coordenadas (x, y)de todos os hashes ( #) na lista. A entrada conterá apenas hashes e espaços. (e novas linhas, se você optar por receber a entrada como uma sequência 2D)

Se não houver hashes, você pode produzir qualquer coisa.

A saída deve ser inequívoca quanto a quais números estão emparelhados com os quais.

Exemplo:

##

Saída deve:

(0,0), (1,0)

Isso pressupõe a indexação baseada em 0, iniciando no canto superior esquerdo. Você pode começar de qualquer canto, usar indexação com base em 0 ou 1 e / ou saíday primeiro. (por exemplo, no formulário y,x).

Mais casos de teste (novamente, todos usando o canto superior esquerdo com base em 0 (x, y) indexação ):

    #
#####
#

(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)

Observe que todos esses casos de teste são listados por linhas, não seguindo o caminho.

Você pode assumir que os hashes formarão uma trilha contínua, ou seja, # # , nunca será a entrada. (provavelmente não importará, mas caso alguém queira regexar isso)

Você também pode produzir as coordenadas na ordem que desejar, como colunas verticais, linhas horizontais ou apenas uma lista não classificada.


Podemos assumir que a entrada contém apenas hashes e espaços?
DJMcMayhem

@DJMcMayhem sim, editando isso na pergunta.
Rɪᴋᴇʀ

Será que este ou esta ser formatos de saída válidos?
Zgarb 4/17/17

@ Zgarb basicamente com o 1,1 extra e o hash? Ah, claro.
Rɪᴋᴇʀ

Será que o meu formato alternativo ser válido?
ETHproductions

Respostas:



8

Grime , 5 bytes

pa`\#

Experimente online! O formato de saída é um pouco descolado, mas o OP afirmou que é válido.

Explicação

Grime é minha linguagem de correspondência de padrões 2D. A parte depois `é o padrão , neste caso, um quadrado 1 × 1 contendo um #caractere. O Grime procurará uma correspondência na grade de entrada e imprimirá a primeira que encontrar por padrão. A parte anterior `contém opções, neste caso, significando que todas as correspondências ( a) devem ser impressas, juntamente com suas posições e tamanhos ( p).


8

MATL , 7 6 5 bytes

Isso está usando a indexação baseada (1,1)em 1 no canto superior esquerdo.

oo&fh

Explicação:

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

Obrigado @DJMcMayhem e @LuisMendo por cada -1 byte!

Experimente online!


3
Você poderia fazer ooH#fhpara salvar um byte. (convertido em inteiros, MOD2) desde que o espaço é ainda (mod 2 == 0, Falsas) e #é estranho (mod 1 == 1, truthy)
DJMcMayhem

Oh, ótimo, muito obrigado =)!
flawr

7

Python , 67 bytes

Na verdade, este é apenas um argumento da minha resposta do Stack Overflow sobre um tópico semelhante.

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

Experimente online!

Os loops na lista 2D, gravando os caracteres hash, e retornam o resultado. Salvamos um byte usando, em char > '!'vez de char == '#', porque a entrada consistirá apenas de hashes e espaços e, portanto, hashes ( 0x23) serão os únicos caracteres maiores que pontos de exclamação ( 0x21).


5

JavaScript (ES6), 70 67 bytes

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

Gera uma lista de coordenadas separadas por nova linha e espaço, por exemplo

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

Você pode ficar muito mais curto com um formato de saída estranho:

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

Isso gera

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

para o segundo caso de teste. Ainda está claro quais números estão emparelhados com quais ...


5

J , 12 bytes

$#:'#'I.@:=,

Experimente online!

Explicação

$#:'#'I.@:=,  Input is y.
           ,  Flatten y
   '#'    =   and form bit vector of equality with #.
      I.@:    Compute positions of 1s
 #:           and convert each to base
$             shape of y.

4

Gelatina , 8 bytes

n⁶T€,€"J

Experimente online!

Dada uma matriz 2D de caracteres (= uma lista de cadeias):

            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 caracteres = 9 bytes ou 6 caracteres = 8 bytes

Fornece uma lista de (y, x) pares do canto superior esquerdo.

⍸⎕='#'

Onde

entrada

= é igual a

'#' esse personagem*

* É possível salvar um caractere ao custo de um byte, substituindo '#'por ⍕#(formate o espaço para nome raiz)

TryAPL online! Observe que foi emulado i porque o TryAPL executa a versão 14.0.


Com certeza no Dyalog APL que codifica 1 char = 1 byte, não?
precisa saber é o seguinte

@devRicher Normalmente, mas não está incluído na versão de byte único. Veja o link "bytes".
Adám 5/17/17

3

JavaScript (Firefox 30-57), 61 bytes

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

Retorna coordenadas com base em 1. Facilmente selecionável entre [y, x]e [x, y]pedidos. Ungolfed:

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 bytes

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

Como o V é principalmente compatível com versões anteriores, você pode experimentá-lo online!

Uma solução simples de regex, em que substitui cada '#' pelo local em que foi encontrado (indexação baseada em um). Ao escrever isso, fiquei um pouco preocupado que o local mudaria depois de substituir o primeiro de uma linha, mas isso não parece ser um problema. TBH Estou agradavelmente chocado com o quão simples essa solução acabou sendo.

Infelizmente, o vimscript é muito detalhado, portanto, a maioria dos bytes vem da separação dos resultados, para que ainda seja legível. Caso contrário, poderíamos fazer

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

Mas isso cria uma saída que é bastante difícil de interpretar. Além disso, ele funcionará apenas na grade sempre 9x9 ou menor.

Essa é uma solução realmente divertida, pois mostra cada par de coordenadas no local do hash que representa. Por exemplo, a entrada

# ###
### #

saídas

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

Obviamente, se estivéssemos usando V, poderíamos remover a nova linha à direita e compactar a regex. Então poderia ser simplesmente

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

(32 bytes)

Mas como essa é exatamente a mesma abordagem e ainda é dolorosamente detalhada, não parece valer a pena usar uma linguagem de golfe.


2
Ok, o conjunto "mostra cada par de coordenadas no local do hash" é bem legal. +1
Rɪᴋᴇʀ

2

Haskell, 53 bytes

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

A entrada é tomada como uma lista de cadeias. A saída é uma lista de (x,y)pares (0 indexado), por exemplo

*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 bytes

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

São duas e meia da manhã, estou na cama, no meu telefone. Por que estou fazendo isto?


1

Mathematica, 12 bytes

Position@"#"

Forma do operador de Position. Assume uma matriz 2D de caracteres. Indexado em 1 a partir da entrada superior esquerda. Produz uma lista de coordenadas no formulário {row,column}.


Da maneira como leio a descrição da tarefa, não acho que é permitido usar uma matriz de caracteres 2D para idiomas que suportam strings.
SMLS


Não estou convencido. Por um lado, essa pergunta se concentra char[], que é realmente uma maneira comum de armazenar seqüências de caracteres em linguagens baseadas em C. Além disso, esta descrição da tarefa menciona especificamente "como uma sequência com novas linhas ou uma lista de linhas" e não menciona lista de listas de caracteres ou matriz 2D de caracteres.
SMLS

@smls Exatamente. O consenso foi que, se uma pergunta especifica uma sequência, significa uma sequência de caracteres, e se o seu idioma tiver mais de uma maneira de expressar isso, você poderá escolher o que melhor se adapte às suas necessidades de golfe. Especificar "como uma string com novas linhas ou uma lista de linhas" não altera nada, pois se você representar cada linha como uma matriz de caracteres, obterá exatamente uma matriz de caracteres 2D.
Ngenisis

1

PHP, 69 bytes

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

Usa indexação baseada em 1, começando no canto superior esquerdo.
Use como:

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

Saída:

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

1

C, 113 bytes

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);}

Saídas de casos de teste:

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 

Experimente online!


1

RBX.Lua, 131 bytes

Tem que assumir que a entrada é válida (Z é o eixo plano, os espaços em branco são Whiteladrilhos, os hashes podem ser de qualquer outra cor, a parte superior esquerda está localizada em 0, 0, 0) e todas as partes fazem parte do mesmo modelo Me o modelo está vazio.

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

Entrada / saída de amostra:

Exemplo


Você pode fornecer um exemplo de E / S válido?
Rɪᴋᴇʀ

@EasterlyIrk Lá, editou a resposta.
precisa saber é o seguinte

1

Perl 6 , 25 bytes (22 caracteres)

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

Recebe a entrada como uma lista de linhas.
Gera uma lista por linha, cada uma contendo tuplas (y, x) para as coordenadas.
Experimente online!

Como funciona

{                    }  # 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 bytes

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

Exemplo de entrada:

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

Saída de exemplo:

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

Por que dividir a entrada em linhas, quando a descrição da tarefa permite obter uma lista já dividida de linhas?
SMLS


0

C, 80 bytes

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

Requer entrada como matriz de caracteres delimitada por nova linha, imprime a saída na tela.

Ungolfed & uso:

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

11
78 bytes:x,y;f(char*s){for(x=y=0;*s;*s++==10?++y,x=0:++x)*s==35&&printf("%d,%d ",x,y);}
gastropner 27/12/17
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.