Dimanakah karakter yang berdekatan dalam judul? [3, 4]!

21

Judul salah eja dengan sengaja. Baca lebih lanjut untuk mengetahui alasannya.

Tugas Anda: diberi string atau daftar terbatas termasuk karakter A,B,C,D, output indeks dari semua karakter yang sama yang berdekatan. Output dapat berupa banyak string / integer pada banyak baris, daftar / array, atau string yang dibatasi.

Semua output harus dalam daftar atau string, atau beberapa baris yang dicetak. Setiap baris yang dicetak, jika ada banyak, hanya boleh berisi 1 string atau angka. Whatevers yang tertinggal tidak apa-apa.

Metode input / output standar. Celah standar berlaku.

Sebagai contoh, input 'ABCDDCBA'harus di-output 3,4atau 4,5, tergantung pada apakah itu 0 ke 1- diindeks, karena angka-angka itu adalah indeks dari Ddan di Dsebelahnya.

Kasus uji:

,Kasing uji memiliki input yang diberikan sebagai string tunggal, dan output sebagai string -drivisi. Output diindeks 0, tambahkan 1 ke setiap item yang di-output untuk menjadikannya 1-diindeks.

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'

Ini , jadi kode terpendek menang!

Kamerad SparklePony
sumber
Bisakah kita memiliki pembatas trailing di output?
Business Cat
@BasicSunset Sure
Kamerad SparklePony
1
@ JonathanAllan Tidak apa-apa karena hanya menghasilkan satu daftar.
Kamerad SparklePony
2
Bisakah indeks karakter berturut-turut muncul beberapa kali? Misalnya untuk test case ketiga, apakah 3,4,4,5valid juga?
Luke
1
Bisakah Anda menambahkan test case yang tidak memiliki kecocokan simetris? MisalnyaAABBCD -> 1,2,3,4
Riley

Jawaban:

5

MATL , 8 7 byte

d~ftQvu

Output berbasis 1.

Cobalah online!

Penjelasan dengan contoh

Pertimbangkan input '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]
Luis Mendo
sumber
8

Retina , 33 29 23 byte

Disimpan 6 byte berkat Martin Ender

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

Menghasilkan daftar indeks yang dipisahkan oleh linefeed.

Cobalah online!

Penjelasan

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

Aliran transliterasi dari karakter yang sama ke titik dua, untuk menandai posisi di mana ada karakter duplikat.

:
$.`¶

Kemudian ganti setiap titik dua dengan panjang teks sebelum itu, diikuti oleh linefeed.

T`L

Akhirnya, hapus semua huruf yang tersisa.

Kucing Bisnis
sumber
7

Jelly , 7 byte

JṁŒgḊÐf

Berbasis 1; mengembalikan daftar daftar indeks yang diizinkan oleh OP.

Cobalah online!

Bagaimana?

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]     ]        
Jonathan Allan
sumber
2
- Hal-hal yang saya harap 05AB1E bisa lakukan untuk 500, tolong.
Magic Gurita Guci
1
Saya merasa semakin dan semakin seperti bahasa ini yang suka curang di sini. : D
Avamander
@ComradeSparklePony mengapa membatalkan cek terima?
Jonathan Allan
7

Brain-Flak , 57 46 byte

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

Termasuk +2 untuk -ar

Menggunakan pengindeksan berbasis 0.

Cobalah online!

# 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
<>
Riley
sumber
6

Mathematica, 32 byte

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

Fungsi murni yang mengembalikan posisi 1-indeks karakter yang berdekatan dengan karakter yang identik.

Penjelasan:

StringPosition["string","sub"]memberikan daftar posisi karakter awal dan akhir yang "sub"muncul sebagai substring dari "string". x_~~x_adalah StringExpressionyang cocok dengan dua karakter yang berdekatan dan identik. Misalnya, StringPosition["ABCDDDCBA",x_~~x_]memberi {{4, 5}, {5, 6}}. Menerapkan Unionbergabung dengan daftar, mengurutkan, dan menghapus duplikat.

ngenisis
sumber
5

Brain-Flak , 69, 59 , 56 byte

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

Cobalah online!

