Wo sind die benachbarten Zeichen im Titel? [3, 4]!

21

Titel absichtlich falsch geschrieben. Lesen Sie mehr, um herauszufinden, warum.

Ihre Aufgabe: Geben Sie bei einer durch Trennzeichen getrennten Zeichenfolge oder Liste mit den Zeichen A,B,C,Ddie Indizes aller benachbarten gleichen Zeichen aus. Die Ausgabe kann aus mehreren Zeichenfolgen / Ganzzahlen in mehreren Zeilen, einer Liste / einem Array oder einer durch Trennzeichen getrennten Zeichenfolge bestehen.

Alle Ausgaben sollten in einer Liste oder einer Zeichenfolge oder in mehreren gedruckten Zeilen erfolgen. Jede gedruckte Zeile sollte, falls mehrere vorhanden sind, nur eine Zeichenfolge oder Zahl enthalten. Schleppende Whatever sind in Ordnung.

Standardmethoden für die Eingabe / Ausgabe. Es gelten Standardlücken.

Beispielsweise sollte die Eingabe oder , abhängig davon, ob sie von 0 bis 1 indiziert ist, 'ABCDDCBA'ausgegeben werden , da diese Zahlen die Indizes von und daneben sind.3,44,5DD

Testfälle:

Bei Testfällen wird die Eingabe als einzelne Zeichenfolge und die Ausgabe als durch ,-begrenzte Zeichenfolge angegeben. Die Ausgaben sind 0-indiziert. Addieren Sie 1 zu jedem ausgegebenen Element, um es 1-indiziert zu bekommen.

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'

Das ist , also gewinnt der kürzeste Code!

Genosse SparklePony
quelle
Können wir einen nachgestellten Begrenzer in der Ausgabe haben?
Business Cat
@BasicSunset Sicher
Genosse SparklePony
1
@ JonathanAllan Das ist in Ordnung, weil es nur eine Liste ausgibt.
Genosse SparklePony
2
Können Indizes aufeinanderfolgender Zeichen mehrfach vorkommen? Ist zB für den dritten Testfall auch 3,4,4,5gültig?
Luke
1
Können Sie einen Testfall hinzufügen, der keine symmetrischen Übereinstimmungen aufweist? ZBAABBCD -> 1,2,3,4
Riley

Antworten:

5

MATL , 8 7 Bytes

d~ftQvu

Die Ausgabe ist 1-basiert.

Probieren Sie es online!

Erklärung mit Beispiel

Betrachten Sie die Eingabe '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
quelle
8

Retina , 33 29 23 Bytes

6 Bytes gespart dank Martin Ender

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

Gibt eine durch Zeilenvorschub getrennte Liste von Indizes aus.

Probieren Sie es online!

Erläuterung

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

Läuft dasselbe Zeichen in Doppelpunkte um, um Positionen zu markieren, an denen es doppelte Zeichen gibt.

:
$.`¶

Ersetzen Sie dann jeden Doppelpunkt durch die Länge des Texts davor, gefolgt von einem Zeilenvorschub.

T`L

Löschen Sie abschließend alle verbleibenden Buchstaben.

Geschäfts-Katze
quelle
7

Gelee , 7 Bytes

JṁŒgḊÐf

1-basiert; Gibt eine Liste mit Listen der Indexläufe zurück , die vom OP zugelassen wurden.

Probieren Sie es online!

Wie?

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
quelle
2
- Dinge, die 05AB1E für 500 machen könnte, bitte.
Magic Octopus Urn
1
Ich habe immer mehr das Gefühl, dass diese Sprache hier irgendwie wie Schummeln ist. : D
Avamander
@ComradeSparklePony warum die Annahmeprüfung rückgängig machen?
Jonathan Allan
7

Brain-Flak , 57 46 Bytes

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

Beinhaltet +2 für -ar

Verwendet eine 0-basierte Indizierung.

Probieren Sie es 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
quelle
6

Mathematica, 32 Bytes

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

Reine Funktion, die die 1-indizierten Positionen von Zeichen neben einem identischen Zeichen zurückgibt.

Erläuterung:

