タイトルに隣接する文字はありますか?[3、4]!


21

タイトルの意図が間違っています。詳細を読んで理由を確認してください。

あなたのタスク:文字を含む区切り文字列またはリストを指定A,B,C,Dすると、隣接するすべての等しい文字のインデックスを出力します。出力は、複数行の複数の文字列/整数、リスト/配列、または区切り文字列にすることができます。

すべての出力は、リストまたは文字列、または複数の印刷行である必要があります。複数の行がある場合、各印刷行には1つの文字列または数字のみを含める必要があります。後続のものは大丈夫です。

入出力の標準的な方法。標準の抜け穴が適用されます。

たとえば、0から1のインデックスが付けられているかどうかに応じて、入力'ABCDDCBA'はoutput 3,4またはを出力する必要4,5があります。これは、これらの番号がそのインデックスDとそのD隣にあるためです。

テストケース:

テストケースには、単一の文字列として入力が与えられ、- ,区切り文字列として出力されます。出力のインデックスは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'

これはなので、最短のコードが勝ちです!


出力に末尾の区切り文字を含めることはできますか?
ビジネス猫

@BasicSunset確かに
同志SparklePony

1
@JonathanAllanリストを1つだけ出力するので大丈夫です。
同志SparklePony

2
連続した文字のインデックスを複数回表示できますか?たとえば、3番目のテストケースの場合も3,4,4,5有効ですか?
ルーク

1
対称に一致しないテストケースを追加できますか?例:AABBCD -> 1,2,3,4
ライリー

回答:


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でできることを願っています。
魔法のタコUr

1
この言語は、ここでだまされているようなものだと思う。:D
アバンマンダー

@ComradeSparklePony受け入れチェックの取り消しはなぜですか?
ジョナサンアラン

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_は、StringExpression2つの隣接する同一の文字に一致します。たとえば、StringPosition["ABCDDDCBA",x_~~x_]を与え{{4, 5}, {5, 6}}ます。適用するとUnion、リストが結合され、重複が削除されます。


5

脳フラック69、59、56のバイト

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

オンラインでお試しください!

-arASCII入力を有効にし、スタックを反転するフラグ用に+2バイト。

0ベースのインデックスを使用します。push-popの冗長性を減らすことで 10バイトを節約しました。1から0ベースのインデックス付けに切り替えることで、さらに4バイトを節約しました。

これはほとんど、brain-flakが得意とする唯一の文字列ベースの課題です。それは、一般的な文字列処理が恐ろしいにもかかわらず、brain-flakは連続する文字の比較に優れているためです。コードの動作を説明するコメント付きの読み取り可能なバージョンを次に示します。

#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修正済み!(そして、まだ短い1バイト:P)
DJMcMayhem

私はいつも忘れてい-rます。それは46に私をもたらします
ライリー

5

Brachylog、19バイト

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

オンラインでお試しください!

説明

Brachylogは通常、インデックスでひどいです。

if false.が隣接する文字がない場合に許容可能な出力である場合、で置き換えることᶠdにより1バイト少なくなります。

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バイト

3バイトの節約の方向を教えてくれたETHProductionsに感謝します

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

ここで試してみてください!出力インデックスは1から始まり、昇順ではないことに注意してください。

拡張:

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

説明

これは、文字ごとに入力を読み取ることで機能します。2つの文字を比較するには、単に文字コードを減算し、結果が0の場合、スタックの現在の長さ、スペース、スタックの現在の長さ-1および別のスペースを出力します。次に、スタックを少しクリーンアップし、読み取りループから始めます。入力文字列の最後に到達すると、プログラムは停止します。


うーん、スタックをかなりきれいに保つことができれば、#必要なときにスタックの長さを取得するために使用できるかもしれません。(また、;_;コード内でLOL'ed ;))
ETHproductions

基本的な例(おそらく完全にゴルフではない); ethproductions.github.io/cubix/…(注:インデックスは0でなく1インデックスです)
ETHproductions

念押し有難う。私はあなたのバージョンの1バイトをゴルフし、それを追加しました。私は別のバイトを1つまたは2つ取得できるかもしれません...-
ルーク

アイデア:5行目のロジックの!$w代わりに!w4行目に移動した場合はどうなりますか?(私はドアを出ているので今すぐ試すことはできません)
ETHproductions

私もそれを考えましたが、多くのバイトを節約できるとは思いません。でもやってみます。
ルーク


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

リリース

  • v1.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

前の文字または次の文字と等しい場合は、index + 1を返します。それ以外の場合は返しません(配列で未定義のままにします)

.filter(a=>a)

結果の配列から未定義の要素をすべて削除します

オンラインでお試しください!


思い&&iオーバーバイトを保存しますか(...)*i
ニール

@Neil &&は|よりも高速で、常にiを返すことになります
-fəˈnɛtɪk

0|0&&6、0で1|0&&6、6で0|1&&66で、1|1&&66ですが、あなたが何をしたいということではないですか?
ニール

私はまだ持っていたと思っていたと思います|| の代わりに|
-fəˈnɛtɪk

ああ、それはそれを説明するでしょう。
ニール


1

Perl 5、37バイト

35バイトのコード+ plフラグ。

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

オンラインでお試しください!

(?<=(.))\1|(.)(?=\2)繰り返される2つの文字間((?<=(.))\1)、または繰り返される文字の前((.)(?=\2)
次に、print pos一致の位置を出力します。(修飾子pos付きの正規表現で使用される場合、現在の一致のインデックスが含まれます/g)。





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)+" ":""));

行に3つ以上の文字がある場合、インデックスが繰り返されます。コメントで許可されている@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ます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.