Где соседние символы в названии? [3, 4]!

21

Название написано с ошибкой специально. Читайте больше, чтобы узнать почему.

Ваша задача: с учетом строки или списка с разделителями, включая символы A,B,C,D, вывести индексы всех соседних одинаковых символов. Выходными данными могут быть несколько строк / целых чисел в нескольких строках, список / массив или строка с разделителями.

Весь вывод должен быть в виде списка или строки, или нескольких напечатанных строк. Каждая напечатанная строка, если их несколько, должна содержать только 1 строку или число. С трейлером все в порядке.

Стандартные методы ввода / вывода. Применяются стандартные лазейки.

Например, ввод 'ABCDDCBA'должен выводить 3,4или 4,5, в зависимости от того, проиндексирован ли он от 0 до 1, потому что эти числа являются индексами Dи следуют за Dним.

Тестовые случаи:

Тестовые случаи имеют входные данные в виде одной строки и выходные данные в виде ,строки с -delimited. Выходы индексируются 0, добавьте 1 к каждому выводимому элементу, чтобы он был 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'

Это , поэтому выигрывает самый короткий код!

Товарищ Спаркл Пони
источник
Можем ли мы иметь конечный разделитель на выходе?
Business Cat
@BasicSunset Конечно
товарищ SparklePony
1
@JonathanAllan Это нормально, потому что он выводит только один список.
Товарищ SparklePony
2
Могут ли индексы последовательных символов появляться несколько раз? Например, для третьего контрольного примера, также 3,4,4,5верно?
Лука
1
Можете ли вы добавить тестовый пример, который не имеет симметричных совпадений? НапримерAABBCD -> 1,2,3,4
Райли

Ответы:

5

MATL , 8 7 байт

d~ftQvu

Выход основан на 1.

Попробуйте онлайн!

Пояснение с примером

Рассмотрим ввод '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 байта

Сохранено 6 байтов благодаря Мартину Эндеру

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

Вывод списка индексов, разделенных переводом строки.

Попробуйте онлайн!

объяснение

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

Транслитерировать серии одного и того же символа в двоеточие, чтобы пометить позиции, где есть повторяющиеся символы.

:
$.`¶

Затем замените каждое двоеточие на длину текста перед ним, за которой следует перевод строки.

T`L

Наконец, удалите все оставшиеся буквы.

Бизнес Кот
источник
7

Желе , 7 байт

JṁŒgḊÐf

1 на основе; возвращает список списков прогонов индексов, разрешенных OP.

Попробуйте онлайн!

Как?

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
- Что бы я хотел, чтобы 05AB1E мог сделать за 500, пожалуйста.
Волшебная Урна Осьминога
1
Я все больше и больше чувствую, что этот язык как бы изменяет здесь. : D
Авамандер
@ComradeSparklePony, почему отмена подтверждения приема?
Джонатан Аллан
7

Brain-Flak , 57 46 байтов

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

Включает +2 для -ar

Использует индексирование на основе 0.

Попробуйте онлайн!

# 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 байта

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

Чистая функция, которая возвращает 1-индексированные позиции символов рядом с идентичным символом.

Объяснение:

StringPosition["string","sub"]дает список начальных и конечных позиций символов, в которых "sub"отображается подстрока "string". x_~~x_это StringExpressionсоответствует двум соседним, одинаковым символам. Так , например, StringPosition["ABCDDDCBA",x_~~x_]дает {{4, 5}, {5, 6}}. Применение Unionобъединяет списки, сортирует и удаляет дубликаты.

ngenisis
источник
5

Brain-Flak , 69, 59 , 56 байтов

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

Попробуйте онлайн!

+2 байта для -arфлагов, которые разрешают ввод ASCII и переворачивают стек.

Использует индексирование на основе 0. Сэкономил 10 байтов, уменьшив избыточность push-pop . Сохранены еще 4 байта путем переключения с 1 на 0 на основе индексации.

Это в значительной степени единственная струнная задача, в которой хорош мозговой зенит. Это потому, что мозговая ловушка хороша при сравнении последовательных символов, хотя и ужасна при обработке строк в целом. Вот читаемая версия кода с комментариями, чтобы объяснить, как это работает:

#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
источник
@ Рили исправлено! (И все же на один байт короче: P)
DJMcMayhem
Я всегда забываю о -r. Это подводит меня к 46.
Райли
5

Брахилог , 19 байт

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

Попробуйте онлайн!

объяснение

Брахилог обычно ужасен с индексами, что снова показывает здесь.

Если false.это допустимый вывод в случаях, когда нет соседних символов, то это будет на 1 байт меньше, если заменить ᶠdна .

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
Fatalize
источник
4

Cubix, 37 32 31 29 28 байт

Спасибо ETHProductions за то, что указал мне в сторону трехбайтовой экономии

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

