Các nhân vật liền kề trong tiêu đề là ở đâu? [3, 4]!


21

Tiêu đề sai chính tả về mục đích. Đọc thêm để tìm hiểu lý do tại sao.

Nhiệm vụ của bạn: đưa ra một chuỗi hoặc danh sách được phân tách bao gồm các ký tự A,B,C,D, xuất ra các chỉ mục của tất cả các ký tự bằng nhau liền kề. Đầu ra có thể là nhiều chuỗi / số nguyên trên nhiều dòng, danh sách / mảng hoặc chuỗi được phân tách.

Tất cả đầu ra phải ở trong một danh sách hoặc chuỗi hoặc nhiều dòng in. Mỗi dòng in, nếu có nhiều, chỉ nên chứa 1 chuỗi hoặc số. Trailing whatevers là được.

Phương pháp tiêu chuẩn đầu vào / đầu ra. Tiêu chuẩn áp dụng.

Ví dụ, đầu vào 'ABCDDCBA'nên đầu ra 3,4hoặc 4,5, tùy thuộc vào việc nó là 0- đến 1- được lập chỉ mục, bởi vì những số đó là chỉ mục của DDbên cạnh nó.

Các trường hợp thử nghiệm:

Các trường hợp thử nghiệm có đầu vào được đưa ra dưới dạng một chuỗi đơn và đầu ra là một ,chuỗi được phân tách. Các đầu ra được lập chỉ mục 0, thêm 1 vào mỗi mục xuất ra để làm cho nó được lập chỉ mục 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'

Đây là , vì vậy mã ngắn nhất sẽ thắng!


Chúng ta có thể có một dấu phân cách ở đầu ra không?
Mèo kinh doanh

@BasicSunset Chắc chắn
Đồng chí SparklePony

1
@Jonathan ALLan Không sao vì nó chỉ xuất ra một danh sách.
Đồng chí SparklePony

2
Chỉ số của các ký tự liên tiếp có thể xuất hiện nhiều lần? Ví dụ cho trường hợp thử nghiệm thứ ba, có 3,4,4,5hợp lệ không?
Luke

1
Bạn có thể thêm một trường hợp thử nghiệm không có kết quả đối xứng không? Ví dụ:AABBCD -> 1,2,3,4
Riley

Câu trả lời:


5

MATL , 8 7 byte

d~ftQvu

Đầu ra là 1 dựa.

Hãy thử trực tuyến!

Giải thích với ví dụ

Xem xét đầu vào '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

Võng mạc , 33 29 23 byte

Đã lưu 6 byte nhờ Martin Ender

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

Xuất ra một danh sách các chỉ mục được phân tách bằng linefeed.

Hãy thử trực tuyến!

Giải trình

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

Chuyển ngữ chạy cùng một ký tự thành dấu hai chấm, để đánh dấu các vị trí có ký tự trùng lặp.

:
$.`¶

Sau đó thay thế mỗi dấu hai chấm bằng độ dài của văn bản trước nó, theo sau là một dòng cấp.

T`L

Cuối cùng, xóa mọi chữ cái còn lại.


7

Thạch , 7 byte

JṁŒgḊÐf

1 dựa trên; trả về một danh sách các danh sách các lần chạy chỉ mục được OP cho phép .

Hãy thử trực tuyến!

Làm sao?

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
- Những điều tôi muốn 05AB1E có thể làm cho 500, xin vui lòng.
Bạch tuộc ma thuật Urn

1
Tôi cảm thấy ngày càng giống ngôn ngữ này giống như gian lận ở đây. : D
Avamander

@ComradeSparklePony tại sao hoàn tác kiểm tra chấp nhận?
Jonathan Allan

7

Brain-Flak , 57 46 byte

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

Bao gồm +2 cho -ar

Sử dụng lập chỉ mục dựa trên 0.

Hãy thử trực tuyến!

# 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

Toán học, 32 byte

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