+2 byte untuk -arflag yang memungkinkan input ASCII dan membalikkan stack.

Menggunakan pengindeksan berbasis 0. Disimpan 10 byte dengan mengurangi redundansi push-pop saya . Menyimpan 4 byte lainnya dengan beralih dari pengindeksan berbasis 1 ke 0.

Ini adalah satu-satunya tantangan berbasis string yang bisa dilakukan oleh brain-flak. Itu karena brain-flak sangat bagus dalam membandingkan karakter yang berurutan, meskipun itu mengerikan dalam pemrosesan string secara umum. Ini adalah versi kode yang dapat dibaca dengan komentar untuk menjelaskan cara kerjanya:

#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
sumber
@riley diperbaiki! (Dan masih satu byte lebih pendek: P)
DJMcMayhem
Saya selalu lupa -r. Itu membawa saya ke 46.
Riley
5

Brachylog , 19 byte

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

Cobalah online!

Penjelasan

Brachylog biasanya mengerikan dengan indeks, yang sekali lagi ditampilkan di sini.

Jika false.output yang dapat diterima dalam kasus di mana tidak ada karakter yang berdekatan, maka ini akan menjadi 1 byte lebih sedikit dengan mengganti ᶠddengan .

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
Fatalisasi
sumber
4

Oktaf , 35 byte

@(s)unique([x=find(~diff(+s)),x+1])

Cobalah online!

Mirip dengan jawaban MATL saya . Di sini uniquesecara otomatis macam. Masukan untuk diffharus dikonversi ke double, yang dilakukan oleh unary +.

Luis Mendo
sumber
4

Cubix, 37 32 31 29 28 byte

Terima kasih kepada ETHProductions karena menunjuk saya ke arah penghematan tiga byte

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

Coba di sini ! Perhatikan bahwa indeks output berbasis 1 dan tidak dalam urutan menaik.

Diperluas:

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

Penjelasan

Ini bekerja dengan membaca karakter input oleh karakter. Untuk membandingkan dua karakter, kami cukup mengurangi kode karakter mereka, dan jika hasilnya 0, kami mencetak panjang tumpukan saat ini, spasi, panjang tumpukan saat ini - 1 dan ruang lain. Lalu kami membersihkan tumpukan sedikit, dan kami mulai dengan loop baca lagi. Jika akhir dari string input tercapai, program berhenti.

Luke
sumber
Hmm, jika Anda bisa menjaga tumpukan cukup bersih, Anda mungkin bisa menggunakan #untuk mendapatkan panjang tumpukan saat Anda membutuhkannya. (Juga, LOL'ed di ;_;dalam kode;))
ETHproduksi
Contoh dasar (mungkin tidak sepenuhnya golf); ethproductions.github.io/cubix/… (Catatan: ini diindeks 1, bukan diindeks 0)
ETHproductions
Terima kasih atas pengingatnya. Saya golf satu byte dari versi Anda dan menambahkannya. Saya mungkin bisa mendapatkan satu atau dua byte lagi ...
Luke
Ide: bagaimana jika Anda lakukan !$wbukan !wdan pindah bagian dari logika baris kelima ke baris keempat? (Tidak dapat mencoba sekarang karena saya sedang menuju keluar pintu)
ETHproduksi
Saya juga memikirkan itu, tapi saya tidak berpikir itu akan menghemat banyak byte. Saya akan mencobanya.
Luke
3

C, 75 byte

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

Menggunakan spasi sebagai pembatas. (Tanda koma tidak terlihat terlalu bagus.)

Cobalah online!

Steadybox
sumber
3

C # , 115 byte


Golf

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

Tidak disatukan

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

Tidak terbaca dibaca

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

Kode lengkap

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

Rilis

  • v1.0 - 115 bytes- Solusi awal.

Catatan

Tidak ada yang perlu ditambahkan

auhmaan
sumber
2

Jelly , 8 byte

=2\T’œ|$

Cobalah online!

Dennis
sumber
Hmm, algoritma yang persis sama saya coba, meskipun saya sedikit lebih lama:Ṗ=ḊTµ2Ḷ+€
ETHproduksi
2

k, 18 byte

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

