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!


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]

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.


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]     ]        

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

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.


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


@ 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


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.


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!


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



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}

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!


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)


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



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


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.


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

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.

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"

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.