Multiples de longueur de mot

Sep 21 2020

Un port de mon autre question: Double Prime Words

Considérons un mot / une chaîne de ncaractères alphanumériques avec la somme des caractères s,, en utilisant leur position numérique dans l'alphabet ( a=1, B=2, c=3,etc.) ou une valeur numérique (0,1, 2, 3 - 9). Les caractères numériques doivent être pris à leur valeur individuelle. ( 66correspond à deux 6caractères pour une somme de 12)

Un mot est un multiple de longueur-somme si et seulement si sest un multiple de n, spécifiquement s/nest un entier positif {1,2,3,4...}. Dans le cas de s=0, et n={0,00,000,...}, 0 est un multiple de any nmais il ne produit pas un entier positif. Par conséquent, une entrée de {0,00,000,...}est False.

L'entrée peut être n'importe quelle combinaison de chiffres et de caractères alphabétiques majuscules ou minuscules, car il n'y a pas de différence numérique entre aou A. La gestion d'une entrée vide,, n=s=0n'est pas requise.

La sortie est tout format logique approprié lié à votre langue. c'est-à-dire Vrai ou Faux, T ou F, 1 ou 0, positif pour la vérité et 0 pour la fausse, etc. Spécifier le format de votre sortie est très apprécié, mais pas obligatoire. (La sortie n'a pas besoin d'inclure n ou s, mais je les inclut ci-dessous comme démonstration et exemple)

Condition gagnante: En aussi peu d'octets que possible, écrivez une fonction capable de déterminer si une chaîne est un multiple de longueur-somme.

Exemples

Input -> Output (n,s) 

hello -> False (5, 52) 
MuLtIpLe -> False (8, 108)
Junct10n -> False (8, 83)
Order66 -> False (7, 72)
CodeGolf -> False (8, 67)
SUM -> False (3, 53)
ID -> False (2, 13)

25 -> False (2, 7)
0 -> False (1, 0) 0/1 = 0 which is not a positive integer
10 -> False (2, 1) 

hello2 -> True (6, 54)
5um -> True (3, 39)
length -> True (6, 66)
Order64 -> True (7, 70)
Covid19 -> True (7, 63)
Word -> True (4, 60)
APPLE -> True (5, 50)
lawYER -> True (6, 84)
abc123 -> True (6, 12)
is -> True (2, 28)
television -> True (10, 130)
19 -> True (2, 10)
234 -> True (3, 9)

a -> True (1, 1)
b -> True (1, 2)
C -> True (1, 3)
Z -> True (1, 26)
1 -> True (1, 1)
9 -> True (1, 9)

Réponses

4 KevinCruijssen Sep 21 2020 at 15:42

05AB1E , 16 15 octets

þIáÇ32%«ODXgÖ*Ā

Saisie sous forme de liste de caractères.

-1 octet implicitement grâce à @ovs .

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

þ                # Only leave the digits of the (implicit) input-list
 Iá              # Push the input-list again, and only leave its letters
   Ç             # Convert each letter to its codepoint integer
    32%          # Take modulo-32 on each codepoint
       «         # Merge it to the list of digits
        O        # Sum this list
         D       # Duplicate this sum
          Ig     # Push the input-list again, and pop and push its length
            Ö    # Check if the sum is divisible by this length
             *   # Multiply it by the duplicated sum
              Ā  # And check that this is NOT 0
                 # (after which the result is output implicitly)

3 octets ( D*Ā) sont utilisés pour les bordures 0/ 00/ 000/ etc.

4 JonathanAllan Sep 21 2020 at 17:44

Gelée ,  12  11 octets

ŒlO%48Sȯ.%L

Un lien monadique acceptant une liste de caractères qui donne zéro (falsey) si la chaîne est une longueur-somme-multiple ou un nombre non nul (vrai) sinon.

Essayez-le en ligne! Ou voir la suite de tests .

Comment?