Contoh:

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

Terjemahan ke qlebih mudah dipahami:

{distinct raze -1 0+/:where not differ x}
skeevey
sumber
Ini juga solusi awal saya! : D
zgrep
2

JavaScript, 52 byte

Terima kasih @Neil untuk bermain golf 1 byte

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

Menerima input sebagai array karakter yang diindeks 0
Mengembalikan output sebagai array yang diindeks 1

Penjelasan

x.map()

Untuk setiap karakter dalam string

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

Jika sama dengan karakter sebelumnya atau karakter berikutnya, kembalikan indeks + 1 jika tidak, jangan kembali (membiarkan undefined dalam array)

.filter(a=>a)

Hapus semua elemen yang tidak terdefinisi dari array yang dihasilkan

Cobalah online!

fəˈnɛtɪk
sumber
Akan &&imenghemat lebih dari satu byte (...)*i?
Neil
@Neil && lebih cepat dari |, yang akan menghasilkan itu selalu mengembalikan saya
fəˈnɛtɪk
0|0&&6is 0, 1|0&&6is 6, 0|1&&6is 6, 1|1&&6is 6. Bukankah itu yang Anda inginkan?
Neil
Saya pikir saya berpikir saya masih punya || bukannya |
fəˈnɛtɪk
Ah ya, itu akan menjelaskannya.
Neil
2

Python 2, 55 54 byte

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

Cobalah secara Online!

Indeks output dipisahkan oleh spasi (perhatikan bahwa indeks ini menampilkan beberapa indeks dua kali sebagaimana diizinkan oleh OP)

pecandu matematika
sumber
1

Perl 5 , 37 byte

35 byte kode + plbendera.

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

Cobalah online!

(?<=(.))\1|(.)(?=\2)akan cocok dengan antara dua karakter yang diulang ( (?<=(.))\1), atau sebelum karakter yang diulang ( (.)(?=\2)).
Lalu, print poscetak posisi korek api. ( posberisi indeks kecocokan saat ini ketika digunakan dalam regex dengan /gpengubah).

Dada
sumber
1

Perl 6 ,  66  57 byte

*.comb.rotor(2=>-1).kv.flatmap({($^a,$a+1)xx[eq] $^b[0,1]}).squish

Cobalah

{m:ex/[(.)<($0|(.))>$0]{make $/.from}/».ast.sort.squish}

Cobalah

Brad Gilbert b2gills
sumber
1

PHP, 100 Bytes

for(;$i<strlen($s=$argn);$i++)$s[$i]==$s[$i+1]||$s[$i]==$s[$i-1]&&$i?$r[$i]=+$i:0;echo join(",",$r);
Jörg Hülsermann
sumber
1

Ruby , 51 + 1 = 52 byte

Menggunakan -nbendera.

i=0;d=[];gsub(/./){$&==$_[i+=1]?d+=[i-1,i]:0};p d&d

Cobalah online!

Nilai Tinta
sumber
1

Batch, 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

Mengambil input pada STDIN. Bekerja dengan melacak berapa banyak angka yang akan dicetak dalam cvariabel, yang diatur ulang ke 2 ketika pasangan terdeteksi. Catatan: Dengan biaya 6 byte, dapat diperkeras untuk bekerja dengan sebagian besar karakter ASCII dan bukan hanya ABCD.

Neil
sumber
1

C #, 89 Bytes

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

Jika ada tiga atau lebih karakter berturut-turut indeks diulang. @Comrade SparklePony yang diizinkan di komentar.

Program lengkap tidak digabungkan:

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
sumber
1

QBIC , 42 byte

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

Output sampel:

Command line: AADCDBBD
 1             2 
 6             7 

Penjelasan:

;               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 sekarang memiliki Substring! Tantangan ini sekarang dapat diselesaikan dalam 32 byte:

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

Dimana:

_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
sumber
0

k, 14 byte

Ini adalah fungsi, mengambil string, dan mengembalikan daftar indeks.

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

Penjelasan:

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

Cobalah online!

Bagaimana cara menggunakan:

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

PHP, 70 byte

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

menerima input dari STDIN; jalankan bersama -R.

Titus
sumber