Gdzie są sąsiednie postacie w tytule? [3, 4]!

21

Celowo napisany tytuł. Przeczytaj więcej, aby dowiedzieć się, dlaczego.

Twoje zadanie: mając ograniczony ciąg lub listę zawierającą znaki A,B,C,D, wypisz indeksy wszystkich sąsiednich równych znaków. Dane wyjściowe mogą być wieloma ciągami / liczbami całkowitymi w wielu wierszach, listą / tablicą lub ciągiem rozdzielanym.

Wszystkie dane wyjściowe powinny być w postaci listy lub łańcucha lub wielu drukowanych linii. Każda drukowana linia, jeśli jest wiele, powinna zawierać tylko 1 ciąg lub liczbę. Końcowi wielorybnicy są w porządku.

Standardowe metody wejścia / wyjścia. Obowiązują standardowe luki.

Na przykład dane wejściowe 'ABCDDCBA'powinny być wyprowadzane 3,4lub 4,5, w zależności od tego, czy są indeksowane od 0 do 1, ponieważ te liczby są indeksami Di Dobok niego.

Przypadki testowe:

Przypadki testowe mają dane wejściowe podane jako pojedynczy ciąg, a dane wyjściowe jako ,ciąg -delimitowany. Wyjścia są indeksowane 0, dodaj 1 do każdego wyprowadzanego elementu, aby uzyskać indeks 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'

To jest , więc wygrywa najkrótszy kod!

Towarzyszu SparklePony
źródło
Czy możemy mieć końcowy ogranicznik w danych wyjściowych?
Biznesowy kot
@BasicSunset Sure
Towarzysz SparklePony
1
@JonathanAllan W porządku, ponieważ wyświetla tylko jedną listę.
Towarzysz SparklePony,
2
Czy indeksy kolejnych znaków mogą pojawiać się wiele razy? Np. W przypadku trzeciego przypadku testowego również jest 3,4,4,5ważny?
Łukasz
1
Czy możesz dodać przypadek testowy, który nie ma dopasowań symetrycznych? Np.AABBCD -> 1,2,3,4
Riley

Odpowiedzi:

5

MATL , 8 7 bajtów

d~ftQvu

Wyjście jest oparte na 1.

Wypróbuj online!

Objaśnienie z przykładem

Rozważ wejście '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
źródło
8

Retina , 33 29 23 bajtów

Zaoszczędzono 6 bajtów dzięki Martinowi Enderowi

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

Generuje listę indeksów oddzieloną od linii.

Wypróbuj online!

Wyjaśnienie

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

Transliteruj przebiegi tego samego znaku na dwukropki, aby zaznaczyć pozycje, w których występują zduplikowane znaki.

:
$.`¶

Następnie zamień każdy dwukropek na długość tekstu przed nim, a następnie wstaw wiersz.

T`L

Na koniec usuń wszystkie pozostałe litery.

Business Cat
źródło
7

Galaretka , 7 bajtów

JṁŒgḊÐf

Na podstawie 1; zwraca listę list przebiegów indeksów dozwolonych przez PO.

Wypróbuj online!

W jaki sposób?

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
źródło
2
- Chciałbym, żeby 05AB1E mógł zrobić za 500.
Magic Octopus Urn
1
Coraz bardziej wydaje mi się, że ten język jest jak oszustwo. : D
Avamander
@ComradeSparklePony dlaczego cofnąć czek akceptacji?
Jonathan Allan
7

Brain-Flak , 57 46 bajtów

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

Obejmuje +2 za -ar

Wykorzystuje indeksowanie 0.

Wypróbuj 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
źródło
6

Mathematica, 32 bajty

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

Czysta funkcja, która zwraca 1-indeksowane pozycje znaków sąsiadujących z identycznym znakiem.

Wyjaśnienie:

StringPosition["string","sub"]podaje listę początkowych i końcowych pozycji znaków, w których "sub"pojawia się jako podłańcuch "string". x_~~x_to StringExpressionpasujący do dwóch sąsiadujących, identycznych znaków. Na przykład StringPosition["ABCDDDCBA",x_~~x_]daje {{4, 5}, {5, 6}}. Zastosowanie Unionłączy listy, sortuje i usuwa duplikaty.

