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


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.