Букви між двома літерами


22

Напишіть програму, яка приймає одне мале слово як вхідне та виводить кількість пар літер, які мають однакову кількість літер між ними в слові, як в алфавіті.

Наприклад, у слові "природа" ми маємо 4 пари:

  • nr: оскільки між ними три слова (a, t, u) і три букви між ними в алфавіті (o, p, q)
  • ae: оскільки між ними три слова (t, u, r) і три букви між ними в алфавіті (b, c, d)
  • tu: оскільки між ними немає букв між словом і між ними в алфавіті немає літер
  • tr: оскільки є одна буква між ними всередині слова (u) та одна буква між ними в алфавіті

Оскільки є чотири пари, вихід у цьому випадку повинен бути 4.


10
Формулювання може бути уточнено трохи більше.
— Оптимізатор

Я не розумію цього питання. Як букви a , t , u будуть знаходитися всередині nr ? І всі наступні приклади ... (cc @flodel)
— nicael

Якщо прописати природу, то n і r знаходяться на 1-й та 5-й позиціях. Отже, між ними три букви. Вони є a, t і u, на 2-й, 3-й та 4-й позиції. Ось, що означає текст, є три літери між n і r всередині слова .
— flodel

@flodel Ви маєте рацію в редагуванні; Я пропустив 4-ю пару.
— ghosts_in_the_code

Що якби слово було rjjjnfffr? Це була б одна пара ( nr) або дві пари ( nrі rn)? А про що abzab? Це дві пари abчи одна?
— Не те, що Чарльз

Відповіді:


5

Pyth, 19 байт

lfqF-MSMCT.cCUBCMz2

Спробуйте в Інтернеті: Демонстрація

Пояснення:

