¿Dónde están los personajes adyacentes en el título? [3, 4]!

21

Título mal escrito a propósito. Lea más para descubrir por qué.

Su tarea: dada una cadena o lista delimitada que incluye los caracteres A,B,C,D, genera los índices de todos los caracteres iguales adyacentes. La salida puede ser múltiples cadenas / enteros en varias líneas, una lista / matriz o una cadena delimitada.

Todos los resultados deben estar en una lista o cadena, o en varias líneas impresas. Cada línea impresa, si hay varias, solo debe contener 1 cadena o número. Todo lo que sigue está bien.

Métodos estándar de entrada / salida. Se aplican lagunas estándar.

Por ejemplo, la entrada 'ABCDDCBA'debe salir 3,4o 4,5, dependiendo de si está indexada de 0 a 1, porque esos números son los índices de Dy los Dsiguientes.

Casos de prueba:

Los casos de prueba tienen entrada dada como una sola cadena, y salida como una ,cadena delimitada. Las salidas están indexadas en 0, agregue 1 a cada elemento de salida para que se indexe en 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'

Este es el , ¡el código más corto gana!

Camarada SparklePony
fuente
¿Podemos tener un delimitador final en la salida?
Business Cat
@BasicSunset Sure
Comrade SparklePony
1
@JonathanAllan Eso está bien porque solo genera una lista.
Camarada SparklePony
2
¿Pueden aparecer índices de caracteres consecutivos varias veces? Por ejemplo, para el tercer caso de prueba, ¿es 3,4,4,5válido también?
Lucas
1
¿Puedes agregar un caso de prueba que no tenga coincidencias simétricas? Por ejemploAABBCD -> 1,2,3,4
Riley

Respuestas:

5

MATL , 8 7 bytes

d~ftQvu

La salida está basada en 1.

Pruébalo en línea!

Explicación con ejemplo

Considere la 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
fuente
8

Retina , 33 29 23 bytes

Guardado 6 bytes gracias a Martin Ender

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

Emite una lista de índices separados por salto de línea.

Pruébalo en línea!

Explicación

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

Translitera las corridas del mismo personaje en dos puntos, para marcar las posiciones donde hay caracteres duplicados.

:
$.`¶

Luego, reemplace cada dos puntos con la longitud del texto anterior, seguido de un salto de línea.

T`L

Finalmente, elimine las letras restantes.

Gato de negocios
fuente
7

Jalea , 7 bytes

JṁŒgḊÐf

Basado en 1; devuelve una lista de listas de las ejecuciones de índices según lo permitido por el OP.

Pruébalo en línea!

¿Cómo?

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
fuente
2
- Cosas que deseo que 05AB1E pueda hacer por 500, por favor.
Urna mágica del pulpo
1
Siento cada vez más que este lenguaje es como hacer trampa aquí. : D
Avamander
@ComradeSparklePony ¿por qué deshacer el cheque de aceptación?
Jonathan Allan
7

Brain-Flak , 57 46 bytes

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

Incluye +2 para -ar

Utiliza indexación basada en 0.

Pruébalo en línea!

# 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
fuente
6

Mathematica, 32 bytes

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

Función pura que devuelve las posiciones indexadas en 1 de los caracteres adyacentes a un carácter idéntico.

Explicación:

StringPosition["string","sub"]proporciona una lista de las posiciones de los caracteres iniciales y finales en las que "sub"aparece como una subcadena de "string". x_~~x_es un StringExpressionque coincide con dos caracteres adyacentes idénticos. Por ejemplo, StringPosition["ABCDDDCBA",x_~~x_]da {{4, 5}, {5, 6}}. La aplicación se Unionune a las listas, ordena y elimina duplicados.

ngenisis
fuente
5

Brain-Flak , 69, 59 , 56 bytes

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

Pruébalo en línea!

+2 bytes para las -arbanderas que permiten la entrada ASCII e invierten la pila.

Utiliza indexación basada en 0. Ahorré 10 bytes al reducir mi redundancia push-pop . Ahorró otros 4 bytes al cambiar de indexación basada en 1 a 0.

Este es prácticamente el único desafío basado en cadenas en el que Brain-Flak es bueno. Esto se debe a que Brain-Flak es excelente para comparar caracteres consecutivos, a pesar de que es horrible en el procesamiento de cadenas en general. Aquí hay una versión legible del código con comentarios para explicar cómo 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
fuente
@riley arreglado! (Y todavía un byte más corto: P)
DJMcMayhem
Siempre olvido -r. Eso me lleva a 46.
Riley
5

Brachylog , 19 bytes

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

Pruébalo en línea!

Explicación

Brachylog suele ser terrible con los índices, que nuevamente se muestra aquí.

Si false.es un resultado aceptable en los casos en que no hay caracteres adyacentes, entonces sería 1 byte menos reemplazándolo ᶠ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
fuente
4

Octava , 35 bytes

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

Pruébalo en línea!

Similar a mi respuesta MATL . Aquí uniquese ordena automáticamente. La entrada a se diffdebe convertir a double, lo que realiza el unario +.

Luis Mendo
fuente
4

Cubix, 37 32 31 29 28 bytes

Gracias a ETHProductions por guiarme en la dirección de un ahorro de tres bytes

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

