Où sont les personnages adjacents dans le titre? [3, 4]!


21

Titre mal orthographié exprès. Lisez la suite pour savoir pourquoi.

Votre tâche: étant donné une chaîne ou une liste délimitée comprenant les caractères A,B,C,D, affichez les index de tous les caractères égaux adjacents. La sortie peut être plusieurs chaînes / entiers sur plusieurs lignes, une liste / tableau ou une chaîne délimitée.

Toutes les sorties doivent être dans une liste ou une chaîne, ou plusieurs lignes imprimées. Chaque ligne imprimée, s'il y en a plusieurs, ne doit contenir qu'une chaîne ou un nombre. Les whatevers de fuite sont corrects.

Méthodes standard d'entrée / sortie. Des échappatoires standard s'appliquent.

Par exemple, l'entrée 'ABCDDCBA'doit sortir 3,4ou 4,5, selon qu'elle est indexée de 0 à 1, car ces nombres sont les index de Det à Dcôté.

Cas de test:

Les cas de test ont une entrée donnée sous forme de chaîne unique et une sortie sous ,forme de chaîne délimitée. Les sorties sont indexées 0, ajoutez 1 à chaque élément sorti pour qu'il soit indexé 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'

C'est le , donc le code le plus court gagne!


Pouvons-nous avoir un délimiteur de fin dans la sortie?
Business Cat

@BasicSunset Sure
Camarade SparklePony

1
@JonathanAllan C'est correct car il ne génère qu'une seule liste.
Camarade SparklePony

2
Les indices de caractères consécutifs peuvent-ils apparaître plusieurs fois? Par exemple, pour le troisième cas de test, est-ce également 3,4,4,5valable?
Luke

1
Pouvez-vous ajouter un cas de test qui n'a pas de correspondances symétriques? Par exempleAABBCD -> 1,2,3,4
Riley

Réponses:


5

MATL , 8 7 octets

d~ftQvu

La sortie est basée sur 1.

Essayez-le en ligne!

Explication avec exemple

Tenez compte des commentaires '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

Rétine , 33 29 23 octets

6 octets enregistrés grâce à Martin Ender

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

Génère une liste d'index séparés par un saut de ligne.

Essayez-le en ligne!

Explication

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

Translittérer les passages du même caractère en deux points, pour marquer les positions où il y a des caractères en double.

:
$.`¶

Remplacez ensuite chaque deux-points par la longueur du texte qui le précède, suivi d'un saut de ligne.

T`L

Enfin, supprimez toutes les lettres restantes.


7

Gelée , 7 octets

JṁŒgḊÐf

1 base; renvoie une liste de listes des exécutions d'index autorisées par l'OP.

Essayez-le en ligne!

Comment?

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
- Ce que je souhaite que 05AB1E puisse faire pour 500, s'il vous plaît.
Urne de poulpe magique

1
Je sens de plus en plus que cette langue est un peu comme tricher ici. : D
Avamander

@ComradeSparklePony pourquoi l'annulation du chèque d'acceptation?
Jonathan Allan

7

Brain-Flak , 57 46 octets

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

Comprend +2 pour -ar

Utilise l'indexation basée sur 0.

Essayez-le en ligne!

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

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

Fonction pure qui renvoie les positions indexées 1 des caractères adjacents à un caractère identique.

Explication:

StringPosition["string","sub"]donne une liste des positions de caractères de début et de fin auxquelles "sub"apparaît une sous-chaîne de "string". x_~~x_est un StringExpressionqui correspond à deux caractères adjacents identiques. Par exemple, StringPosition["ABCDDDCBA",x_~~x_]donne {{4, 5}, {5, 6}}. L'application Unionjoint les listes, trie et supprime les doublons.


5

Brain-Flak , 69, 59 , 56 octets

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

Essayez-le en ligne!

+2 octets pour les -ardrapeaux qui permettent l'entrée ASCII et inverse la pile.

Utilise l'indexation basée sur 0. Économisé 10 octets en réduisant ma redondance push-pop . 4 autres octets enregistrés en passant d'une indexation de 1 à 0.

C'est à peu près le seul défi basé sur les cordes auquel le brain-flak est bon. C'est parce que brain-flak est excellent pour comparer des caractères consécutifs, même si c'est horrible pour le traitement des chaînes en général. Voici une version lisible du code avec des commentaires pour expliquer comment cela fonctionne:

#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 corrigé! (Et encore un octet plus court: P)
DJMcMayhem

J'oublie toujours -r. Cela me ramène à 46.
Riley

5

Brachylog , 19 octets

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

Essayez-le en ligne!

Explication

Brachylog est généralement terrible avec les index, ce qui apparaît à nouveau ici.

Si false.est une sortie acceptable dans les cas où il n'y a pas de caractères adjacents, alors ce serait 1 octet de moins en remplaçant ᶠdpar .

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 octets

