2020-08-03 12:04:07 +02:00
const errorHandling = require ( '../../utils/errorHandling' )
const { requiredFields } = require ( '../../config/errors' )
const formatNumberResult = require ( '../secondary/formatNumberResult' )
2020-03-20 11:45:19 +01:00
2020-08-03 12:04:07 +02:00
/ * *
2020-03-20 11:45:19 +01:00
* @ description Retourne un tableau contenant toutes les possibilités d 'anagramme d' un mot .
* @ param { String } string - La chaîne de caractère à permuter
* @ returns { Array }
* @ examples heapAlgorithm ( 'abc' ) → [ "abc" , "acb" , "bac" , "bca" , "cab" , "cba" ]
* /
2020-08-03 12:04:07 +02:00
function heapAlgorithm ( string ) {
const results = [ ]
2020-03-20 11:45:19 +01:00
2020-08-03 12:04:07 +02:00
if ( string . length === 1 ) {
results . push ( string )
return results
}
2020-03-20 11:45:19 +01:00
2020-08-03 12:04:07 +02:00
for ( let indexString = 0 ; indexString < string . length ; indexString ++ ) {
const firstChar = string [ indexString ]
const charsLeft = string . substring ( 0 , indexString ) + string . substring ( indexString + 1 )
const innerPermutations = heapAlgorithm ( charsLeft )
for ( let indexPermutation = 0 ; indexPermutation < innerPermutations . length ; indexPermutation ++ ) {
results . push ( firstChar + innerPermutations [ indexPermutation ] )
2020-03-20 11:45:19 +01:00
}
2020-08-03 12:04:07 +02:00
}
return results
}
2020-03-20 11:45:19 +01:00
/* OUTPUTS */
2020-08-03 12:04:07 +02:00
module . exports = ( { res , next } , argsObject ) => {
const { string } = argsObject
2020-03-20 11:45:19 +01:00
2020-08-03 12:04:07 +02:00
// S'il n'y a pas les champs obligatoire
if ( ! ( string ) ) {
return errorHandling ( next , requiredFields )
}
// Si la chaîne de caractère dépasse LIMIT_CHARACTERS caractères
const LIMIT _CHARACTERS = 7
if ( string . length > LIMIT _CHARACTERS ) {
return errorHandling ( next , { message : ` Par souci de performance, vous ne pouvez pas exécuter cette fonction avec un mot dépassant ${ LIMIT _CHARACTERS } caractères. ` , statusCode : 400 } )
}
2020-03-20 11:45:19 +01:00
2020-08-03 12:04:07 +02:00
const result = heapAlgorithm ( string )
let resultHTML = ` <p>Il y a ${ formatNumberResult ( result . length ) } possibilités d'anagramme pour le mot " ${ string } " qui contient ${ string . length } caractères, la liste : <br/><br/> `
result . forEach ( ( string ) => {
resultHTML += string + '<br/>'
} )
resultHTML += '</p>'
return res . status ( 200 ) . json ( { result , resultHTML } )
}