Pruébalo aquí ! Tenga en cuenta que los índices de salida están basados ​​en 1 y no en orden ascendente.

Expandido:

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

Explicación

Esto funciona leyendo la entrada carácter por carácter. Para comparar dos caracteres, simplemente restamos sus códigos de caracteres, y si el resultado es 0, imprimimos la longitud actual de la pila, un espacio, la longitud actual de la pila - 1 y otro espacio. Luego limpiamos un poco la pila y comenzamos con el ciclo de lectura nuevamente. Si se alcanza el final de la cadena de entrada, el programa se detiene.

Luke
fuente
Hmm, si puedes mantener la pila bastante limpia, puedes usarla #para obtener la longitud de la pila cuando la necesites. (Además, LOL'ed en el ;_;en el código;))
ETHproductions
Un ejemplo básico (probablemente no totalmente golfizado); ethproductions.github.io/cubix/… (Nota: está indexado 1, no indexado 0)
ETHproductions
Gracias por el recordatorio. Golfé un byte de su versión y agregué eso. Podría ser capaz de obtener otro byte o dos de otro ...
Lucas
Idea: ¿qué pasa si lo hiciste en !$wlugar de !wy moviste parte de la lógica de la quinta fila a la cuarta fila? (No puedo intentarlo ahora porque salgo por la puerta)
ETHproductions
También pensé en eso, pero no creo que ahorre muchos bytes. Aunque lo intentaré.
Lucas
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);}

Utiliza espacios como delimitadores. (Una coma final no se ve muy bien).

Pruébalo en línea!

Steadybox
fuente
3

C # , 115 bytes


Golfed

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

Sin golf

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

Legible sin golf

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

Lanzamientos

  • v1.0 - 115 bytes- Solución inicial.

Notas

Nada que añadir

auhmaan
fuente
2

Jalea , 8 bytes

=2\T’œ|$

Pruébalo en línea!

Dennis
fuente
Hmm, exactamente el mismo algoritmo que probé, aunque el mío fue un poco más largo:Ṗ=ḊTµ2Ḷ+€
ETHproductions
2

k, 18 bytes

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

Ejemplos:

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

La traducción a qes más fácil de entender:

{distinct raze -1 0+/:where not differ x}
skeevey
fuente
¡Esta fue mi solución inicial también! : D
zgrep
2

JavaScript, 52 bytes

Gracias @Neil por jugar golf en 1 byte

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

Recibe la entrada como una matriz de caracteres indexados a 0
Devuelve la salida como una matriz indexada a 1

Explicación

x.map()

Para cada caracter en la cadena

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

Si es igual al carácter anterior o al siguiente, devuelva el índice + 1; de lo contrario, no regrese (se deja sin definir en la matriz)

.filter(a=>a)

Eliminar todos los elementos indefinidos de la matriz resultante

Pruébalo en línea!

fəˈnɛtɪk
fuente
¿ &&iAhorraría un byte (...)*i?
Neil
@Neil && es más rápido que |, lo que resultaría en que siempre regrese i
fəˈnɛtɪk
0|0&&6es 0, 1|0&&6es 6, 0|1&&6es 6,1|1&&6 es 6. ¿No es eso lo que quieres?
Neil
Creo que estaba pensando que todavía tenía || en lugar de |
fəˈnɛtɪk
Ah sí, eso lo explicaría.
Neil
2

Python 2, 55 54 bytes

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

Pruébalo en línea!

Emite índices separados por espacios (tenga en cuenta que esto muestra algunos índices el doble de lo permitido por OP)

adicto a las matemáticas
fuente
1

Perl 5 , 37 bytes

35 bytes de código + plbanderas.

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

Pruébalo en línea!

(?<=(.))\1|(.)(?=\2)coincidirá entre dos caracteres repetidos ( (?<=(.))\1) o antes de un carácter que se repite ( (.)(?=\2)).
Luego, print posimprime la posición del partido. ( poscontiene el índice de la coincidencia actual cuando se usa en una expresión regular con /gmodificador).

Dada
fuente
1

Perl 6 ,  66  57 bytes

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

Intentalo

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

Intentalo

Brad Gilbert b2gills
fuente
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
fuente
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

Toma entrada en STDIN. Funciona haciendo un seguimiento de cuántos números imprimir en la cvariable, que se restablece a 2 cuando se detecta un par. Nota: Con un costo de 6 bytes, podría endurecerse para trabajar con la mayoría de los caracteres ASCII y no solo ABCD.

Neil
fuente
1

C #, 89 bytes

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

Si hay tres o más caracteres seguidos, los índices se repiten. Que @Comrade SparklePony permitió en los comentarios.

Programa completo sin golf:

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
fuente
1

QBIC , 42 bytes

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

Salida de muestra:

Command line: AADCDBBD
 1             2 
 6             7 

Explicación:

;               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

EDITAR: ¡QBIC ahora tiene una subcadena! Este desafío ahora se puede resolver en 32 bytes:

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

Dónde:

_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
fuente
0

k, 14 bytes

Esta es una función, toma una cadena y devuelve una lista de índices.

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

Explicación:

           =': /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

Pruébalo en línea!

Cómo utilizar:

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

PHP, 70 bytes

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

toma entrada de STDIN; correr con -R.

Tito
fuente