Considérons une chaîne de longueur N, comme Peanut Butter
avec N = 13. Notez qu'il y a N-1 paires de caractères voisins dans la chaîne. Car Peanut Butter
, la première des 12 paires est Pe
, la seconde est ea
, la dernière est er
.
Lorsque les paires sont principalement des caractères différents, la chaîne a une qualité volumineuse, par exemple chUnky
.
Lorsque ces paires sont principalement le même caractère, la chaîne a une qualité lisse, par exemple sssmmsss
.
Définissez la grosseur d'une chaîne comme étant le rapport du nombre de paires avec deux caractères différents au nombre total de paires (N-1).
Définissez le lissage d'une chaîne comme étant le rapport du nombre de paires avec deux caractères identiques au nombre total de paires (N-1).
Par exemple, Peanut Butter
n'a qu'une seule paire avec des caractères identiques ( tt
), donc son lissage est 1/12 ou 0,0833 et son gros morceau est 11/12 ou 0,9167.
Les chaînes vides et les chaînes avec un seul caractère sont définies comme 100% lisses et 0% grosses.
Défi
Écrivez un programme qui accepte une chaîne de longueur arbitraire et génère son rapport de grosseur ou de lissage sous forme de valeur à virgule flottante.
- Prenez l'entrée via stdin ou la ligne de commande, ou vous pouvez écrire une fonction qui prend une chaîne.
- Vous pouvez supposer que la chaîne d'entrée ne contient que des caractères ASCII imprimables (et donc une seule ligne).
- Imprimez le flotteur à stdout à 4 décimales ou plus, ou vous pouvez choisir de le retourner si vous avez écrit une fonction. Les décimales qui ne transmettent aucune information ne sont pas nécessaires, par exemple,
0
c'est bien au lieu de0.0000
. - Choisissez la grosseur ou la douceur selon vos préférences. Assurez-vous simplement de dire lequel produit votre programme.
Le code le plus court en octets gagne.
Exemples
Peanut Butter
→ chunkiness: 0.91666666666
, Lissé: 0.08333333333
chUnky
→ chunkiness: 1.0
, Lissé: 0.0
sssmmsss
→ chunkiness: 0.28571428571
, Lissé: 0.71428571428
999
→ chunkiness: 0.0
, Lissé: 1.0
AA
→ chunkiness: 0.0
, Lissé: 1.0
Aa
→ chunkiness: 1.0
, Lissé: 0.0
!
→ chunkiness: 0.0
, Lissé: 1.0
[chaîne vide] → chunkiness: 0.0
, Douceur:1.0
Question bonus: laquelle préférez-vous , des cordes grosses ou lisses ?
la source
Réponses:
APL, 10 octets
Ceci lit l'entrée de stdin et imprime la grosseur à stdout. L'algorithme est le même que celui utilisé pour la solution J.
la source
CJam, 19 octets
Code source 100% volumineux qui calcule la grosseur .
Essayez ce gros morceau en ligne.
Comment ça marche
De toute évidence, NaN arrondi à 4 décimales est égal à 0.
la source
2ew
approche que j'ai essayée. Les cas spéciaux de lettre 0/1 me tuaient._
bougé. Je ne sais pas si c'est important.Pyth,
1312 octetsCode entièrement volumineux calculant la grosseur.
Manifestation. Harnais de test.
la source
z
provoquer une erreur sur l'entrée vide en ligne. Je vais corriger ce bug. Ce code est très bien, cependant.TI-BASIC, 46 octets
sub(x1,x2,x3
donne la sous-chaîne de la chaînex1
commençant (une base) au numérox2
et se terminant au numérox3
, puisseq(
construit une séquence.Donne la valeur de lissage. La
Ans
variable est0
par défaut, nous n'avons donc pas besoin d'unElse
à l'If
instruction, ni de stocker quoi que ce soit à l'Ans
avance.la source
Matlab (
3736 octets)Cela peut être fait avec la fonction anonyme suivante, qui retourne le gros morceau:
Commentaires:
Dans les anciennes versions de Matlab (telles que R2010b), vous devez convertir
+
le tableau charx
en un tableau double:Mais ce n'est pas le cas dans les versions récentes (testées dans R2014b), qui économisent un octet. Merci à Jonas pour son commentaire.
max
gère les cas à un caractère et à zéro caractère (pour le gros morceau)Exemple:
la source
diff('abc')
ne produira pas d'avertissement.> <> ,
4036 octetsCe programme renvoie la grosseur d'une chaîne.
Explication
Soumission précédente (37 + 3 = 40 octets)
Ce programme renvoie la fluidité d'une chaîne. L'entrée se fait via le
-s
drapeau, par ex.la source
C #,
9489 octetsSous 100 octets, donc je suppose que c'est une forme de victoire en soi?
Il s'agit d'une définition de fonction (autorisée selon la spécification) qui renvoie la fluidité de la chaîne d'entrée:
Assez simple, si la longueur est 0 ou 1, elle renvoie 1, sinon elle compare la chaîne à elle-même moins le premier caractère, puis renvoie le nombre de paires identiques divisé par le nombre de paires.
Modifier - remplacement de la sous-chaîne par Skip. Erreur de débutant!
la source
J,
1413 octetsCalcule la grosseur. Félicitations à J pour avoir défini
0 % 0
une valeur égale à 0.Essayez-le en ligne
Voici une explication:
la source
(]+/%#)2~:/\]
enregistre 1 octet.CJam, 23 octets
Explication:
Cela génère le taux de lissage.
la source
CJam, 16 octets
Code source astucieux qui calcule la fluidité .
Pour les entrées de longueur 0 ou 1, cela imprime le résultat correct avant de quitter avec une erreur. Avec l'interpréteur Java, la sortie d'erreur va à STDERR ( comme il se doit ).
Si vous essayez le code en ligne , ignorez tout, sauf la dernière ligne de sortie.
Comment ça marche
la source
Julia, 52 octets
Douceur!
Cela crée une fonction sans nom qui accepte une chaîne et renvoie une valeur numérique.
Si la longueur de l'entrée est inférieure à 2, la régularité est 1, sinon nous calculons la proportion de caractères adjacents identiques en prenant la moyenne d'un tableau de logiques.
la source
Nim,
1059691 octetsEssayer d'apprendre Nim. Cela calcule la grosseur d'une chaîne.
(
Si j'essaie de lire ceci en Python, l'indentation semble tout foiré ...Maintenant, cela ressemble plus à Ruby ...)la source
Python 3, 63 octets
Il s'agit d'une fonction lambda anonyme qui prend une chaîne comme argument et renvoie sa grosseur.
Pour l'utiliser, donnez-lui un nom et appelez-le.
la source
def f(n):
qui a exactement le même nombre de caractères quelambda n:
. Cela supprime la nécessité de nommer votre fonction.def f(n):
également besoin d'unreturn
Python 3, 52 octets
Cela calcule la grosseur et affiche
-0.0
la chaîne vide. Si vous n'aimez pas les zéros négatifs, vous pouvez toujours corriger cela avec un octet supplémentaire:la source
Haskell, 64 octets
Produit une douceur. par exemple
f "Peanut Butter"
->8.333333333333333e-2
.Comment ça marche:
sum(x>>[1])
est la longueur de x, mais comme le système de type fort de Haskell nécessite de fournir des fractions/
, je ne peux pas utiliser celuilength
qui renvoie des entiers. La conversion d'entiers en fractionnaires viafromInteger$length x
est beaucoup trop longue.la source
import Data.Ratio
est trop cher.JavaScript (ES6), 55 octets
Douceur, 56 octets
Chunkiness, 55 octets
Démo
Calcule la douceur, car c'est ce que je préfère. Fonctionne uniquement dans Firefox pour l'instant, car il s'agit de ES6.
la source
KDB (Q), 30
Renvoie la douceur.
Explication
Tester
la source
Rubis ,
6966 octetsEssayez-le en ligne!
Rasé de quelques octets avec les commentaires de IMP. De plus, avec la prochaine version 2.7.0 de Ruby, il est possible d'économiser quelques octets en remplaçant
|x,y|x!=y
par@1!=@2
la source
.to_f/~-s.size
dans l'affectation de c, vous pouvez alors raser un octet avec l'opération ternaire:f=->s{(c=s.chars.each_cons(2).count{|x,y|x!=y}.to_f/~-s.size)>0?c:0}
f=
? Je ne suis pas à 100% sur les règles à ce sujet. Le défi dit que vous pouvez retourner une fonction qui prend une chaîne, ce qui est un lambda stabby.Python 3, 69 octets
Personne n'a encore publié de solution Python, alors voici une implémentation assez simple d'une fonction "chunkiness". Il court-circuite sur une chaîne de longueur
1
et imprime0
(qui est un entier plutôt qu'un flottant mais semble être autorisé selon les règles).Sur une chaîne vide, il génère
-0.0
plutôt que0.0
. On peut dire que cela pourrait être considéré comme acceptable, en tant que-0.0 == 0 == 0.0
retourTrue
.Exemples:
(Python 3 est utilisé pour sa division flottante par défaut.)
la source
C, 83 octets
Une fonction de retour rend les gros morceaux .
Explication
Acceptez une chaîne C et renvoyez un flottant (le double fonctionnerait mais est plus de caractères).
Compteurs -
a
pour les paires totales,b
pour les paires qui ne correspondent pas. L'utilisationint
limite la «longueur arbitraire» de la chaîne, mais ce n'est qu'une violation mineure des exigences et je ne vais pas la corriger.Cas particulier de la chaîne vide - laissez les deux compteurs à zéro.
Chaîne non vide - parcourez-la avec pré-incrémentation (donc la première fois dans la boucle,
s[a]
sera le deuxième caractère. Si la chaîne n'a qu'un seul caractère, le corps de la boucle ne sera pas entré eta
sera 1.Si le caractère actuel diffère du précédent, incrémentez
b
.Après la boucle, il y a trois possibilités: 'a == 0, b == 0' pour une entrée vide, 'a == 1, b == 0' pour une entrée à un seul caractère ou 'a> 1, b> = 0 'pour une entrée à plusieurs caractères. Nous soustrayons 1 de
a
(l'?
opérateur est un point de séquence, donc nous sommes sûrs), et si c'est zéro, nous avons le deuxième cas, donc nous devrions retourner zéro. Sinon,b/a
c'est ce que nous voulons, mais nous devonsb
d'abord passer à un type à virgule flottante ou nous obtiendrons une division entière. Pour une chaîne vide, nous finirons avec un zéro négatif, mais les règles ne l'interdisent pas.Tests:
Qui donne:
comme demandé.
la source
a,b;float f(char*s){if(*s)for(a=b=0;s[++a];)b+=s[a]!=s[a-1];return--a?1.*b/a:b;}
Perl, 69
Fonction retournant la douceur :
Explication
Les tests
la source
Mathematica,
7372 octetsCela ne gagne rien pour la taille, mais c'est simple:
Douceur
la source
Length[#]
->Length@#
enregistre un coup. Il en va de même pour l'éliminationN@
et le passage1
à1.
GeL:
7673 caractèresDouceur.
Exemple d'exécution:
(GeL = fixations Gema + Lua. Beaucoup mieux, mais encore loin de gagner.)
Gema:
123120 caractèresDouceur.
Exemple d'exécution:
(C'était plus un exercice pour moi de voir quelles sont les chances de le résoudre dans une langue sans support de nombres à virgule flottante et support arithmétique généralement douloureux. La 2e ligne, en particulier la
\P
séquence, est de la magie pure, la dernière ligne est une véritable torture.)la source
Java 8,
8482 octetsRend la douceur.
Essayez-le en ligne.
Explication:
la source
Noix de coco , 38 octets
Essayez-le en ligne!
Un port Python 3 serait de 50 octets .
la source
PowerShell, 55 octets
Douceur
Semble un peu idiot pour obtenir une variable dans stdin puis lui donner un identifiant, mais c'est plus rapide que d'avoir une fonction.
la source
Python 3, 61 octets
calculer la grosseur:
la source
K (22)
peaufiné la solution Q de WooiKent:
la source
Rubis, 63 octets
Génère de la grosseur.
f=->s{s.chars.each_cons(2).count{|x,y|x!=y}/[s.size-1.0,1].max}
Semblable à la solution de @ daniero, mais légèrement raccourci en divisant directement par la longueur de la chaîne - 1, puis en s'appuyant sur .count pour être nul avec les chaînes de longueur 0 et 1 (le .max garantit que je ne diviserai pas par 0 ou -1).
la source
Mathematica, 107 octets
Calcule la grosseur en prenant la moitié de la distance de Levenshtein entre chaque digraphe et son inverse.
Si vous préférez une réponse rationnelle exacte, supprimez
.5
et placez un/2
avant le dernier&
sans pénalité. Le programme lui-même a une grosseur 103/106, soit environ 0,972.la source