StringPosition["string","sub"]Gibt eine Liste der Anfangs- und Endpositionen der Zeichen an, die "sub"als Teilzeichenfolge von angezeigt werden "string". x_~~x_ist ein, StringExpressiondas zwei benachbarte, identische Zeichen entspricht. Zum Beispiel StringPosition["ABCDDDCBA",x_~~x_]gibt {{4, 5}, {5, 6}}. Durch Uniondas Anwenden werden die Listen verknüpft, sortiert und Duplikate gelöscht.

Genisis
quelle
5

Brain-Flak , 69, 59 , 56 Bytes

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

Probieren Sie es online!

+2 Byte für die -arFlags, die die ASCII-Eingabe ermöglichen und den Stack umkehren.

Verwendet eine 0-basierte Indizierung. Sparte 10 Bytes durch Reduzierung meiner Push-Pop-Redundanz . Sparte weitere 4 Bytes durch Umschalten von 1 auf 0-basierte Indizierung.

Dies ist so ziemlich die einzige auf Saiten basierende Herausforderung, in der Brain Flak gut ist. Das liegt daran, dass Brain-Flak beim Vergleichen aufeinanderfolgender Zeichen großartig ist, auch wenn es bei der Verarbeitung von Zeichenfolgen im Allgemeinen schrecklich ist. Hier ist eine lesbare Version des Codes mit Kommentaren, die erklären, wie es funktioniert:

#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
quelle
@ Riley behoben! (Und noch ein Byte kürzer: P)
DJMcMayhem
Ich vergesse immer -r. Das bringt mich auf 46.
Riley
5

Brachylog , 19 Bytes

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

Probieren Sie es online!

Erläuterung

Brachylog ist in der Regel schrecklich mit Indizes, die hier wieder zeigt.

Wenn false.eine akzeptable Ausgabe in Fällen vorliegt, in denen keine benachbarten Zeichen vorhanden sind, ist dies 1 Byte weniger, wenn durch ersetzt ᶠdwird .

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
Tödlich
quelle
4

Oktave , 35 Bytes

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

Probieren Sie es online!

Ähnlich wie meine MATL-Antwort . Hier wird uniqueautomatisch sortiert. Die Eingabe in diffmuss konvertiert werden double, was vom Unären erledigt wird +.

Luis Mendo
quelle
4

Cubix, 37 32 31 29 28 Bytes

Vielen Dank an ETHProductions für den Hinweis auf eine Drei-Byte-Speicherung

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

Probieren Sie es hier aus ! Beachten Sie, dass die Ausgabeindizes auf 1 basieren und nicht in aufsteigender Reihenfolge.

Erweitert:

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

Erläuterung

Dies funktioniert, indem die Eingabe zeichenweise gelesen wird. Um zwei Zeichen zu vergleichen, subtrahieren wir einfach ihre Zeichencodes. Wenn das Ergebnis 0 ist, drucken wir die aktuelle Länge des Stapels, ein Leerzeichen, die aktuelle Länge des Stapels - 1 und ein weiteres Leerzeichen. Dann räumen wir den Stack ein wenig auf und beginnen wieder mit der Leseschleife. Wenn das Ende der Eingabezeichenfolge erreicht ist, stoppt das Programm.

Luke
quelle
Hmm, wenn Sie den Stapel ziemlich sauber halten können, können Sie ihn möglicherweise verwenden #, um die Länge des Stapels zu ermitteln, wenn Sie ihn benötigen. (LOL'ed auch am ;_;im Code;))
ETHproductions
Ein einfaches Beispiel (wahrscheinlich nicht vollständig golfen); ethproductions.github.io/cubix/… (Hinweis: Es ist 1-indiziert, nicht 0-indiziert)
ETHproductions
Danke für die Erinnerung. Ich habe ein Byte Ihrer Version golfen und das hinzugefügt. Ich könnte in der Lage sein, ein oder zwei weitere Bytes zu verlieren ...
Luke
Idee: Was , wenn Sie tat !$wstatt !wund ist Teil der fünften Reihe Logik der vierten Reihe bewegt? (Ich kann es jetzt nicht versuchen, weil ich aus der Tür
gehe
Ich habe auch darüber nachgedacht, aber ich glaube nicht, dass dadurch viele Bytes gespart werden. Ich werde es aber versuchen.
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);}

Verwendet Leerzeichen als Begrenzer. (Ein nachgestelltes Komma sieht nicht gut aus.)

Probieren Sie es online!

Steadybox
quelle
3