Merci à ETHProductions de m'avoir orienté vers une économie de trois octets

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

Essayez-le ici ! Notez que les indices de sortie sont basés sur 1 et non dans l'ordre croissant.

Étendu:

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

Explication

Cela fonctionne en lisant le caractère saisi caractère par caractère. Pour comparer deux caractères, nous soustrayons simplement leurs codes de caractères, et si le résultat est 0, nous imprimons la longueur actuelle de la pile, un espace, la longueur actuelle de la pile - 1 et un autre espace. Ensuite, nous nettoyons un peu la pile et nous recommençons avec la boucle de lecture. Si la fin de la chaîne d'entrée est atteinte, le programme s'arrête.


Hmm, si vous pouvez garder la pile assez propre, vous pourrez peut-être utiliser #pour obtenir la longueur de la pile lorsque vous en avez besoin. (Aussi, LOL'ed au ;_;dans le code;))
ETHproductions

Un exemple de base (probablement pas entièrement joué au golf); ethproductions.github.io/cubix/… (Remarque: il est indexé 1, pas indexé 0)
ETHproductions

Merci pour le rappel. J'ai joué un octet de votre version et ajouté cela. Je pourrais peut-être obtenir un octet ou deux de moins ...
Luke

Idée: que se passerait-il si vous le faisiez !$wau lieu de !wdéplacer une partie de la logique de la cinquième ligne vers la quatrième ligne? (Je ne peux pas essayer maintenant parce que je me dirige vers la porte)
ETHproductions

J'y ai également pensé, mais je ne pense pas que cela économisera beaucoup d'octets. Je vais l'essayer cependant.
Luke

3

C, 75 octets

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

Utilise les espaces comme délimiteurs. (Une virgule de fin ne semble pas trop bonne.)

Essayez-le en ligne!


3

C # , 115 octets


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

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

Non lisible non lisible

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

Code complet

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

Communiqués

  • v1.0 - 115 bytes- Solution initiale.

Remarques

Rien à ajouter



2

k, 18 octets

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

Exemples:

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

La traduction vers qest plus facile à comprendre:

{distinct raze -1 0+/:where not differ x}

C'était aussi ma première solution! : D
zgrep

2

JavaScript, 52 octets

Merci @Neil pour avoir joué au golf sur 1 octet

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

Reçoit l'entrée sous la forme d'un tableau de caractères indexé 0
Renvoie la sortie sous la forme d'un tableau indexé 1

Explication

x.map()

Pour chaque caractère de la chaîne

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

S'il est égal au caractère précédent ou au caractère suivant, retourne l'index + 1 sinon ne retourne pas (laisse non défini dans le tableau)

.filter(a=>a)

Supprimer tous les éléments non définis du tableau résultant

Essayez-le en ligne!


Souhaitez-vous &&iéconomiser un octet (...)*i?
Neil

@Neil && est plus rapide que |, ce qui entraînerait qu'il revienne toujours i
fəˈnɛtɪk

0|0&&6est 0, 1|0&&6est 6, 0|1&&6est 6, 1|1&&6est 6. N'est-ce pas ce que vous voulez?
Neil

Je pense que je pensais que j'avais encore || au lieu de |
fəˈnɛtɪk

Ah oui, ça expliquerait ça.
Neil


1

Perl 5 , 37 octets

35 octets de code + pldrapeaux.

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

Essayez-le en ligne!

(?<=(.))\1|(.)(?=\2)correspondra soit entre deux caractères répétés ( (?<=(.))\1), soit avant un caractère répété ( (.)(?=\2)).
Imprime ensuite print posla position du match. ( poscontient l'index de la correspondance actuelle lorsqu'il est utilisé dans une expression régulière avec /gmodificateur).



1

PHP, 100 octets

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

Lot, 139 octets

@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

Prend entrée sur STDIN. Fonctionne en gardant une trace du nombre de nombres à imprimer dans la cvariable, qui est réinitialisé à 2 lorsqu'une paire est détectée. Remarque: Au coût de 6 octets, pourrait être renforcé pour fonctionner avec la plupart des caractères ASCII et pas seulement ABCD.


1

C #, 89 octets

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

S'il y a trois caractères ou plus dans une ligne, les index sont répétés. Ce que @Comrade SparklePony a autorisé dans les commentaires.

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

1

QBIC , 42 octets

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

Exemple de sortie:

Command line: AADCDBBD
 1             2 
 6             7 

Explication:

;               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 a maintenant Substring! Ce défi peut désormais être résolu en 32 octets:

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

Où:

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

Il s'agit d'une fonction, elle prend une chaîne et retourne une liste d'index.

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

Explication:

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

Essayez-le en ligne!

Comment utiliser:

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

0

PHP, 70 octets

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

prend l'entrée de STDIN; courir avec -R.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.