Başlıktaki bitişik karakterler nerede? [3, 4]!


21

Başlık bilerek yanlış yazılmış. Nedenini bulmak için daha fazlasını okuyun.

Göreviniz: karakterleri içeren sınırlandırılmış bir dize veya liste verildiğinde A,B,C,D, bitişik eşit karakterlerin tümünün dizinlerini çıkarın. Çıktı, birden çok satırda birden çok dize / tam sayı, bir liste / dizi ya da ayrılmış bir dize olabilir.

Tüm çıktılar bir listede veya dizgede veya birden çok basılı satırda olmalıdır. Yazdırılan her satır, birden fazla varsa, yalnızca 1 dize veya sayı içermelidir. İzdekiler iyi.

Standart giriş / çıkış yöntemleri. Standart boşluklar uygulanır.

Örneğin, girdi 'ABCDDCBA'çıktısı vermeli 3,4veya 4,50- ila 1- indeksli olmasına bağlı olarak, bu sayılar indeksleri Dve Dyanındakiler olmalıdır.

Test durumları:

Test durumları, tek bir dize olarak verilen girdilere ve ,ayrılmış bir dize olarak çıktı verir. Çıktılar 0 indekslidir, 1 indeksli olması için çıkarılan her öğeye 1 ekleyin.

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'

Bu , yani en kısa kod kazanır!


Çıktıda takip eden bir sınırlayıcı olabilir mi?
Business Cat

@BasicSunset Tabii
Yoldaş SparklePony

1
@JonathanAllan Tamam, çünkü sadece bir liste çıktı.
Yoldaş SparklePony

2
Ardışık karakterlerin indeksleri birden çok kez görüntülenebilir mi? Örneğin üçüncü test durumu için de 3,4,4,5geçerlidir?
Luke,

1
Simetrik eşleşmeleri olmayan bir test durumu ekleyebilir misiniz? EgAABBCD -> 1,2,3,4
Riley,

Yanıtlar:


5

MATL , 8 7 bayt

d~ftQvu

Çıktı 1 tabanlıdır.

Çevrimiçi deneyin!

Örnek ile açıklama

Girişi düşünün '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

Retina , 33 29 23 bayt

Martin Ender sayesinde 6 bayt kaydedildi

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

Satır ayrılmış bir dizin listesi yazdırır.

Çevrimiçi deneyin!

açıklama

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

Yinelenen karakterlerin bulunduğu yerleri işaretlemek için aynı karakterdeki satırları virgüllere çevirir.

:
$.`¶

Ardından her iki sütunu önceki metnin uzunluğuyla değiştirin, ardından bir satır beslemesi yapın.

T`L

Son olarak, kalan harfleri silin.


7

Jöle , 7 bayt

JṁŒgḊÐf

1-esaslı yumuşatıcılar; OP'nin izin verdiği şekilde indeks dizilerinin bir listesini verir .

Çevrimiçi deneyin!

Nasıl?

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
- Keşke 05AB1E'nin 500 yapabileceği şeyler, lütfen.
Magic Octopus Urn

1
Bu dil gibi daha fazla hissediyorum burada bir tür hile gibi. : D
Avamander

@ComradeSparklePony neden kabul etme onayını geri alıyor?
Jonathan Allan

7

Brain-Flak , 57 46 bayt

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

İçin +2 içerir -ar

0 tabanlı endeksleme kullanır.

Çevrimiçi deneyin!

# 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 bayt

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

Aynı karaktere bitişik karakterlerin 1 indeksli pozisyonlarını döndüren saf fonksiyon.

Açıklama:

StringPosition["string","sub"]"sub"alt dizisi olarak görünen başlangıç ​​ve bitiş karakter konumlarının bir listesini verir "string". İki bitişik, aynı karakterle eşleşen x_~~x_bir StringExpressionkarakter. Mesela StringPosition["ABCDDDCBA",x_~~x_]verir {{4, 5}, {5, 6}}. Uygulamak Union, kopyaları listeler, sıralar ve siler.


5

Brain-Flak , 69, 59 , 56 bayt

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

Çevrimiçi deneyin!

-arASCII girişini sağlayan ve yığını tersine çeviren bayraklar için +2 bayt .

0 tabanlı endeksleme kullanır. Push-pop yedekliliğimi azaltarak 10 bayt kurtardı . 1'den 0'a dayalı dizinlemeyi değiştirerek 4 bayt daha kaydedildi.

Bu, beyin kırığının iyi olduğu tek ip tabanlı meydan okumadır. Bunun nedeni, beyin kırığının, genel olarak sicim işlemede korkunç olmasına rağmen, ardışık karakterleri karşılaştırmakta harika olmasıdır. İşte kodun nasıl çalıştığını açıklayan, yorumlu okunabilir versiyonu:

#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 düzeltildi! (Ve hala bir bayt daha kısa: P)
DJMcMayhem

Her zaman unutuyorum -r. Bu beni 46'ya indirdi.
Riley

5

Brachylog , 19 bayt

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

Çevrimiçi deneyin!

açıklama

Brachylog genellikle burada tekrar gösterilen endekslerle korkunç.

Eğer false.herhangi bir komşu karakter olduğu durumlarda kabul edilebilir bir çıkışı olan, o zaman bu değiştirerek 1 bayt az olacaktır ᶠdile .

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 bayt