ŒlO%48Sȯ.%L - Link: list of characters, w  e.g. "ID"       "10"     "19"     "0...0"
Œl          - lower-case (w)                    "id"       "10"     "19"     "0...0"
  O         - ordinals                          [105,100]  [49,48]  [49,57]  [48,...,48]
    48      - forty-eight                       48         48       48       48
   %        - modulo                            [9,4]      [1,0]    [1,9]    [0,...,0]
      S     - sum                               13         1        10       0
        .   - a half                            0.5        0.5      0.5      0.5
       ȯ    - logical OR                        13         1        10       0.5
         L  - length (w)                        2          2        2        length(w)
        %   - modulo                            1          1        0        0.5
                                               (nope       nope     yep!     nope)
4 Noodle9 Sep 21 2020 at 16:22

C (gcc) , 73 \$\cdots\$ 63 61 octets

Sauvé un 3 octets grâce à plafonnier !!!

n;u;f(char*s){for(n=u=0;*s;++n)u+=*s&15+*s++/64*16;u*=u%n<1;}

Essayez-le en ligne!

Entre une chaîne et renvoie une vérité s'il s'agit d'un multiple de longueur-somme ou d'un faux dans le cas contraire.

4 Jonah Sep 21 2020 at 18:40

J , 29 24 octets

#(|=0=])1#.48|64|96|3&u:

Essayez-le en ligne!

-5 octets grâce à xash

Inspiré par la réponse de Neil - assurez-vous de le voter.

  • 3&u: transforme la chaîne en codes ascii
  • 96| modifie les lettres minuscules dans la plage 1-26
  • 64| modifie les lettres majuscules dans la plage 1-26
  • 48| modifie les chiffres dans la plage 0-9
  • 1#. somme de tous ces chiffres convertis
  • # (à l'extrême gauche) longueur de la chaîne
  • (|=0=])Nous vérifions d'abord si la somme est nulle 0=]- elle reviendra 1quand elle l'est et 0autrement. Ensuite, nous vérifions si somme mod la longueur |est égale à cela . Ainsi, pour que la phrase entière retourne vrai, il faut que la somme soit à la fois divisible par sa longueur et non nulle.

Pourquoi ne pouvez-vous pas simplement utiliser un seul mod 32 au lieu de faire un 96 suivi d'un 64?

Avec 32, vous affecteriez également les valeurs 0-9. Avec 96/64, vous corrigez les lettres sans toucher les chiffres, et maintenant, comme les lettres sont toutes de 26 et moins, lorsque vous fixez les chiffres, les lettres déjà fixées ne sont pas affectées.

3 JonathanAllan Sep 21 2020 at 18:30

Python 3 , 54 octets

lambda s:(sum(ord(c)%48for c in s.lower())or.5)%len(s)

Une fonction sans nom acceptant une chaîne qui renvoie zéro (falsey) si la chaîne est une longueur-somme-multiple ou un nombre différent de zéro (vérité) sinon.

Essayez-le en ligne! Ou voir la suite de tests .

3 DominicvanEssen Sep 21 2020 at 15:48

R , 63 62 57 56 octets

Edit: sauvé 1 octet grâce à Jonah

function(s)!sum(i<-utf8ToInt(s)%%96%%64%%48)%%nchar(s)&i

Essayez-le en ligne!

La sortie est une liste Truthy d'un ou plusieurs TRUE, ou une liste Falsy d'un ou plusieurs FALSE.

3 user Sep 21 2020 at 17:10

Scala, 71 62 46 octets

  • Réponse fixe grâce à @Mr Redstoner
  • Sauvegardé 9 octets grâce à @Dominic Van Essen
  • Sauvé 16 octets! grâce au conseil donné par @xash sur la réponse de Jonah , suggérée par Dominic Van Essen.
s=>{val x=(0/:s)(_+_%96%64%48);x>0&x%s.size<1}

Essayez-le en ligne

32 octets si zéro n'était pas faux

