Lettere tra due lettere


22

Scrivi un programma che accetta una singola parola minuscola come input e genera il numero di coppie di lettere che hanno lo stesso numero di lettere tra loro nella parola e nell'alfabeto.

Ad esempio, nella parola "natura", abbiamo 4 coppie:

  • nr: poiché ci sono tre lettere tra loro all'interno della parola (a, t, u) e tre lettere tra loro nell'alfabeto (o, p, q)
  • ae: poiché ci sono tre lettere tra loro all'interno della parola (t, u, r) e tre lettere tra loro nell'alfabeto (b, c, d)
  • tu: poiché non ci sono lettere tra loro all'interno della parola e nessuna lettera tra loro nell'alfabeto
  • tr: poiché c'è una lettera tra loro all'interno della parola (u) e una lettera tra loro nell'alfabeto (i)

Poiché ci sono quattro coppie, l'output in questo caso dovrebbe essere 4.


10
La formulazione può essere chiarita un po 'di più.
— Ottimizzatore

Non capisco la domanda. Come vengono le lettere una , t , u sta per essere all'interno nr ? E tutti i seguenti esempi ... (cc @flodel)
— nicael

Se spieghi la natura, n e r sono in prima e in quinta posizione. Quindi ci sono tre lettere tra loro. Sono a, t eu, in seconda, terza e quarta posizione. Questo è ciò che il testo significa che ci sono tre lettere tra n e r all'interno della parola .
— flodel

@flodel Hai ragione nella modifica; Ho perso la 4a coppia.
— ghosts_in_the_code il

E se la parola fosse rjjjnfffr? Sarebbe una coppia ( nr) o due coppie ( nre rn)? E che dire abzab? Sono due coppie di abo una?
— Non che Charles il

Risposte:


5

Pyth, 19 byte

lfqF-MSMCT.cCUBCMz2

Provalo online: dimostrazione

Spiegazione:

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 byte

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}

Degolfed:

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 byte

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

Uso:

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

Spiegazione:

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

Provalo online qui.


2

CJam, 25 byte

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

Provalo online

Spiegazione:

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 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)

uso

f("nature")
=> 4

Spiegazione

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 caratteri

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 byte

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

Questa riga richiede una stringa come input. Crea quindi tutte le possibili coppie di lettere e fa lo stesso per i loro indici corrispondenti. Quindi determiniamo se la differenza (assoluta) dei valori corrisponde per sommare finalmente tutti i casi in cui lo fa. Il risultato viene visualizzato nella finestra di comando.


1

JavaScript ES7, 93

Usando la comprensione dell'array . ES6 con .map.map.mapè di 2 byte più lungo.

Prova a eseguire lo snippet di seguito con 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 byte

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

Abbastanza diretto, ma usa un paio di trucchi.

  • param(..)prende il nostro input, lo salva $a.
  • Impostiamo una variabile temp $bin modo che sia il .lengthnostro input. Questo salva un byte dopo.
  • 0..($b-1)|%{..}è l'equivalente di un for($i=0;$i-le($b-1);$i++){..}loop, ma molto più breve.
  • Tuttavia, abbiamo bisogno di impostare la variabile $iper continuare a andare in ...
  • ($_+1)..$b|%{..}il forciclo successivo , poiché $_è solo posizionale al ciclo interno.
  • Quindi utilizziamo una lunga chiamata .NET per verificare se il valore assoluto tra i nostri due caratteri (qui utilizziamo il cast implicito con prepending +per salvare un mucchio di byte) è -eqidentico alla differenza di posizione nell'array. Poiché ci viene esplicitamente fornito un input in minuscolo, non è necessario eseguire la conversione del caso. Questa dichiarazione restituirà Trueo False.
  • Usiamo palesemente di nuovo il cast implicito per accumulare quel risultato $o, quindi Trueaggiungeremo 1, mentre Falseaggiungeremo 0.
  • Una volta terminati i loop, eseguiamo l'output $o. Nota che dobbiamo fare lo stesso tricksy-cast-to-int con +per evitare di stampare Falsese non ci sono corrispondenze.

0

Ruby, 74

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

Niente di molto interessante qui. Mi sarebbe piaciuto usare eval("s[i].#{["succ"]*(j-i)*?.}")ma ... sembrava troppo lungo.


0

Matlab(94)(80)

Modifica: non ho preso nel caso in ordine alfabetico inverso, come (t, r) in 'natura', quindi più byte per sovrappeso :(

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

  • la funzione binomiale genera una stupida eccezione quando k è più grande di n e non riesco a rilevare eccezioni all'interno arraycell funzione, altrimenti potrei golf di più. Chi ha bisogno di una funzione integrata ??

    Ora potrei farlo a mano, semplificando il binomio (n, 2) = n / (2 (n-2)!) = N (n-1) / 2. osserva che quest'ultimo valore rappresenta la somma di numeri interi da 1 a n-1, ciò non genera alcuna eccezione in MATLAB, che Dio benedica la matematica.

  • Ps: questo metodo è diverso da quello di slvrbld

Esecuzione

  >> ans('abef')

  ans =

       2

  >> ans('abcd')

  ans =

       6

  >> ans('nature')

  ans =

       4

Penso che sia sicuro rimuovere , 's' dagli argomenti di input (). Ti fa risparmiare 4 byte. Inoltre, sembra non riuscire su stringhe più lunghe (ad es. "Supercalifragilisticexpialidocious" che flodel ha usato come test case) a causa della gamma hardcoded for-loop ... potresti voler risolvere questo problema.
— slvrbld,

@slvrbld non credo di averne bisogno, vedi la modifica più recente
— Abr001am
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.