C # , 115 Bytes


Golf gespielt

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 lesbar

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

Vollständiger Code

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

Releases

  • v1.0 - 115 bytes- Anfangslösung.

Anmerkungen

Nichts hinzuzufügen

auhmaan
quelle
2

Gelee , 8 Bytes

=2\T’œ|$

Probieren Sie es online!

Dennis
quelle
Hmm, genau der Algorithmus, den ich ausprobiert habe, obwohl meiner etwas länger war:Ṗ=ḊTµ2Ḷ+€
ETHproductions
2

k, 18 Bytes

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

Beispiele:

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

Die Übersetzung nach qist leichter zu verstehen:

{distinct raze -1 0+/:where not differ x}
Skeevey
quelle
Dies war auch meine ursprüngliche Lösung! : D
zgrep
2

JavaScript, 52 Byte

Vielen Dank, @Neil, für das Abschlagen von 1 Byte

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

Empfängt Eingaben als ein 0-indiziertes Array von Zeichen.
Gibt Ausgaben als ein 1-indiziertes Array zurück

Erläuterung

x.map()

Für jedes Zeichen in der Zeichenfolge

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

Wenn es gleich dem vorherigen Zeichen oder dem nächsten Zeichen ist, geben Sie den Index + 1 zurück, andernfalls geben Sie nicht zurück (lässt undefiniert im Array)

.filter(a=>a)

Entfernen Sie alle undefinierten Elemente aus dem resultierenden Array

Probieren Sie es online!

fəˈnəˈtɛk
quelle
Würde &&iein Byte vorbei speichern (...)*i?
Neil
@Neil && ist schneller als |, was dazu führen würde, dass i
fəˈnəˈtɛk am
0|0&&6ist 0, 1|0&&6ist 6, 0|1&&6ist 6, 1|1&&6ist 6. Ist das nicht was Sie wollen?
Neil
Ich denke, ich dachte, ich hätte noch || anstelle von |
f 11nəˈtɪk
Ah ja, das würde es erklären.
Neil
2

Python 2, 55 54 Bytes

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

Probieren Sie es online!

Gibt durch Leerzeichen getrennte Indizes aus (beachte, dass dies einige Indizes doppelt anzeigt, wie dies durch OP erlaubt ist)

Mathe-Junkie
quelle
1

Perl 5 , 37 Bytes

35 Byte Code + plFlags.

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

Probieren Sie es online!

(?<=(.))\1|(.)(?=\2)Entspricht entweder zwei wiederholten Zeichen ( (?<=(.))\1) oder einem Zeichen, das wiederholt wird ( (.)(?=\2)).
Dann print posdruckt die Position des Spiels. ( posEnthält den Index der aktuellen Übereinstimmung bei Verwendung in einem regulären Ausdruck mit /gModifikator).

Dada
quelle
1

Perl 6 ,  66  57 Bytes

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

Versuch es

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

Versuch es

Brad Gilbert b2gills
quelle
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
quelle
1

Batch, 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

Übernimmt die Eingabe für STDIN. Verfolgt, wie viele Zahlen in der cVariablen gedruckt werden sollen. Diese Zahl wird auf 2 zurückgesetzt, wenn ein Paar erkannt wird. Hinweis: Bei einem Aufwand von 6 Bytes kann die Kompatibilität mit den meisten ASCII-Zeichen und nicht nur mit diesen verstärkt werden ABCD.

Neil
quelle
1

89 Bytes

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

Befinden sich drei oder mehr Zeichen in einer Zeile, werden die Indizes wiederholt. Welches @Comrade SparklePony in den Kommentaren erlaubt ist.

Ungolfed volles Programm:

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

QBIC , 42 Bytes

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

Beispielausgabe:

Command line: AADCDBBD
 1             2 
 6             7 

Erläuterung:

;               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 hat jetzt Substring! Diese Herausforderung kann jetzt in 32 Bytes gelöst werden:

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

Woher:

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

k, 14 Bytes

Dies ist eine Funktion, die eine Zeichenfolge akzeptiert und eine Liste von Indizes zurückgibt.

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

Erläuterung:

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

Probieren Sie es online!

Wie benutzt man:

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

PHP, 70 Bytes

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

nimmt Eingaben von STDIN entgegen; renn mit -R.

Titus
quelle