lfqF-MSMCT.cCUBCMz2
                 z   read a string from input
               CM    convert into list of ascii-values
            CUB      create a list of pairs (ascii-value, index in string)
          .c      2  all combinations of length 2
 f                   filter for combinations T, which satisfy:
        CT              transpose T ((ascii1, ascii2), (index1, index2)
      SM                sort each list
    -M                  create the the difference for each
  qF                    check if they are equal
l                    print the number of remaining combinations

4

R, 110 байт

function(s){w=strsplit(s,"")[[1]]
O=outer
n=nchar(s)
sum(abs(O(r<-match(w,letters),r,"-"))==O(1:n,1:n,"-"))-n}

Дегольф:

F = function(s){
   chars = strsplit(s,"")[[1]]
   num_chars = nchar(s)
   letter_rank = match(chars, letters)
   rank_dist = abs(outer(letter_rank, letter_rank, "-"))
   position_dist = outer(1:num_chars, 1:num_chars, "-")
   return(sum(rank_dist == position_dist) - num_chars)
}

F("nature")
# [1] 4
F("supercalifragilisticexpialidocious")
# [1] 25



2

J, 27 байт

#-:@-~#\+/@,@:=&(|@-/~)3&u:

Використання:

   (#-:@-~#\+/@,@:=&(|@-/~)3&u:) 'nature'
4

Пояснення:

#-:@-~#\+/@,@:=&(|@-/~)3&u:
      #\                    lengths of input prefixes (1,2,...,length)
                       3&u: codepoints of input
               &(     )     with the last two do parallel:
                 |@-/~      create difference table with itself and take absolute values
              =             compare the elements of the two difference tables
        +/@,@:              sum the table              
#   -~                      subtract the length of the input (self-similar letters)
 -:@                        half the result (each pair was accounted twice)

Спробуйте його онлайн тут.


2

CJam, 25 байт

l:T,_2m*{_:-\Tf=:-z=},,\-

Спробуйте в Інтернеті

Пояснення:

l     Get input.
:T    Store in variable T for later use.
,     Calculate length.
_     Copy for use at the very end.
2m*   Use Cartesian power to calculate all possible position pairs.
{     Start filter.
  _     Create copy of index pair.
  :-    Calculate difference between indices.
  \     Swap copy of index pair to top.
  T     Get input string stored in variable T.
  f=    Extract the letters for the index pair.
  :-    Calculate difference of the two letters.
  z     Take the absolute value.
  =     Compare index difference and letter difference.
},    End filter.
,\
-     Pairs of identical indices passed the filter. Eliminate them from the
      count by subtracting the length of the input.

2

JavaScript (ES6), 98 байт

f=w=>(p=0,q="charCodeAt",[...w].map((c,a)=>{for(b=a;w[++b];)p+=Math.abs(w[q](a)-w[q](b))==b-a}),p)

Використання

f("nature")
=> 4

Пояснення

f=w=>(
  p=0,                                 // p = number of pairs
  q="charCodeAt",
  [...w].map((c,a)=>{                  // iterate through each character of input
                                       // a = character A index
    for(b=a;w[++b];)                   // iterate through the remaining input characters
                                       // b = character B index
      p+=                              // add 1 to p if true or 0 if false
        Math.abs(w[q](a)-w[q](b))==b-a // compare absolute difference of character codes
                                       //     to difference of indices
  }),
  p                                    // return p
)

1

Пітон 2, 91 символів

lambda i:sum(y-x==abs(ord(i[y])-ord(i[x]))for x in range(len(i))for y in range(x+1,len(i)))

1

MATLAB, 84 байти

s=input('');disp(sum(diff(nchoosek(find(s),2),[],2)==abs(diff(nchoosek(s,2),[],2))))

Цей рядок запитує рядок як вхідний. Потім він створює всі можливі пари літер і робить те саме для відповідних їм індексів. Тоді ми визначаємо, чи відповідає (абсолютна) різниця значень, щоб остаточно підсумовувати всі випадки, коли це відбувається. Результат відображається у вікні команд.


1

JavaScript ES7, 93

Використання розуміння масиву . ES6 з .map.map.mapна 2 байти довше.

Випробуйте запуск фрагмента нижче за допомогою Firefox

f=s=>[for(x of s)x.charCodeAt()].map((a,i,s)=>s.map((b,j)=>t+=j>i&(b>a?b-a:a-b)==j-i),t=0)&&t

document.write('nature'+'\n'+f('nature'))


1

PowerShell, 114 100 байт

param($a)$b=$a.length;0..($b-1)|%{$i=$_;($_+1)..$b|%{$o+=[math]::Abs(+$a[$_]-$a[$i])-eq($_-$i)}};+$o

Досить прямо, але використовує пару трюків.

  • param(..)бере наш внесок, зберігає його $a.
  • Ми встановлюємо змінну temp, $bяка буде .lengthнашим входом. Це економить байт пізніше.
  • 0..($b-1)|%{..}є еквівалентом for($i=0;$i-le($b-1);$i++){..}циклу, але досить значно коротшим.
  • Однак нам потрібно встановити змінну $i, щоб продовжувати це робити ...
  • ($_+1)..$b|%{..}наступна forпетля, оскільки $_позиціонує лише внутрішню петлю.
  • Потім ми використовуємо тривалий виклик .NET, щоб перевірити, чи абсолютне значення між нашими двома символами (тут ми використовуємо неявне кастинг із попередньою формою +для збереження купи байтів) не -eqвідповідає позиційній різниці масиву. Оскільки нам явно надано малі літери, нам не потрібно робити перетворення справ. Ця заява поверне Trueабо False.
  • Ми нахабно зловживаємо неявним кастингом знову для накопичення цього результату $o, тому Trueдодамо 1, тоді як Falseдодамо 0.
  • Як тільки петлі закінчені, ми виводимо $o. Зауважте, що нам потрібно виконати ті ж хитрощі для передачі, +щоб уникнути друку, Falseякщо не було збігів.

0

Рубі, 74

 ->s{[*0...s.size].permutation(2).count{|i,j|(s[i].ord-s[j].ord).abs==j-i}}

Нічого супер цікавого тут. Я б хотів використовувати, eval("s[i].#{["succ"]*(j-i)*?.}")але ... здавався занадто довгим.


0

Матлаб(94)(80)

Редагувати: Я не приймав у разі переверненого алфавітного порядку, як (t, r) у "природі", тому більше байтів до надмірної ваги :(

@(a)sum(arrayfun(@(x)sum(1:nnz(find(a==fix(x/2)+(-1)^x*(1:1:nnz(a))))-1),2:244))

  • біноміальна функція кидає дурний виняток, коли k більший за n, і я не можу ловити винятки всередині arraycellфункції, інакше я міг би її більше. Кому потрібна вбудована функція ??

    Тепер я міг би це зробити вручну, спростивши біноміальну (n, 2) = n / (2 (n-2)!) = N (n-1) / 2. зауважте, що ця остання величина представляє цілі числа від 1 до n-1, це не кидає жодного винятку в matlab, Бог благословляє математику.

  • Пс: цей метод відрізняється від методу slvrbld

Виконання

  >> ans('abef')

  ans =

       2

  >> ans('abcd')

  ans =

       6

  >> ans('nature')

  ans =

       4

Я думаю , що це безпечно видалити , «S» від входу () 's аргументи. Економить 4 байти. Крім того, здається, що це не вдається на довших рядках (наприклад, "supercalifragilisticexpialidocious", який флодель використовував як тестовий випадок) через жорстко кодований діапазон для циклу ... Ви, можливо, захочете це виправити.
— slvrbld

@slvrbld я Думаю, я не думаю, що мені це потрібно, дивіться
— останню редакцію
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.