Hàm thuần túy trả về vị trí 1 chỉ mục của các ký tự liền kề với một ký tự giống hệt nhau.

Giải trình:

StringPosition["string","sub"]đưa ra một danh sách các vị trí ký tự bắt đầu và kết thúc mà tại đó "sub"xuất hiện dưới dạng một chuỗi con của "string". x_~~x_là một StringExpressiontrong đó phù hợp với hai nhân vật liền kề, giống hệt nhau. Ví dụ, StringPosition["ABCDDDCBA",x_~~x_]cho {{4, 5}, {5, 6}}. Áp dụng Uniontham gia danh sách, sắp xếp và xóa trùng lặp.


5

Brain-Flak , 69, 59 , 56 byte

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

Hãy thử trực tuyến!

+2 byte cho các -arcờ cho phép nhập ASCII và đảo ngược ngăn xếp.

Sử dụng lập chỉ mục dựa trên 0. Đã lưu 10 byte bằng cách giảm sự dư thừa đẩy của tôi . Đã lưu 4 byte khác bằng cách chuyển từ lập chỉ mục dựa trên 1 sang 0.

Đây là khá nhiều thách thức dựa trên chuỗi duy nhất mà flak não là tốt. Đó là bởi vì não bộ rất tuyệt khi so sánh các ký tự liên tiếp, mặc dù nói chung nó rất tệ khi xử lý chuỗi. Đây là phiên bản có thể đọc được của mã với các bình luận để giải thích cách thức hoạt động của nó:

#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 đã sửa! (Và vẫn còn một byte ngắn hơn: P)
DJMcMayhem

Tôi luôn quên về -r. Điều đó đưa tôi xuống 46.
Riley

5

Brachylog , 19 byte

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

Hãy thử trực tuyến!

Giải trình

Brachylog thường khủng khiếp với các chỉ số, một lần nữa cho thấy ở đây.

Nếu false.là một đầu ra chấp nhận được trong trường hợp không có ký tự liền kề, thì đây sẽ là ít hơn 1 byte bằng cách thay thế ᶠdbằng .

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

Hình khối, 37 32 31 29 28 byte

Cảm ơn ETHSản phẩm đã chỉ cho tôi theo hướng tiết kiệm ba byte

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

Hãy thử nó ở đây ! Lưu ý rằng các chỉ số đầu ra là dựa trên 1 và không theo thứ tự tăng dần.

Mở rộng:

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

Giải trình

Điều này hoạt động bằng cách đọc các ký tự đầu vào theo nhân vật. Để so sánh hai ký tự, chúng tôi chỉ cần trừ mã ký tự của chúng và nếu kết quả là 0, chúng tôi sẽ in độ dài hiện tại của ngăn xếp, khoảng trắng, chiều dài hiện tại của ngăn xếp - 1 và khoảng trắng khác. Sau đó, chúng tôi dọn sạch ngăn xếp một chút, và chúng tôi bắt đầu với vòng lặp đọc lại. Nếu kết thúc chuỗi đầu vào, chương trình dừng lại.


Hmm, nếu bạn có thể giữ ngăn xếp khá sạch sẽ, bạn có thể sử dụng #để lấy chiều dài của ngăn xếp khi bạn cần. (Ngoài ra, LOL'ed tại ;_;mã trong;))
ETHproductions

Một ví dụ cơ bản (có thể không được đánh gôn hoàn toàn); ethproductions.github.io/cubix/... (Lưu ý: đó là 1 lập chỉ mục, không phải 0-lập chỉ mục)
ETHproductions

Cảm ơn đã nhắc nhở. Tôi đã đánh gôn một byte của phiên bản của bạn và thêm vào đó. Tôi có thể nhận được một hoặc hai byte anoter ...
Luke

Ý tưởng: nếu bạn đã làm !$wthay vì !wvà chuyển một phần logic hàng thứ năm sang hàng thứ tư thì sao? (Không thể thử ngay bây giờ vì tôi đang đi ra khỏi cửa)
ETHproductions