s=>(0/:s)(_+_%96%64%48)%s.size<1

Essayez-le en ligne

3 MrRedstoner Sep 21 2020 at 18:18

Java 79 77 68 66 64 octets

s->{int u=0;for(int c:s)u+=c%96%64%48;return u>0&u%s.length<1;};

Essayez-le ici!

Ma toute première réponse! Le cas de test "0" m'a gâché, sans lui j'aurais pu avoir 51, (je voulais essayer de contester la réponse C, à partir de laquelle j'ai emprunté la conversion char-to-number). Maintenant à peu près un port de la réponse C.

s->s.chars().map(c->c%96%64%48).sum()%s.length()<1;

Toujours assez fier de battre certaines des réponses actuelles dans des langages comme Python et JavaScript en utilisant le Java «oh so verbose».

Merci à @user pour quelques octets supplémentaires enregistrés

@ceilingcat pour quelques autres

@ dominic-van-essen pour 2 autres utilisant l'idée de @ xash

2 ovs Sep 21 2020 at 15:42

Python 3.8 , 59 octets

lambda d:1>(x:=sum(int(c,36)-9*(c>'9')for c in d))%len(d)<x

Essayez-le en ligne!

2 Neil Sep 21 2020 at 17:55

Charbon , 18 octets

≔ΣE↧θ﹪℅ι⁴⁸η∧η¬﹪ηLθ

Essayez-le en ligne! Le lien est vers la version verbeuse du code. La sortie est un booléen Charcoal, c'est- -à- dire pour un multiple, rien sinon. Explication:

≔ΣE↧θ﹪℅ι⁴⁸η

Convertissez la chaîne en minuscules, prenez les points de code de tous les caractères, réduisez-les modulo 48, puis prenez la somme.

∧η¬﹪ηLθ

Vérifiez que la somme est un multiple différent de zéro de la longueur de la chaîne.

2 DomHastings Sep 21 2020 at 18:47

Perl 5 + -plF, 32 octets

-7 octets grâce à @Nahuel Fouilleul !

$s+=ord(lc)%48for@F;$_&&=1>$s%@F

Essayez-le en ligne!

1 aidan0626 Sep 21 2020 at 15:51

Python 3 , 101 96 octets

def f(s):x=sum([i-[48,96][i>96]for i in map(ord,s.lower())]);return not(x%len(s))and x//len(s)>0

Essayez-le en ligne!

1 HyperNeutrino Sep 21 2020 at 16:16

Gelée , 23 octets

ØWiⱮ_³e€ØD¤%26Sµ;ọ³L¤$Ȧ

Essayez-le en ligne!

Golfé 1 octet et a également fait fonctionner le programme (la troisième fois est un charme? Il était toujours cassé)

Explication

ØWiⱮ_³e€ØD¤%26Sµ;ọ³L¤$Ȧ  Main Link
   Ɱ                     For each character in the input
  i                      find its index in
ØW                       "ABC...XYZabc...xyz0123456789_"
    _                    and subtract from each element
     ³e€ØD¤              the corresponding value, which is
     ³                   if the original character
      e€                 is a member of
        ØD               the digits (this is to fix the one-off offset of the digits)
                         (the above nilad gets a list of 0 and 1 for if each character is a digit, and since Jelly's subtraction `_` is vectorized, this works as subtracting the corresponding element)
           %26           modulo 26
              Sµ         take the sum; begin a new link with this value
                ;    $   append
                 ọ       the number of times the sum is divisible by (just plain "divisible by?" has the arguments in the opposite order which would take 1 extra byte to flip)
                  ³L¤    the length of the input
                      Ȧ  any and all - are both values truthy; that is, is the sum divisible and non-zero?
1 Shaggy Sep 21 2020 at 15:48

Japt , 22 17 15 octets

L'entrée est un tableau de caractères.

Ou 13 octets , sans avoir à cas particulier 0.

xÈv c u48
©vNÎl

Essayez-le

;x@ÒBbXu)ªX\n©vNÎl     :Implicit input of character array U
 x                     :Reduce by addition
  @                    :After passing each X through the following function
   Ò                   :  Negate the bitwise NOT of
;   B                  :  Uppercase alphabet
     b                 :  0-based index of
      Xu               :    Uppercase X
        )              :  End indexing
         ªX            :  Logical OR with X, which gets coerced to an integer
           \n          :Reassign to U
             ©         :Logical AND with
              v        :  Is divisible by
               N       :  Array of all inputs
                Î      :  First element (i.e., the original U)
                 l     :  Length
