มีตัวอักษรที่อยู่ติดกันในชื่อเรื่องใช่ไหม [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'

นี่คือดังนั้นรหัสที่สั้นที่สุดชนะ!


เราสามารถมีตัวคั่นต่อท้ายในผลลัพธ์ได้หรือไม่?
แมวธุรกิจ

@BasicSunset Sure
สหาย SparklePony

1
@JanathanAllan ไม่เป็นไรเพราะมันให้ผลลัพธ์เพียงหนึ่งรายการ
สหาย SparklePony

2
ดัชนีของอักขระต่อเนื่องสามารถปรากฏได้หลายครั้งหรือไม่? เช่นสำหรับกรณีทดสอบครั้งที่สามก็3,4,4,5ใช้ได้เช่นกัน?
ลุค

1
คุณสามารถเพิ่มกรณีทดสอบที่ไม่มีการจับคู่แบบสมมาตรได้หรือไม่? เช่นAABBCD -> 1,2,3,4
Riley

คำตอบ:


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

เรติน่า , 33 29 23 ไบต์

บันทึก 6 ไบต์ด้วย Martin Ender

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

เอาต์พุตรายการดัชนีที่คั่นด้วย linefeed

ลองออนไลน์!

คำอธิบาย

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 ได้
Magic Octopus Urn

1
ฉันรู้สึกว่าภาษานี้มากขึ้นเรื่อย ๆ เหมือนการโกงที่นี่ : D
Avamander

@ComporSparklePony ทำไมยกเลิกการยอมรับเช็ค?
Jonathan Allan

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"ปรากฏเป็น substring "string"ของ x_~~x_เป็นStringExpressionอักขระที่ตรงกับอักขระสองตัวที่อยู่ติดกันและเหมือนกัน ยกตัวอย่างเช่นให้StringPosition["ABCDDDCBA",x_~~x_] {{4, 5}, {5, 6}}การสมัครUnionเข้าร่วมรายการเรียงลำดับและลบรายการที่ซ้ำกัน


5

Brain-Flak , 69, 59 , 56 bytes

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

ลองออนไลน์!

+2 ไบต์สำหรับ-arแฟล็กซึ่งเปิดใช้งานอินพุต ASCII และย้อนกลับสแต็ก

ใช้การจัดทำดัชนีแบบ 0 ที่บันทึกไว้ 10 ไบต์โดยการลดความซ้ำซ้อนของการผลักดันป๊อปของฉัน บันทึกอีก 4 ไบต์โดยเปลี่ยนจากการจัดทำดัชนีตาม 0 เป็น 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
<>


@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'ed ที่;_;ในรหัส;))
ETHproductions

ตัวอย่างพื้นฐาน (อาจไม่สมบูรณ์ Golfed); ethproductions.github.io/cubix/… (หมายเหตุ: เป็น 1 ดัชนีไม่ใช่ดัชนี 0)
ETHproductions

ขอบคุณสำหรับการเตือน ฉัน golfed หนึ่งไบต์ของรุ่นของคุณและเสริมว่า ฉันอาจจะสามารถที่จะได้รับ anoter ไบต์หรือสอง ...
ลูกา

ความคิด: สิ่งที่ถ้าคุณไม่ได้ทำ!$wแทน!wและย้ายส่วนหนึ่งของตรรกะแถวห้าแถวที่สี่? (ไม่สามารถลองได้ในขณะนี้เพราะฉันกำลังมุ่งหน้าไปที่ประตู)
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;};

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

อ่านได้ไม่ดี

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

หากมีค่าเท่ากับอักขระก่อนหน้าหรืออักขระถัดไปให้ส่งคืนดัชนี + 1 มิฉะนั้นจะไม่ส่งคืน (ปล่อยให้ไม่ได้กำหนดไว้ในอาร์เรย์)

.filter(a=>a)

ลบองค์ประกอบที่ไม่ได้กำหนดทั้งหมดออกจากอาร์เรย์ผลลัพธ์

ลองออนไลน์!


จะ&&iช่วยประหยัด byte (...)*i?
Neil

@Neil && เร็วกว่า | ซึ่งจะส่งผลให้มันกลับมาเสมอฉัน
fəˈnɛtɪk

0|0&&6คือ 0, 1|0&&6คือ 6, 0|1&&6คือ 6, 1|1&&6คือ 6. นั่นคือสิ่งที่คุณต้องการหรือไม่?
Neil

ฉันคิดว่าฉันคิดว่าฉันยังมี || แทน |
fəˈnɛtɪk

อ่าใช่นั่นจะอธิบายได้
Neil


1

Perl 5 , 37 ไบต์

35 ไบต์ของรหัส + plธง

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

ลองออนไลน์!

(?<=(.))\1|(.)(?=\2)จะจับคู่ระหว่าง(?<=(.))\1อักขระที่ซ้ำกันสองตัว ( ) หรือก่อนอักขระที่ซ้ำ ( (.)(?=\2))
จากนั้นprint posพิมพ์ตำแหน่งของการแข่งขัน ( posมีดัชนีของการแข่งขันปัจจุบันเมื่อใช้ใน regex พร้อมโมดิ/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)+" ":""));

หากมีอักขระสามตัวขึ้นไปในแถวดัชนีจะถูกทำซ้ำ @Comrade SparklePony ใดที่อนุญาตในความคิดเห็น

โปรแกรมเต็มรูปแบบ Ungolfed:

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"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.