Buchstaben zwischen zwei Buchstaben

22

Schreiben Sie ein Programm, das ein einzelnes Wort in Kleinbuchstaben als Eingabe akzeptiert und die Anzahl der Buchstabenpaare ausgibt, zwischen denen sich im Wort die gleiche Anzahl von Buchstaben befindet wie im Alphabet.

Zum Beispiel haben wir im Wort 'Natur' 4 Paare:

  • nr: da drei Buchstaben im Wort (a, t, u) und drei Buchstaben im Alphabet (o, p, q) dazwischen stehen
  • ae: da drei Buchstaben im Wort (t, u, r) und drei Buchstaben im Alphabet (b, c, d) dazwischen stehen
  • tu: da im wort keine buchstaben dazwischen und im alphabet keine buchstaben dazwischen sind
  • tr: da es einen Buchstaben zwischen ihnen im Wort (u) und einen Buchstaben zwischen ihnen im Alphabet (s) gibt

Da es vier Paare gibt, sollte der Ausgang in diesem Fall 4 sein.

ghosts_in_the_code
quelle
10
Der Wortlaut kann noch etwas präzisiert werden.
Optimierer
Ich verstehe die Frage nicht. Wie werden die Buchstaben a , t , u in nr sein ? Und alle folgenden Beispiele ... (cc @flodel)
nicael
Wenn Sie die Natur buchstabieren, befinden sich n und r an der 1. und 5. Stelle. Es stehen also drei Buchstaben dazwischen. Sie sind a, t und u auf der 2., 3. und 4. Position. Das bedeutet, dass der Text drei Buchstaben zwischen n und r im Wort enthält .
Flodel
@flodel Du bist richtig in der Bearbeitung; Ich habe das 4. Paar verpasst.
ghosts_in_the_code
Was wäre, wenn das Wort wäre rjjjnfffr? Wäre das ein Paar ( nr) oder zwei Paare ( nrund rn)? Und was ist mit abzab? Sind das zwei Paare aboder eins?
Nicht dass Charles

Antworten:

5

Pyth, 19 Bytes

lfqF-MSMCT.cCUBCMz2

Probieren Sie es online aus: Demonstration

Erläuterung:

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
Jakube
quelle
4

R, 110 Bytes

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}

Entgolfet:

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
Flodel
quelle
3

Oktave, 41 Bytes

@(s)nnz(abs(s-s')==(t=1:(u=nnz(s)))-t')-u
Alephalpha
quelle
2

J, 27 Bytes

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

Verwendung:

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

Erläuterung:

#-:@-~#\+/@,@:=&(|@-/~)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)

Probieren Sie es hier online aus.

randomra
quelle
2

CJam, 25 Bytes

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

Probieren Sie es online aus

Erläuterung:

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.
Reto Koradi
quelle
2

JavaScript (ES6), 98 Byte

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)

Verwendung

f("nature")
=> 4

Erläuterung

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
)
user81655
quelle
1

Python 2, 91 Zeichen

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)))
TFeld
quelle
1

MATLAB, 84 Bytes

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

Diese Zeile fordert eine Zeichenfolge als Eingabe an. Anschließend werden alle möglichen Buchstabenpaare erstellt und für die entsprechenden Indizes die gleichen Schritte ausgeführt. Dann bestimmen wir, ob die (absolute) Differenz der Werte übereinstimmt, um schließlich alle Fälle zu summieren, in denen dies der Fall ist. Das Ergebnis wird im Befehlsfenster angezeigt.

slvrbld
quelle
1

JavaScript ES7, 93

Mit Array Verständnis . ES6 mit.map.map.map ist 2 Byte länger.

Testen Sie das folgende Snippet mit 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'))

edc65
quelle
1

PowerShell, 114 100 Bytes

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

Ziemlich unkompliziert, benutzt aber ein paar Tricks.

  • param(..) Nimmt unsere Eingabe, speichert es auf $a .
  • Wir setzen eine temporäre Variable $bals .lengthEingabe. Dadurch wird ein Byte später gespeichert.
  • 0..($b-1)|%{..} ist das Äquivalent von a for($i=0;$i-le($b-1);$i++){..} Schleife, aber viel kürzer.
  • Wir müssen jedoch eine Variable $isetzen, damit das so bleibt ...
  • ($_+1)..$b|%{..}die nächste forSchleife seit$_ nur positionell zur inneren Schleife.
  • Wir verwenden dann einen längeren .NET-Aufruf, um zu überprüfen, ob der absolute Wert zwischen unseren beiden Zeichen (hier verwenden wir implizites Casting mit vorangestelltem Zeichen +, um eine Reihe von Bytes zu speichern) -eqdem Positionsunterschied im Array entspricht. Da explizit Kleinbuchstaben eingegeben werden, ist keine Konvertierung der Groß- und Kleinschreibung erforderlich. Diese Anweisung gibt entweder Trueoder zurück False.
  • Wir missbrauchen offen implizites Casting erneut, um dieses Ergebnis zu akkumulieren $o, also Trueaddieren wir 1, während wir False0 addieren.
  • Sobald die Schleifen beendet sind, geben wir aus $o. Beachten Sie, dass wir das gleiche trickreiche Cast-to-Int ausführen müssen, um +zu vermeiden, dass gedruckt wird, Falsewenn keine Übereinstimmungen vorhanden sind.
AdmBorkBork
quelle
0

Rubin, 74

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

Nichts super interessantes hier. Am liebsten hätte ich verwendet, eval("s[i].#{["succ"]*(j-i)*?.}")aber ... schien zu lang.

Nicht dieser Charles
quelle
0

Matlab(94)(80)

Bearbeiten: Ich habe nicht in umgekehrter alphabetischer Reihenfolge, wie (t, r) in "Natur", so mehr Bytes zu upweight genommen :(

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

  • Die Binomialfunktion löst eine dumme Ausnahme aus, wenn k größer als n ist und ich Ausnahmen in der arraycellFunktion nicht fangen kann, da ich sonst mehr Golf spielen könnte. Wer braucht eine eingebaute Funktion?

    Jetzt könnte ich es einfach von Hand tun und das Binom (n, 2) = n / (2 (n-2)!) = N (n-1) / 2 vereinfachen. Beachten Sie, dass dieser letzte Wert die Summe der ganzen Zahlen von 1 bis n-1 darstellt. Dies macht in Matlab keine Ausnahme. Gott segne Mathe.

  • Ps: Diese Methode ist anders als die von slvrbld

Ausführung

  >> ans('abef')

  ans =

       2

  >> ans('abcd')

  ans =

       6

  >> ans('nature')

  ans =

       4
Abr001am
quelle
Ich denke , es ist sicher zu entfernen , ‚s‘ vom Eingang () 's Argumente. Speichert Sie 4 Bytes. Darüber hinaus scheint es bei längeren Zeichenfolgen (z. B. "supercalifragilisticexpialidocious", das als Testfall verwendet wird) aufgrund des hartcodierten for-loop-Bereichs zu scheitern. Vielleicht möchten Sie dies beheben.
Slvrbld
@slvrbld Ich glaube nicht, dass ich das brauche, siehe die neueste Bearbeitung
Abr001am