2つの文字の間の文字


22

単一の小文字の単語を入力として受け入れ、単語内でアルファベットと同じ文字数の文字のペアの数を出力するプログラムを作成します。

たとえば、「自然」という単語には、4つのペアがあります。

  • nr:単語内の文字(a、t、u)の間に3つの文字があり、アルファベット(o、p、q)の文字の間に3つの文字があるため
  • ae:単語内の文字(t、u、r)とアルファベットの文字(b、c、d)の間に3文字あるため
  • tu:単語内では文字間に文字がなく、アルファベットでは文字間に文字がないため
  • tr:単語(u)内の文字とアルファベット(s)の間に文字が1つあるため

4つのペアがあるため、この場合の出力は4になります。


10
言葉遣いはもう少し明確にすることができます。
オプティマイザー

質問がありません。文字atuはどのようにnrの中に入るのですか?そして、以下のすべての例...(cc @flodel)
-nicael

自然を綴ると、nとrは1番目と5番目の位置にあります。そのため、それらの間に3つの文字があります。それらは、2番目、3番目、4番目の位置にあるa、t、およびuです。これは、単語内にnとrの間に3つの文字があるという意味です。
flodel

@flodelあなたは編集に正解です。4番目のペアを逃しました。
ghosts_in_the_code

言葉がrjjjnfffrどうだった?それは1つのペア(nr)または2つのペア(nrおよびrn)ですか?そして、どうabzabですか?それは2つのペアabですか、それとも1 つのペアですか?
チャールズではない

回答:


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

Python 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ます。
  • 私たちは、一時変数を設定$bする.length私たちの入力の。これにより、あと1バイト節約できます。
  • 0..($b-1)|%{..}for($i=0;$i-le($b-1);$i++){..}ループに相当しますが、かなり短くなります。
  • しかし、それ$iを維持するには変数を設定する必要があります...
  • ($_+1)..$b|%{..}次のforループ$_。内側のループに対してのみ位置するためです。
  • 次に、長い.NET呼び出しを使用して、2つの文字の間の絶対値(ここでは、暗黙的なキャストを使用+して、大量のバイトを保存します)が-eq配列の位置の違いに一致するかどうかを確認します。小文字の入力が明示的に与えられているため、大文字小文字の変換を行う必要はありません。このステートメントはTrueまたはを返しますFalse
  • 暗黙のキャストを再び露骨に乱用して$o、その結果をに蓄積します。したがってTrue、1 Falseを追加し、0を追加します。
  • ループが終了したら、を出力します$o。一致しなかった場合の+印刷を避けるために、同じトリックを使ったintへのキャストを行う必要があることに注意してください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

Matlab(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できません。そうでなければ、もっとゴルフをすることができます。 組み込み機能が必要なのは誰ですか?

    これで、binomial(n、2)= n /(2(n-2)!)= n(n-1)/ 2を単純化して、手動で実行できます。この最後の値は、1からn-1の整数の合計を表していることに注意してください。これは、matlab、God bless mathsでは例外をスローしません。

  • PS:この方法はslvrbldの方法とは異なります

実行

  >> ans('abef')

  ans =

       2

  >> ans('abcd')

  ans =

       6

  >> ans('nature')

  ans =

       4

input()の引数から、 's'を削除しても安全だと思います。4バイト節約します。さらに、for-loopの範囲がハードコードされているため、長い文字列(flodelがテストケースとして使用した「supercalifragilisticexpialidocious」など)で失敗するようです。これを修正することもできます。
slvrbld

@slvrbld私はそれが必要だとは思わない、最新の編集を参照してください
-Abr001am
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.