Tôi cũng nghĩ về điều đó, nhưng tôi không nghĩ nó sẽ tiết kiệm được nhiều byte. Tôi sẽ thử nó mặc dù.
Luke


3

C # , 115 byte


Chơi gôn

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

Ung dung

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 có thể đọc được

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

Mã đầy đủ

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

Phát hành

  • v1.0 - 115 bytes- Giải pháp ban đầu.

Ghi chú

Không có gì để bổ sung



2

k, 18 byte

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

Ví dụ:

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

Dịch sang qdễ hiểu hơn:

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

Đây là giải pháp ban đầu của tôi quá! : D
zgrep

2

JavaScript, 52 byte

Cảm ơn @Neil vì đã chơi golf 1 byte

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

Nhận đầu vào dưới dạng một mảng các ký tự 0
Trả về đầu ra dưới dạng mảng 1 chỉ mục

Giải trình

x.map()

Đối với mỗi ký tự trong chuỗi

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

Nếu nó bằng ký tự trước hoặc ký tự tiếp theo, hãy trả về chỉ mục + 1 nếu không không trả về (không xác định trong mảng)

.filter(a=>a)

Xóa tất cả các phần tử không xác định khỏi mảng kết quả

Hãy thử trực tuyến!


Sẽ &&itiết kiệm một byte hơn (...)*i?
Neil

@Neil && nhanh hơn |, điều này sẽ khiến nó luôn quay trở lại i
fəˈnɛtɪk

0|0&&6là 0, 1|0&&6là 6, 0|1&&6là 6, 1|1&&6là 6. Đó không phải là điều bạn muốn sao?
Neil

Tôi nghĩ rằng tôi đã nghĩ rằng tôi vẫn còn | | thay vì |
fnɛtɪk

À vâng, điều đó sẽ giải thích nó.
Neil

2

Python 2, 55 54 byte

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

Hãy thử trực tuyến!

Các chỉ mục đầu ra được phân tách bằng dấu cách (lưu ý rằng phần này hiển thị một số chỉ mục hai lần khi được OP cho phép)


1

Perl 5 , 37 byte

35 byte mã + plcờ.

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

Hãy thử trực tuyến!

(?<=(.))\1|(.)(?=\2)sẽ khớp giữa hai (?<=(.))\1ký tự được lặp lại ( (.)(?=\2)) hoặc trước một ký tự được lặp lại ( ).
Sau đó, print posin vị trí của trận đấu. ( poschứa chỉ mục của kết quả khớp hiện tại khi được sử dụng trong biểu thức chính quy với công cụ /gsửa đổi).



1

PHP, 100 byte

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

Mẻ, 139 byte

@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

Đưa đầu vào vào STDIN. Hoạt động bằng cách theo dõi có bao nhiêu số để in trong cbiến, được đặt lại thành 2 khi phát hiện một cặp. Lưu ý: Với chi phí 6 byte, có thể được làm cứng với hầu hết các ký tự ASCII chứ không chỉ ABCD.


1

C #, 89 byte

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

Nếu có ba hoặc nhiều ký tự liên tiếp, các chỉ mục được lặp lại. Mà @Comrade SparklePony cho phép trong các bình luận.

Chương trình đầy đủ:

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 byte

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

Đầu ra mẫu:

Command line: AADCDBBD
 1             2 
 6             7 

Giải trình:

;               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 hiện có Chuỗi con! Thử thách này hiện có thể được giải quyết trong 32 byte:

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

Ở đâu:

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

Đây là một hàm, nó có trong một chuỗi và trả về một danh sách các chỉ mục.

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

Giải trình:

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

Hãy thử trực tuyến!

Cách sử dụng:

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

0

PHP, 70 byte

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

lấy đầu vào từ STDIN; chạy với -R.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.