Onde estão os caracteres adjacentes no título? [3, 4]!

21

Título com erros ortográficos de propósito. Leia mais para descobrir o porquê.

Sua tarefa: dada uma sequência ou lista delimitada, incluindo os caracteres A,B,C,D, produza os índices de todos os caracteres iguais adjacentes. A saída pode ser várias cadeias / números inteiros em várias linhas, uma lista / matriz ou uma cadeia delimitada.

Toda saída deve estar em uma lista ou sequência, ou em várias linhas impressas. Cada linha impressa, se houver várias, deve conter apenas 1 sequência ou número. Trailing whatevers estão bem.

Métodos padrão de entrada / saída. Aplicam-se brechas padrão.

Por exemplo, a entrada 'ABCDDCBA'deve gerar 3,4ou 4,5, dependendo de estar indexada de 0 a 1, porque esses números são os índices de De o Dpróximo a ele.

Casos de teste:

Os casos de teste têm entrada fornecida como uma única sequência e saída como uma ,sequência delimitada. As saídas são indexadas em 0, adicione 1 a cada item gerado para que seja indexado em 1.

Input: 'ABCDCABCD'
Output: ''

Input: 'AABBCCDD'
Output: '0,1,2,3,4,5,6,7'

Input: 'ABCDDDCBA'
Output: '3,4,5'

Input: 'ABBCDD'
Output: '1,2,4,5'

Isso é , então o código mais curto vence!

Camarada SparklePony
fonte
Podemos ter um delimitador à direita na saída?
Business Cat
@BasicSunset Sure
Camarada SparklePony
11
@ JonathanAllan Tudo bem, porque ele gera apenas uma lista.
precisa saber é o seguinte
2
Os índices de caracteres consecutivos podem aparecer várias vezes? Por exemplo, para o terceiro caso de teste, também é 3,4,4,5válido?
Lucas
11
Você pode adicionar um caso de teste que não possui correspondências simétricas? Por exemploAABBCD -> 1,2,3,4
Riley

Respostas:

5

MATL , 8 7 bytes

d~ftQvu

A saída é baseada em 1.

Experimente online!

Explicação com exemplo

Considere entrada 'ABCDDDCBA'.

d     % Implicitly input a string. Consecutive differences
      % STACK: [1  1  1  0  0 -1 -1 -1]
~     % Negate. Each character that equals the next gives true
      % STACK: [0 0 0 1 1 0 0 0]
f     % Find: (1-based) indices of true elements
      % STACK: [4 5]
tQ    % Duplicate, add 1 element-wise
      % STACK: [4 5], [5 6]
v     % Concatenate vertically
      % STACK: [4 5; 5 6]
u     % Unique (remove duplicates). This doesn't automatically sort, but the 
      % output will be sorted because the input, read in column-major order, is 
      % Implicitly display
      % STACK: [4; 5; 6]
Luis Mendo
fonte
8

Retina , 33 29 23 bytes

Economizou 6 bytes graças a Martin Ender

T`L`:`(.)\1+
:
$.`¶
T`L

Produz uma lista de índices separados por avanço de linha.

Experimente online!

Explicação

T`L`:`(.)\1+

O transliterado é executado do mesmo caractere em dois pontos, para marcar as posições em que existem caracteres duplicados.

:
$.`¶

Em seguida, substitua cada dois pontos pelo comprimento do texto antes dele, seguido por um avanço de linha.

T`L

Por fim, exclua as letras restantes.

Gato de negócios
fonte
7

Geléia , 7 bytes

JṁŒgḊÐf

Baseado em 1; retorna uma lista de listas de execuções de índices, conforme permitido pelo OP.

Experimente online!

Quão?

JṁŒgḊÐf - Main link: char-list s       e.g. 'DCCABBBACCCD' (which is a python interpreted input of ['D','C','C','A','B','B','B','A','C','C','C','D'])
J       - range(length(s))                  [1,2,3,4,5,6,7,8,9,10,11,12]
  Œg    - group-runs(s)                     [['D'],['C','C'],['A'],['B','B','B'],['A'],['C','C','C'],['D']]
 ṁ      - mould left like right             [[1],[2,3],[4],[5,6,7],[8],[9,10,11],[12]]
     Ðf - filter keep items that would be truthy (empty is not truthy) after applying:
    Ḋ   -     dequeue (x[1:])               [    [2,3],    [5,6,7],    [9,10,11]     ]        