Beni üç baytlık bir tasarruf yönünde işaret ettiği için ETHProductions sayesinde

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

Burada dene ! Çıktı endekslerinin 1 tabanlı olduğunu ve artan sırada olmadığını unutmayın.

Expanded:

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

açıklama

Bu, giriş karakterini karakter okuyarak çalışır. İki karakteri karşılaştırmak için, sadece karakter kodlarını çıkarırız ve sonuç 0 ise, yığının geçerli uzunluğunu, bir boşluğu, yığının geçerli uzunluğunu - 1 ve başka bir boşluk yazdırırız. Sonra yığını biraz temizledik ve tekrar okuma döngüsüyle başlıyoruz. Giriş dizesinin sonuna gelindiğinde, program durur.


Hmm, yığını oldukça temiz tutabiliyorsanız, #ihtiyaç duyduğunuzda yığının uzunluğunu almak için kullanabilirsiniz . (Ayrıca, LOL'ed ;_;kodda;))
ETHproductions

Temel bir örnek (muhtemelen tamamen golf oynamamıştır); ethproductions.github.io/cubix/… (Not: 1 indeksli, 0 indeksli değil)
ETHproductions

Hatırlatma için teşekkürler. Sürümünüzün bir baytını golf yaptım ve bunu da ekledim Anot bayt veya iki kapalı olabilir ...
Luke,

Fikir: peki ya beşinci sıra mantığının bir kısmını !$wyerine !wkoyduysanız ve dördüncü sıraya geçirdiyseniz? (Şu anda deneyemiyorum çünkü kapıyı
açıyorum

Bunu da düşündüm, ama bayttan tasarruf edeceğini sanmıyorum. Yine de deneyeceğim.
Luke,

3

C, 75 bayt

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

Sınırlayıcı olarak boşluk kullanır. (Sondaki virgül çok iyi görünmüyor.)

Çevrimiçi deneyin!


3

C # , 115 bayt


golfed

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

Ungolfed okunabilir

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

Tam kod

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

Bültenleri

  • v1.0 - 115 bytes- İlk çözüm.

notlar

Eklenecek bir şey yok



2

k, 18 bayt

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

Örnekler:

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

Çeviri yapmak qdaha kolay:

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

Bu benim de ilk çözümümdü! : D
zgrep

2

JavaScript, 52 bayt

1 bayt kapalı golf için NeNe teşekkürler

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

Girdiyi 0 dizinli karakter dizisi olarak alır.
Çıktıyı 1 indeksli bir dizi olarak döndürür

açıklama

x.map()

Dizedeki her karakter için

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

Bir önceki karaktere veya bir sonraki karaktere eşitse, + 1 dizinini döndür, aksi halde geri dönmez (dizide tanımsız kalır)

.filter(a=>a)

Tüm tanımsız öğeleri sonuç dizisinden kaldır

Çevrimiçi deneyin!


&&iBir bayttan tasarruf eder misiniz (...)*i?
Neil

@Neil && | 'dan daha hızlı | bu, her zaman geri
döndürülmesine

0|0&&60, 1|0&&66, 0|1&&66, 1|1&&66'dır. İstediğiniz bu değil mi?
Neil

Sanırım hala sahip olduğumu düşünüyordum || yerine |
f Aprnɛtɪk

Ah evet, bu açıklar.
Neil

2

Python 2, 55 54 bayt

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

Çevrimiçi Deneyin!

Boşluklarla ayrılmış indeksleri çıkarır (bunun bazı indeksleri OP'nin izin verdiğinin iki katı gösterdiğini unutmayın)


1

Perl 5 , 37 bayt

35 bayt kod + plbayrakları.

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

Çevrimiçi deneyin!

(?<=(.))\1|(.)(?=\2)İki tekrarlanan karakter arasında ( (?<=(.))\1) veya tekrarlanan bir karakterden önce ( ) eşleşir (.)(?=\2).
Ardından, print poseşleşmenin konumunu yazdırır. ( değiştiricili posbir regex'te kullanıldığında geçerli eşleşmenin dizinini içerir /g).



1

PHP, 100 Bayt

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

Toplu, 139 bayt

@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'de girişi ele alır. cDeğişkende kaç sayı yazdırılacağını izleyerek çalışır; bu bir çift algılandığında 2'ye sıfırlanır. Not: 6 byte pahasına, sadece ASCII karakterleriyle çalışmak için sertleştirilebilir ABCD.


1

C #, 89 Bayt

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

Bir satırda üç veya daha fazla karakter varsa, dizinler tekrarlanır. SparklePony @ Comrade Hangi yorumlarda izin verdi.

Ungolfed tam program:

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 bayt

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

Örnek çıktı:

Command line: AADCDBBD
 1             2 
 6             7 

Açıklama:

;               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 şimdi Substring var! Bu zorluk artık 32 byte olarak çözülebilir:

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

Nerede:

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

Bu bir fonksiyondur, bir dizgede yer alır ve bir indeks listesi döndürür.

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

Açıklama:

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

Çevrimiçi deneyin!

Nasıl kullanılır:

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

0

PHP, 70 bayt

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

STDIN'den girdi alır; ile koş -R.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.