标题中的相邻字符是什么?[3,4]!


21

标题故意拼写错误。阅读更多内容以找出原因。

您的任务:给定分隔的字符串或包含字符的列表 A,B,C,D,输出所有相邻的相等字符的索引。输出可以是多行上的多个字符串/整数,列表/数组或定界字符串。

所有输出应在列表或字符串或多行打印中。每条印刷线(如果有多条)只能包含1个字符串或数字。随便什么都可以。

输入/输出的标准方法。有标准漏洞。

例如,输入'ABCDDCBA'应该输出3,44,5,具体取决于它是0到1的索引,因为这些数字是其索引DD下一个索引。

测试用例:

测试用例的输入为单个字符串,输出为- ,分隔字符串。输出为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同志17年

1
@JonathanAllan可以,因为它只输出一个列表。
“ SparklePony同志” 17年

2
连续字符的索引可以出现多次吗?例如,对于第三个测试用例,是否也3,4,4,5有效?
路加福音

1
您可以添加一个没有对称匹配的测试用例吗?例如AABBCD -> 1,2,3,4
Riley

Answers:


5

MATL8 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

视网膜33 29 23字节

感谢Martin Ender,节省了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
Avamander

@ComradeSparklePony为什么撤消接受检查?
Jonathan Allan

7

Brain-Flak57 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将对列表进行联接,排序和删除重复项。


5

脑高射炮69,59,56个字节

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

在线尝试!

-ar标志的+2个字节可启用ASCII输入并反转堆栈。

使用基于0的索引。通过减少我的push-pop冗余节省了10个字节。从1到0的索引切换节省了另外4个字节。

这几乎是Flask擅长的唯一基于字符串的挑战。这是因为,尽管通常在字符串处理方面令人恐惧,但大脑断言却擅长比较连续字符。这是代码的可读版本,带有注释以解释其工作方式:

#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固定!(而且还短了一个字节:P)
DJMcMayhem

我总是忘了-r。那使我降至46。–
Riley

5

Brachylog,19个字节

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

在线尝试!

说明

Brachylog通常在索引方面很糟糕,这里再次显示。

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


4

Cubix,37 32 31 29 28字节

感谢ETHProductions向我指出了节省三字节的方向

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

在这里尝试!请注意,输出索引基于1,并且不按升序排列。

展开:

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

说明

通过逐个读取输入字符来工作。为了比较两个字符,我们简单地减去它们的字符代码,如果结果为0,则打印堆栈的当前长度,一个空格,堆栈的当前长度-1和另一个空格。然后我们稍微清理一下堆栈,然后再次从读取循环开始。如果到达输入字符串的末尾,程序将停止。


嗯,如果您可以保持堆栈相当干净,则可以在需要时使用它#来获取堆栈的长度。(也可以在;_;代码中的LOL处找到;)))
ETHproductions'Apr 15'17

一个基本的例子(可能不完全打高尔夫球);ethproductions.github.io/cubix/…(注意:它是1索引的,而不是0索引的)
ETHproductions

感谢您的提醒。我打高尔夫球了您的版本的一个字节,并添加了该字节。我也许能获得一个或两个注释字节...
路加福音

想法:如果您!$w代替而不是!w将第五行逻辑的一部分移至第四行怎么办?(因为我要出门而现在不能尝试)
ETHproductions'Apr

我也想到了这一点,但我认为它不会节省很多字节。我会尝试的。
路加福音

3

C,75个字节

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

使用空格作为分隔符。(逗号后面看起来不太好。)

在线尝试!


3

C#,115字节


打高尔夫球

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

不打高尔夫球

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

非高尔夫可读

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

发布

  • 1.0 - 115 bytes-初始溶液。

笔记

没有补充



2

k,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}

这也是我最初的解决方案!: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)

从结果数组中删除所有未定义的元素

在线尝试!


&&i节省一个字节(...)*i吗?
尼尔

@Neil &&的速度比|快,这将导致它总是返回i
fəˈnɛtɪk

0|0&&6是0,1|0&&6是6,0|1&&6是6,1|1&&6是6。这不是您想要的吗?
尼尔

我想我以为我还有|| 代替|
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 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();
        }
    }
}

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.

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"

0

PHP,70个字节

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

接收来自STDIN的输入;与运行-R

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.