Jonathan Allan
fonte
2
- Coisas que eu gostaria que o 05AB1E fizesse por 500, por favor.
Magic Octopus Urn
11
Sinto cada vez mais que essa linguagem é como trapacear aqui. : D
Avamander
@ComradeSparklePony por que desfazer a verificação de aceitação?
Jonathan Allan
7

Brain-Flak , 57 46 bytes

{({}[({})]<(([]<>)[()])>){(<{}{}{}>)}{}<>}<>

Inclui +2 para -ar

Usa indexação baseada em 0.

Experimente online!

# While true
{

  # Subtract the second value on the stack from the first
  ({}[({})]

  # Push the height of this stack (the main stack) on the other stack
  <(([]<>)

  # Push the height of the main stack - 1
  [()])>

  # Push the difference that we calculated a second ago
  )

  # If they weren't the same character
  {

    # Pop the difference and the two stack heights
    (<{}{}{}>)

  # End if
  }

  # Pop the difference (or the 0 to get out of the if)
  {}

# Switch back to the main stack and end while
<>}

# Switch to the stack with the indexes and implicitly print
<>
Riley
fonte
6

Mathematica, 32 bytes

Union@@StringPosition[#,x_~~x_]&

Função pura que retorna as posições indexadas em 1 de caracteres adjacentes a um caractere idêntico.

Explicação:

StringPosition["string","sub"]fornece uma lista das posições de caracteres inicial e final nas quais "sub"aparece como uma substring de "string". x_~~x_é um StringExpressionque corresponde a dois caracteres idênticos adjacentes. Por exemplo, StringPosition["ABCDDDCBA",x_~~x_]{{4, 5}, {5, 6}}. A aplicação Unionjunta as listas, classifica e exclui duplicatas.

ngenisis
fonte
5

Flak cerebral , 69, 59 , 56 bytes

{({}[({})]<(())>){((<{}{}>))}{}{([{}]([]<>))(<>)}{}}<>

Experimente online!

+2 bytes para os -arsinalizadores que ativam a entrada ASCII e invertem a pilha.

Usa indexação baseada em 0. Economizei 10 bytes, reduzindo minha redundância push-pop . Economizou outros 4 bytes alternando da indexação baseada em 1 para 0.

Este é praticamente o único desafio baseado em cordas em que o cérebro é bom. Isso ocorre porque o cérebro é ótimo na comparação de caracteres consecutivos, mesmo que seja horrível no processamento de strings em geral. Aqui está a versão legível do código com comentários para explicar como ele funciona:

#While True
{

    #Determine if top two are equal
    ({}[({})]<(())>){((<{}{}>))}{}

    #If so
    {

        #Pop the one, and negate it's value (giving us -1)
        ([{}]

        #Push stack height over
        ([]<>)

        #Then push stack height plus the negated pop (-1)
        ) 

        #Push a zero back onto the main stack
        (<>)

    #Endwhile
    }

    #Pop the zero
    {}

#Endwhile
}

#Toggle back, implicitly display
<>
DJMcMayhem
fonte
@riley fixed! (E ainda um byte mais curto: P)
DJMcMayhem
Eu sempre esqueço -r. Isso me traz para baixo a 46.
Riley
5

Braquilog , 19 bytes

l⟦k:?z{sĊtᵐ=∧Ċ∋h}ᶠd

Experimente online!

Explicação

O Brachylog geralmente é terrível com índices, o que novamente mostra aqui.

Se false.for uma saída aceitável nos casos em que não houver caracteres adjacentes, isso seria 1 byte a menos substituindo ᶠdpor .

l⟦k                      The list [0, …, length(Input) - 1]
   :?z                   Zip the Input with this list
      {         }ᶠd      Find with no duplicates:
            ∧Ċ∋h           The heads of each element of Ċ = [A, B] (i.e. the indexes)…
        Ċtᵐ=               …where the tails of both A and B are equal (i.e. the letters)…
       sĊ                  …and where Ċ = [A, B] is a substring of the Input
Fatalizar
fonte
4

Oitava , 35 bytes

@(s)unique([x=find(~diff(+s)),x+1])

Experimente online!

Semelhante à minha resposta MATL . Aqui uniqueclassifica automaticamente. A entrada para diffdeve ser convertida em double, o que é feito pelo unário +.

Luis Mendo
fonte
4

Cubix, 37 32 31 29 28 bytes

Agradeço a ETHProductions por me apontar na direção de uma economia de três bytes

$uO@(;Usoi?-!w>;.....S_o\;#O

Experimente aqui ! Observe que os índices de saída são baseados em 1 e não em ordem crescente.

Expandido:

      $ u O
      @ ) ;
      U s o
i ? - ! w > ; . . . . .
S _ o \ ; # O . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

Explicação

Isso funciona lendo o caractere de entrada por caractere. Para comparar dois caracteres, simplesmente subtraímos seus códigos de caracteres e, se o resultado for 0, imprimimos o comprimento atual da pilha, um espaço, o comprimento atual da pilha - 1 e outro espaço. Depois limpamos um pouco a pilha e começamos novamente com o loop de leitura. Se o final da string de entrada for atingido, o programa será interrompido.

Luke
fonte
Hmm, se você conseguir manter a pilha razoavelmente limpa, poderá usar #para obter o comprimento da pilha quando precisar. (Também, LOL'ed no ;_;no código;))
ETHproductions
Um exemplo básico (provavelmente não totalmente jogado); ethproductions.github.io/cubix/… (Nota: está indexado 1, não indexado 0)
ETHproductions
Obrigado pela lembrança. Joguei um byte da sua versão e adicionei isso. Eu posso ser capaz de obter byte anoter ou dois ...
Luke
Ideia: o que se fez !$wem vez de !we mudou-se parte da quinta lógica linha para a quarta linha? (Não pode tentar agora porque eu estou indo para fora da porta)
ETHproductions
Também pensei nisso, mas não acho que ele economize muitos bytes. Eu vou tentar embora.
Luke
3

C, 75 bytes

i;f(char*s){for(i=0;*s;++s,++i)if(s[1]==*s|(i&&s[-1]==*s))printf("%d ",i);}

Usa espaços como delimitadores. (Uma vírgula à direita não parece muito boa.)

Experimente online!

Steadybox
fonte
3

C # , 115 bytes


Golfe

i=>{var o="";for(int x=1,l=i.Length;x<=l;x++)o+=(x<l&&i[x]==i[x-1])||(x>1&&i[x-1]==i[x-2])?(x-1)+" ":"";return o;};

Ungolfed

i => {
   var o = "";

   for( int x = 1, l = i.Length; x <= l; x++ )
      o += ( x < l && i[ x ] == i[ x - 1 ] ) || ( x > 1 && i[ x - 1 ] == i[ x - 2 ] )
         ? ( x - 1 ) + " "
         : "";

   return o;
};

Ungolfed legible

i => {
   // List of positions
   var o = "";

   // Cycle through the string
   for( int x = 1, l = i.Length; x <= l; x++ )
      // Check if 'x' is below the string length
      //    and if the current and previous char are the same...
      //    ... or if 'x' is beyong the string length
      //    and the 2 previous chars are the same.
      o += ( x < l && i[ x ] == i[ x - 1 ] ) || ( x > 1 && i[ x - 1 ] == i[ x - 2 ] )

         // If true, add the index to the list of positions...
         ? ( x - 1 ) + " "

         // ...otherwise add nothing
         : "";

   // Return the list of positions.
   return o;
};

Código completo

using System;
using System.Collections.Generic;

namespace Namespace {
   class Program {
      static void Main( String[] args ) {
         Func<String, String> f = i => {
            // List of positions
            var o = "";

            // Cycle through the string
            for( int x = 1, l = i.Length; x <= l; x++ )
               // Check if 'x' is below the string length
               //    and if the current and previous char are the same...
               //    ... or if 'x' is beyong the string length
               //    and the 2 previous chars are the same.
               o += ( x < l && i[ x ] == i[ x - 1 ] ) || ( x > 1 && i[ x - 1 ] == i[ x - 2 ] )

                  // If true, add the index to the list of positions...
                  ? ( x - 1 ) + " "

                  // ...otherwise add nothing
                  : "";

            // Return the list of positions.
            return o;
         };

         List<String>
            testCases = new List<String>() {
               "ABCDCABCD",
               "AABBCCDD",
               "ABCDDDCBA",
               "",
               "A",
               "AA",
               "AAA",
         };

         foreach( String testCase in testCases ) {
            Console.WriteLine( $"{testCase}\n{f( testCase )}\n" );
         }

         Console.ReadLine();
      }
   }
}

Lançamentos

  • v1.0 - 115 bytes- Solução inicial.

Notas

Nada para adicionar

auhmaan
fonte
2

Gelatina , 8 bytes

=2\T’œ|$

Experimente online!

Dennis
fonte
Hmm, exatamente o mesmo algoritmo que tentei, embora o meu fosse um pouco mais longo:Ṗ=ḊTµ2Ḷ+€
ETHproductions
2

k, 18 bytes

{?,/-1 0+/:&:=':x}

Exemplos:

k){?,/-1 0+/:&:=':x}"AABCDDDCBAA"
0 1 4 5 6 9 10
k){?,/-1 0+/:&:=':x}"ABCDCBA"
()

A tradução para qé mais fácil de entender:

{distinct raze -1 0+/:where not differ x}
skeevey
fonte
Esta foi a minha solução inicial também! : D
zgrep 13/04
2

JavaScript, 52 bytes

Obrigado @ Neil por jogar fora 1 byte

x=>x.map((a,i)=>a==x[++i-2]|a==x[i]&&i).filter(a=>a)

Recebe entrada como uma matriz indexada de 0 caracteres
Retorna a saída como uma matriz indexada 1

Explicação

x.map()

Para cada caractere na sequência

(a,i)=>(a==x[++i-2]|a==x[i])*i

Se for igual ao caractere anterior ou ao próximo caractere, retorne o índice + 1, caso contrário, não retorne (folhas indefinidas na matriz)

.filter(a=>a)

Remova todos os elementos indefinidos da matriz resultante

Experimente online!

fəˈnɛtɪk
fonte
Você &&isalvaria um byte (...)*i?
1111 Neil
@Neil && é mais rápido do que |, o que resultaria em que sempre retornando i
fənɛtɪk
0|0&&6é 0, 1|0&&6é 6, 0|1&&6é 6, 1|1&&6é 6. Não é isso que você quer?
1111 Neil
Eu acho que estava pensando que ainda tinha || em vez de |
fənɛtɪk
Ah sim, isso explicaria isso.
1111 Neil
2

Python 2, 55 54 bytes

m=j=0
for i in input():
 if m==i:print~-j,j,
 j+=1;m=i

Experimente Online!

Gera índices separados por espaços (observe que isso exibe alguns índices duas vezes o permitido pelo OP)

viciado em matemática
fonte
1

Perl 5 , 37 bytes

35 bytes de código + plsinalizadores.

s/(?<=(.))\1|(.)(?=\2)/print pos/ge

Experimente online!

(?<=(.))\1|(.)(?=\2)corresponderá entre dois caracteres repetidos ( (?<=(.))\1) ou antes de um caractere repetido ( (.)(?=\2)).
Em seguida, print posimprime a posição da partida. ( poscontém o índice da correspondência atual quando usado em uma regex com /gmodificador).

dada
fonte
1

Perl 6 ,  66  57 bytes

*.comb.rotor(2=>-1).kv.flatmap({($^a,$a+1)xx[eq] $^b[0,1]}).squish

Tente

{m:ex/[(.)<($0|(.))>$0]{make $/.from}/».ast.sort.squish}

Tente

Brad Gilbert b2gills
fonte
1

PHP, 100 bytes

for(;$i<strlen($s=$argn);$i++)$s[$i]==$s[$i+1]||$s[$i]==$s[$i-1]&&$i?$r[$i]=+$i:0;echo join(",",$r);
Jörg Hülsermann
fonte
1

Lote, 139 bytes

@set/ps=
@set/ai=c=0
:l
@if %s:~,1%==%s:~1,1% set c=2
@if %c% gtr 0 echo %i%
@set/ai+=1,c-=1
@if not "%s:~1%"=="" set s=%s:~1%&goto l

Recebe entrada em STDIN. Funciona acompanhando quantos números imprimir na cvariável, que é redefinida para 2 quando um par é detectado. Nota: A um custo de 6 bytes, pode ser reforçado para trabalhar com a maioria dos caracteres ASCII e não apenas ABCD.

Neil
fonte
1

C #, 89 bytes

using System.Linq;s=>string.Join("",s.Skip(1).Select((a,i)=>a==s[i]?i+" "+(i+1)+" ":""));

Se houver três ou mais caracteres seguidos, os índices serão repetidos. Que @Comrade SparklePony permitiu nos comentários.

Programa completo não destruído:

using System;
using System.Collections.Generic;
using System.Linq;

namespace Namespace
{
    class Class1
    {
        static void Main(string[] args)
        {
            Func<string, string> f2 =
                s => string.Join("" ,         //Combine the results into one string
                s.Skip(1)                     //Start with the second element
                .Select(
                    (a, i) =>                 // 'a' is the current element, 'i' is the index of the element in the result of 'Skip'
                    a == s[i] ?               // therefore 's[i]' is the previous element; compare it with the current one
                    i + " " + (i + 1) + " " : //If true, return the indexes
                    ""                        //Otherwise an empty string
                ));

            var tests = new string [] {
               "ABCDCABCD",
               "AABBCCDD",
               "ABCDDDCBA",
               "ABBCDD"
            };

            foreach (var test in tests)
            {
                Console.WriteLine(test);
                Console.WriteLine(string.Join("", f2(test)));
                Console.WriteLine();
            }

            Console.ReadLine();
        }
    }
}
raznagul
fonte
1

QBIC , 42 bytes

;[2,_lA||~mid$(A,a-1,1)=mid$(A,a,1)|?a-1,a

Saída de amostra:

Command line: AADCDBBD
 1             2 
 6             7 

Explicação:

;               Get A$ from the cmd line
[2,    |        FOR a% = 2 TO
   _lA|              the length of A$
~mid$(A,a-1,1)  IF the character at index a%
=mid$(A,a,1)    equals the char at index a%-1
|               THEN
?a-1,a          PRINT both indexes, tab-separated
                Any further doubles are printed on a separate line
                The IF and FOR are closed implicitly

EDIT: QBIC agora tem Substring! Este desafio agora pode ser resolvido em 32 bytes:

;[2,_lA||~_sA,a-1|=_sA,a||?a-1,a

Onde:

_s      This is the substring function; it takes 1, 2 or 3 arguments. 
        Arguments are comma-seperated, the list is delimited with |
        In this answer we see Substring take 2 arguments:
  A,    The string to take from
    a|  Starting position (note:uppercase represents strings, lowercase is for nums)
        Any omitted argument (in this case 'length to take') is set to 1.
steenbergh
fonte
0

k, 14 bytes

Esta é uma função, recebe uma sequência e retorna uma lista de índices.

&{x|1_x,0}@=':

Explicação:

           =': /compare each letter to the previous, return binary list
 {       }@    
    1_x,0      /shift left
  x|           /combine shifted and unshifted with binary or
&              /get indices of 1s

Experimente online!

Como usar:

&{x|1_x,0}@=':"STRINGGOESHERE"
zgrep
fonte
0

PHP, 70 bytes

for(;a&$c=$argn[$i];)$i++&&$argn[$i-2]==$c||$argn[$i]==$c?print$i._:0;

recebe entrada do STDIN; corra com -R.

Titus
fonte