ngenisis
źródło
5

Brain-Flak , 69, 59 , 56 bajtów

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

Wypróbuj online!

+2 bajty dla -arflag, które umożliwiają wejście ASCII i odwracają stos.

Wykorzystuje indeksowanie 0. Zaoszczędziłem 10 bajtów, zmniejszając moją redundancję push-pop . Zapisano kolejne 4 bajty, zmieniając indeksowanie z 1 na 0.

Jest to właściwie jedyne wyzwanie oparte na strunach, w którym dobrze sprawdza się atak mózgu. Wynika to z tego, że flakowanie mózgu świetnie sprawdza się w porównywaniu kolejnych znaków, mimo że ogólnie przerażające jest przetwarzanie ciągów znaków. Oto czytelna wersja kodu z komentarzami wyjaśniającymi, jak to działa:

#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
źródło
@riley naprawione! (I jeszcze jeden bajt krótszy: P)
DJMcMayhem
Zawsze o tym zapominam -r. To sprowadza mnie do 46.
Riley
5

Brachylog , 19 bajtów

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

Wypróbuj online!

Wyjaśnienie

Brachylog jest zwykle okropny z indeksami, co znowu pokazuje tutaj.

Jeśli false.jest to akceptowalny wynik w przypadkach, gdy nie ma sąsiednich znaków, to byłby 1 bajt mniej przez zastąpienie ᶠdprzez .

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
Fatalizować
źródło
4

Oktawa , 35 bajtów

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

Wypróbuj online!

Podobnie do mojej odpowiedzi MATL . Tutaj uniqueautomatycznie sortuje. Dane wejściowe diffmuszą zostać przekonwertowane doublena jednoargumentowe +.

Luis Mendo
źródło
4

Cubix, 37 32 31 29 28 bajtów

Dzięki ETHProductions za skierowanie mnie w stronę trzy bajtowego oszczędzania

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

Wypróbuj tutaj ! Zauważ, że wskaźniki wyjściowe są oparte na 1 i nie w porządku rosnącym.

Rozszerzony:

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

Wyjaśnienie

Działa to poprzez czytanie wprowadzanego znaku po znaku. Aby porównać dwa znaki, po prostu odejmujemy ich kody znaków, a jeśli wynikiem jest 0, drukujemy bieżącą długość stosu, spację, bieżącą długość stosu - 1 i inną spację. Następnie trochę oczyszczamy stos i zaczynamy od pętli odczytu. Po osiągnięciu końca ciągu wejściowego program zatrzymuje się.

Luke
źródło
Hmm, jeśli możesz utrzymać stos w miarę czysty, możesz użyć go, #aby uzyskać długość stosu, gdy go potrzebujesz. (Również LOL napisano ;_;w kodzie;))
ETHprodukcje
Podstawowy przykład (prawdopodobnie nie w pełni golfowy); ethproductions.github.io/cubix/… (Uwaga: jest indeksowany 1, a nie indeksowany 0)
ETHprodukcje
Dzięki za przypomnienie. Dodałem do gry jeden bajt twojej wersji. Może uda mi się uzyskać jeszcze jeden bajt lub dwa ...
Luke
Pomysł: co jeśli zrobiłbyś !$wzamiast !wi przeniosłeś część logiki piątego rzędu do czwartego rzędu? (Nie mogę teraz spróbować, bo wychodzę za drzwi)
ETHprodukcje
Też o tym myślałem, ale nie sądzę, aby zaoszczędził wiele bajtów. Spróbuję jednak.
Łukasza
3

C, 75 bajtów

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

Używa spacji jako ograniczników. (Przecinek końcowy nie wygląda zbyt dobrze.)

Wypróbuj online!

Steadybox
źródło
3

C # , 115 bajtów


Grał w golfa

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

Nie golfił

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

Nieczytelny czytelny

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

Pełny kod

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

Prasowe

  • v1.0 - 115 bytes- Wstępne rozwiązanie.

Notatki