Попробуй это здесь ! Обратите внимание, что выходные индексы основаны на 1, а не в порядке возрастания.

Expanded:

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

объяснение

Это работает путем чтения ввода символ за символом. Чтобы сравнить два символа, мы просто вычитаем их коды символов, а если результат равен 0, мы печатаем текущую длину стека, пробел, текущую длину стека - 1 и другой пробел. Затем мы немного очистим стек и снова начнем цикл чтения. Если достигнут конец входной строки, программа останавливается.

Люк
источник
Хм, если вы можете сохранить стек достаточно чистым, вы можете использовать его #для получения длины стека, когда вам это нужно. (Также, LOL'ed в ;_;в коде;))
ETHproductions
Основной пример (вероятно, не полностью в гольф); ethproductions.github.io/cubix/… (Примечание: это 1-индексированный, а не 0-индексированный)
ETHproductions
Спасибо за напоминание. Я сыграл в гольф один байт вашей версии и добавил это. Я мог бы получить еще один или два байта ...
Лука
Идея: что, если вы сделали !$wвместо !wи переместили часть логики пятого ряда в четвертый ряд? (Не могу попробовать прямо сейчас, потому что я выхожу за дверь)
ETHproductions
Я тоже об этом думал, но не думаю, что это сэкономит много байтов. Я попробую это все же.
Лука
3

C, 75 байтов

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

Использует пробелы в качестве разделителей. (Завершающая запятая не выглядит слишком хорошо.)

Попробуйте онлайн!

Steadybox
источник
3

C # , 115 байт


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

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 читаемый

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

Полный код

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

релизы

  • v1.0 - 115 bytes- Исходное решение.

Заметки

Нечего добавить

auhmaan
источник
2

к, 18 байт

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

Примеры:

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

Перевод qлегче понять:

{distinct raze -1 0+/:where not differ x}
skeevey
источник
Это было мое первоначальное решение тоже! : D
zgrep
2

JavaScript, 52 байта

Спасибо @Neil за игру в 1 байт

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

Получает входные данные в виде массива с 0 индексами.
Возвращает выходные данные в виде массива с 1 индексом.

объяснение

x.map()

Для каждого символа в строке

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

Если он равен предыдущему или следующему символу, вернуть индекс + 1, в противном случае не вернуть (оставляет неопределенным в массиве)

.filter(a=>a)

Удалить все неопределенные элементы из результирующего массива

Попробуйте онлайн!

fənɛtɪk
источник
Будет ли &&iсохранить байты над (...)*i?
Нил
@Neil && быстрее, чем |, в результате чего он всегда будет возвращать i
fəˈnɛtɪk
0|0&&60, 1|0&&66, 0|1&&66, 1|1&&66. Разве это не то, что вы хотите?
Нил
Я думаю, что я думал, что у меня еще || вместо |
fəˈnɛtɪk
Ах да, это объяснило бы это.
Нил
2

Python 2, 55 54 байта

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

Попробуйте онлайн!

Выводит индексы, разделенные пробелами (обратите внимание, что некоторые индексы отображаются дважды, как это разрешено OP)

математик наркоман
источник
1

Perl 5 , 37 байт

35 байт кода + plфлаги.

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

Попробуйте онлайн!

(?<=(.))\1|(.)(?=\2)будет соответствовать либо между двумя повторяющимися символами ( (?<=(.))\1), либо перед повторяющимся символом ( (.)(?=\2)).
Затем print posпечатает позицию матча. ( posсодержит индекс текущего соответствия при использовании в регулярном выражении с /gмодификатором).

папа
источник
1

PHP, 100 байт

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

Пакет, 139 байт

@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

Принимает участие в STDIN. Работает, отслеживая, сколько чисел нужно напечатать в cпеременной, которая сбрасывается до 2 при обнаружении пары. Примечание. Стоимость 6 байт может быть усилена для работы с большинством символов ASCII, а не только с ними ABCD.

Нил
источник
1

C #, 89 байт

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

Если в строке три или более символов, индексы повторяются. Что @Comrade SparklePony разрешено в комментариях.

Развёрнутая полная программа:

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
источник
1

QBIC , 42 байта

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

Пример вывода:

Command line: AADCDBBD
 1             2 
 6             7 

Объяснение:

;               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

РЕДАКТИРОВАТЬ: QBIC теперь имеет подстроку! Эта задача теперь может быть решена в 32 байта:

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

Где:

_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
источник
0

k, 14 байтов

Это функция, она принимает строку и возвращает список индексов.

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

Объяснение:

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

Попробуйте онлайн!

Как использовать:

&{x|1_x,0}@=':"STRINGGOESHERE"
zgrep
источник
0

PHP, 70 байт

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

принимает входные данные от STDIN; беги с -R.

Titus
источник