1 Arnauld Sep 21 2020 at 16:17

JavaScript (Node.js) ,  54  53 octets

Renvoie 0 ou 1 .

s=>Buffer(s).map(c=>t+=++k&&c%96%64%48,k=t=0)|t%k<!!t

Essayez-le en ligne!

Teck-freak Sep 21 2020 at 15:53

Python 2 et Python 3-69 octets

lambda a:0==sum(ord(s.upper())-[64,48][s.isdigit()]for s in a)%len(a)

En supposant que l'entrée sous forme de chaîne sur la variable a, on peut descendre à 60 octets

0==sum(ord(s.upper())-[64,48][s.isdigit()]for s in a)%len(a)
SomoKRoceS Sep 21 2020 at 16:53

JavaScript, 107 octets

a=>(b=a.toLowerCase().split('').reduce((c,d)=>c+(+(isNaN(d)?d.charCodeAt(0)-96:d)),0)/a.length,!(b?b%1:!b))

Essayez-le en ligne!

Neil Sep 21 2020 at 18:09

Retina 0.8.2 , 63 octets

^
$.'$*1;
T`L`l
[j-z]
55$& [t-z] 55$&
T`_l`ddd
\d
$* ^(1+);\1+$

Essayez-le en ligne! Le lien comprend des cas de test. Explication:

^
$.'$*1;

Préfixez l'entrée avec une copie unaire d'elle-même.

T`L`l

Convertissez-le en minuscules.

[j-z]
55$& [t-z] 55$&
T`_l`ddd

Convertissez les lettres en chiffres avec la même somme numérique.

\d
$*

Prenez la somme numérique.

^(1+);\1+$

Vérifiez qu'il s'agit d'un multiple non nul de la longueur.

Razetime Sep 22 2020 at 04:30

MAWP , 78 octets

%|0/[!843WWP843WWWA/]~[!88WP88WWA/]~[!86WP86WWA/]_1A![1A~M~]%!~!~/P\WA{0:.}?1:

Essayez-le!

En attente de réponse dans 1 + ...

Utilise la méthode du module de la réponse J de Jonah.

LuisMendo Sep 21 2020 at 17:04

MATL , 12 11 octets

k48\stGn\~*

La sortie est 0si l'entrée est un multiple de somme de longueur ou un nombre positif dans le cas contraire.

Essayez-le en ligne! Ou vérifiez tous les cas de test .

Comment ça fonctionne

k     % Implicit input. Convert to lowercase
48    % Push 48
\     % Modulus. Each character is first converted to its code-point
s     % Sum. This gives "s"
t     % Duplicate (*)
G     % Push input again
n     % Number of elements. This gives "n"
\     % Modulus
~     % Negate. This gives true if s mod n equals 0, or false otherwise (**)
*     % Multiply (*) and (**)
      % Implicit display. True and false are displayed as 1 and 0 respectively
LegionMammal978 Sep 25 2020 at 10:52

Wolfram Language (Mathematica) , 54 octets

Tr[a=FromDigits/@#/.a_/;a>9:>a-9]~Mod~Tr[1^#]==0<Tr@a&

Essayez-le en ligne! Fonction pure. Prend une liste de caractères comme entrée et retour Trueou Falsecomme sortie. Le gros du travail est effectué par FromDigits, qui convertit les caractères 0-9, AZ en nombres 0-35.