Nic do dodania

auhmaan
źródło
2

Galaretka , 8 bajtów

=2\T’œ|$

Wypróbuj online!

Dennis
źródło
Hmm, dokładnie ten sam algorytm, którego wypróbowałem, chociaż mój był nieco dłuższy:Ṗ=ḊTµ2Ḷ+€
ETHprodukcje
2

k, 18 bajtów

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

Przykłady:

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

Tłumaczenie na qłatwiejsze do zrozumienia:

{distinct raze -1 0+/:where not differ x}
skeevey
źródło
To też było moje początkowe rozwiązanie! : D
zgrep
2

JavaScript, 52 bajty

Dzięki @Neil za grę w golfa z 1 bajtu

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

Odbiera dane wejściowe jako tablicę znaków o indeksie 0
Zwraca dane wyjściowe jako tablicę o indeksie 1

Wyjaśnienie

x.map()

Dla każdego znaku w ciągu

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

Jeśli jest równy poprzedniemu lub następnemu znakowi, zwróć indeks + 1, w przeciwnym razie nie zwróci (pozostawia niezdefiniowane w tablicy)

.filter(a=>a)

Usuń wszystkie niezdefiniowane elementy z wynikowej tablicy

Wypróbuj online!

Fəˈnɛtɪk
źródło
Czy &&izaoszczędziłby bajt (...)*i?
Neil
@Neil && jest szybszy niż |, co spowodowałoby, że zawsze
zwracał
0|0&&6jest 0, 1|0&&6jest 6, 0|1&&6jest 6, 1|1&&6ma 6. Czy nie tego chcesz?
Neil
Myślę, że myślałem, że nadal mam || zamiast |
fəˈnɛtɪk
Ach tak, to by wyjaśniało.
Neil
2

Python 2, 55 54 bajtów

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

Wypróbuj online!

Generuje wskaźniki oddzielone spacjami (zwróć uwagę, że wyświetla niektóre wskaźniki dwa razy, jak pozwala OP)

ćpun matematyki
źródło
1

Perl 5 , 37 bajtów

35 bajtów kodu + plflagi.

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

Wypróbuj online!

(?<=(.))\1|(.)(?=\2)dopasuje albo pomiędzy dwoma powtórzonymi znakami ( (?<=(.))\1), albo przed znakiem, który jest powtarzany ( (.)(?=\2)).
Następnie print posdrukuje pozycję dopasowania. ( poszawiera indeks bieżącego dopasowania, gdy jest używany w wyrażeniu regularnym z /gmodyfikatorem).

Dada
źródło
1

Perl 6 ,  66  57 bajtów

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

Spróbuj

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

Spróbuj

Brad Gilbert b2gills
źródło
1

PHP, 100 bajtów

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
źródło
1

Partia, 139 bajtów

@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

Pobiera dane wejściowe na STDIN. Działa poprzez śledzenie liczby liczb do wydrukowania w czmiennej, która jest resetowana do 2 po wykryciu pary. Uwaga: Kosztem 6 bajtów może być zahartowany do pracy z większością znaków ASCII i nie tylko ABCD.

Neil
źródło
1

C #, 89 bajtów

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

Jeśli są trzy lub więcej znaków z rzędu, indeksy są powtarzane. Które @Comrade SparklePony dozwolone w komentarzach.

Pełny program bez golfa:

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
źródło
1

QBIC , 42 bajty

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

Przykładowe dane wyjściowe:

Command line: AADCDBBD
 1             2 
 6             7 

Wyjaśnienie:

;               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

EDYCJA: QBIC ma teraz Substring! To wyzwanie można teraz rozwiązać w 32 bajtach:

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

Gdzie:

_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
źródło
0

k, 14 bajtów

Jest to funkcja, pobiera ciąg znaków i zwraca listę indeksów.

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

Wyjaśnienie:

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

Wypróbuj online!

Jak używać:

&{x|1_x,0}@=':"STRINGGOESHERE"
zgrep
źródło
0

PHP, 70 bajtów

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

pobiera dane wejściowe ze STDIN; biegać z -R.

Tytus
źródło