Inspiré par et en mémoire de mon cher ami et collègue,
Dan Baronet , 1956 - 2016. RIP
Il a trouvé la solution APL la plus courte possible pour cette tâche:
Tâche
Avec une liste booléenne, comptez le nombre de valeurs de vérité de fin.
Cas d'exemple
{}
→ 0
{0}
→ 0
{1}
→ 1
{0, 1, 1, 0, 0}
→ 0
{1, 1, 1, 0, 1}
→ 1
{1, 1, 0, 1, 1}
→ 2
{0, 0, 1, 1, 1}
→ 3
{1, 1, 1, 1, 1, 1}
→ 6
01100
?Réponses:
Dyalog APL,
62 octetsTestez-le sur TryAPL .
Comment ça fonctionne
⊥ (Uptack, Dyadic: Decode) effectue la conversion de base. Si l'opérande de gauche est un vecteur, il effectue une conversion de base mixte , ce qui est parfait pour cette tâche.
Pour un vecteur de base b = b n , ⋯, b 0 et un vecteur de chiffres a = a n , ⋯, a 0 , b a convertit a en base mixte b , c'est-à-dire qu'il calcule b 0 ⋯ b n-1 a n + ⋯ + b 0 b 1 a 2 + b 0 a 1 + a 0 .
Maintenant, ⍨ (tilde dieresis, commute) modifie l’opérateur à gauche comme suit. Dans un contexte monadique, il appelle l'opérateur avec les mêmes arguments gauche et droit.
Par exemple, ⊥⍨ a est défini comme un ⊥ a , qui calcule un 0 ⋯ a n + ⋯ + a 0 a 1 a 2 + a 0 a 1 + a 0 , somme de tous les produits cumulatifs de droite à gauche. .
Pour les k suivants , les k produits les plus à droite sont 1 et tous les autres sont 0 , leur somme est donc égale à k .
la source
b⊥b
et⊥⍨b
accéléré à l'infini.JavaScript (ES6), 21 octets
Cas de test
Afficher l'extrait de code
la source
f(l)+1
renvoie une valeur> 2
?l.pop()?(l.pop()?(l.pop()?(...etc...)+1:0)+1:0)+1:0
.Gelée , 4 octets
Essayez-le en ligne! ou Vérifiez tous les cas de test.
Pour le cas où la liste est vide, il y a quelques observations curieuses. Tout d'abord, le codage par durée de la liste vide
[]
renvoie une autre liste vide[]
. Ensuite, récupérer le dernier élément de celui-ci en utilisant desṪ
retours arrière0
au lieu d'une paire[value, count]
qui sont les éléments normaux d'un tableau codé par longueur. Ensuite, le produitP
revient0
lorsqu'il est appelé,0
ce qui correspond au résultat attendu.Explication
la source
ŒgṪS
fonctionne aussi!Ṫ
en gelée est mis en œuvre:lambda z: iterable(z).pop() if iterable(z) else 0
.iterable
lorsqu'il est appelé sur une liste, il retourne simplement la liste, et la liste vide est évidemment falsifiée.Brachylog ,
765 octetsEssayez-le en ligne!
Explication
Du
@] - Suffix
début au plus petit suffixe, il trouvera le plus long terme en premier.la source
CJam (8 octets)
Suite de tests en ligne
Dissection
la source
Haskell,
26 à25 octetsUsage:
Version sans point (26 octets):
Utiliser une liste entière au lieu d'une liste bool (21 octets, grâce à Christian Sievers):
Usage:
Version sans points (25 octets)
la source
foldl
idée fonctionne aveca%b=b*(a+1)
Retina ,
75 bytesEssayez-le en ligne! (La première ligne active une suite de tests séparée par saut de ligne.)
Définir le format d’entrée pour Retina n’est pas totalement ambigu. Puisque Retina n’a aucun concept, à l’exception des chaînes (et qu’aucune valeur ne puisse être utilisée pour notre définition habituelle de la vérité et de la fausseté), j’utilise habituellement
0
et1
(ou quelque chose de positif en général) pour correspondre à la vérité et à la fausseté, car elles représentent zéro ou quelques correspondances, respectivement.Avec les représentations à un seul caractère, nous n’avons pas non plus besoin d’un séparateur pour la liste (ce qui est en quelque sorte une représentation de liste plus naturelle pour une langue qui n’a que des chaînes). Adám a confirmé qu'il s'agissait d' un format d'entrée acceptable.
Quant à l'expression rationnelle elle-même, elle correspond de
r
haut à gauche et\G
ancre chaque correspondance sur la précédente. Par conséquent, cela compte combien de1
s nous pouvons apparier à partir de la fin de la chaîne.la source
05AB1E ,
121065 octetsSauvegardé 1 octet grâce à carusocomputing .
Essayez-le en ligne!
Explication
la source
0¡¤g
est quatre octets.J0¡¤g
est également encore plus courte;).Î
gérer les entrées vides, mais cela reste un octet enregistré grâce à :)Python, 31 octets
la source
Gelée , 4 octets
TryItOnline! ou tous les tests
Comment?
la source
MATL , 4 octets
Essayez-le en ligne!
la source
Mathematica,
2524 octetsla source
FromDigits[b=Boole@#,MixedRadix@b]&
(35 octets).Pyth, 6 octets
Essayez-le ici!
Ajoute un 0, renverse et trouve l'index du premier 0
la source
C90 (gcc), 46 octets
L'entrée s'effectue via des arguments de ligne de commande (un entier par argument), la sortie via le code de sortie .
Essayez-le en ligne!
Comment ça fonctionne
r est une variable globale. Son type par défaut est int et, étant global, sa valeur par défaut est 0 .
L'argument fonction c par défaut int ainsi. Il contiendra l'entier n + 1 pour les tableaux de n booléens; le premier argument de main est toujours le chemin de l'exécutable.
L'argument de la fonction v est déclaré comme
int**
. Le type réel de v serachar**
, mais comme nous n'examinerons que le bit le moins significatif de chaque argument pour distinguer les caractères 0 (point de code 48 ) et 1 (point de code 49 ), cela ne sera pas important pour little-endian Machines.La boucle while décrémente c et la compare à 0 . Une fois que c atteint 0 , nous sortirons de la boucle. Cela n'est nécessaire que si le tableau ne contient pas de 0 .
Tant que
0<--c
renvoie 1 , nous prenons le c ème argument de ligne de commande (v[c]
) et extrayons son premier caractère en déréférencant le pointeur (*
). Nous prenons l'ET au bit ET du booléen0<--c
et le point de code du caractère (ainsi que trois octets parasites qui le suivent), de sorte que la condition retourne 0 une fois qu'un 0 est rencontré, sortant de la boucle.Dans le cas restant, alors que les arguments de ligne de commande sont à 1 ,
r++
incrémente r de 1 , en comptant ainsi le nombre de 1 en fin de chaîne .Enfin,
c=r
stocke la valeur calculée de r dans c . Avec les paramètres par défaut, le compilateur optimise et supprime l’affectation; il génère effectivement l'movl %eax, -4(%rbp)
instruction. Étant donné queret
renvoie la valeur du registre EAX, cela génère la sortie souhaitée.Notez que ce code ne fonctionne pas avec C99, qui renvoie 0 du principal si la fin du principal est atteinte.
la source
argc
au moins1
(argv[0]
contenant le nom du fichier)? Vous pouvez enregistrer un octet avec--c&&
au lieu de0<--c&
. Le code de sortie de gcc est extrait deargc
? Soigné.*v[c]
est le point de code de 1 ou 0 , il est donc soit 49 ou 48 et donc toujours la vérité.k, 6 octets
Cette composition de fonction se traduit en
sum mins reverse
inq
, le frère de la langue, plus lisible, où min est un minimum glissant.la source
J,
93 octetsCeci est une conversion de base mixte réflexive. Parce que c'est la même chose qu'une conversion de base mixte. Encore.
Cas de test
la source
R,
40 3925 octetsSolution entièrement retravaillée grâce à @Dason
Lire l’entrée de stdin, inverser le vecteur et si le premier élément de est
!=0
alors la première longueur de l’encodage de longueur (rle
), sinon0
.la source
ifelse(r$v,r$l,0)[1]
. (Vectorisé si, puis prenez le premier élément.)Haskell, 24 octets
Itère sur la liste, en ajoutant un pour chaque élément et en le réinitialisant
0
après avoir atteint unFalse
.16 octets avec une entrée 0/1:
Si la liste était garantie non vide, nous pourrions obtenir 14 octets:
Ceci calcule le produit cumulatif à l’arrière, puis les additionne. Le produit cumulatif reste 1 jusqu'à ce qu'un 0 soit atteint, puis devient 0. Ainsi, les 1 correspondent aux 1 derniers.
la source
Pyke,
10 à6 octetsEssayez-le ici!
la source
C # 6,
10372 octetsL'utilisation d'une liste non générique bat la liste générique d'un octet lol
-31 octets grâce à Scott
la source
int
s, vous pouvez vous en sortirint a(int[] l)=>l.Reverse().TakeWhile(i=>i>0).Sum();
Func<bool[], int>
57 octets, c'estusing System.Linq;l=>l.Reverse().TakeWhile(x=>x).Count();
Python, 37 octets
la source
DASH , 16 octets
Ce n'est pas la solution DASH la plus courte possible, mais la solution DASH la plus courte possible me dérange. Je poste cette nouvelle approche à sa place.
Usage:
Explication
la source
Scala, 25 octets
Ungolfed:
Inverse la liste, ajoute un 0 et trouve le premier index de 0, qui est le nombre d'éléments avant le premier 0
la source
Lot, 57 octets
Prend les entrées en tant que paramètres de ligne de commande. Fonctionne en multipliant l'accumulateur par la valeur actuelle avant de l'ajouter, de sorte que les zéros de la ligne de commande réinitialisent le décompte. Notez que ce
%%n
n'est pas la même chose que la variablen
ou%n%
.la source
GolfSharp, 14 octets
la source
Java 7, 62 octets
Ungolfed & code de test:
Essayez ici.
Sortie:
la source
Perl 5.10, 22 octets
21 octets + 1 octet pour le
-a
drapeau. Depuis que l'expression à base de regex a été faite ...: pLes valeurs d'entrée du tableau doivent être séparées par un espace.
Essayez-le en ligne!
la source
perl -E '$_++while pop;say' 0 1 1 0 1 1 1
mais cela ne génère rien pour0
(ne savez pas si c'est un problème cependant!)Perl, 22 octets
21 octets de code + 1 octet pour le
-p
drapeau.Pour l'exécuter:
( En fait, le format de l'entrée n'a pas d' importance beaucoup:
0110111
,0 1 1 0 1 1 1
,[0,1,1,0,1,1,1]
etc. seraient tous les travaux)Version de 18 octets de @Dom Hastings mais il faut fournir l'entrée sous la forme d'une chaîne de 0 et de 1, ce qui n'est pas autorisé:
la source
;
truc :) Si le format est une chaîne continue:perl -pE '/1*$/;$_=length$&' <<< '0110111'
pour 18 ans, je ne suis pas sûr que cela plie les règles ou pas ...PHP, 50 octets
Bizarrement, mon premier essai avec une regex s'est avéré plus court que mon essai avec des tableaux ...
Utilisez comme:
la source
Ruby
3732 octetsCrée une fonction anonyme qui recherche l'instance la plus à droite d'une valeur false et compte la taille du sous-tableau à partir de cette valeur.
Il utilise
!0
comme faux, comme 0 sont des valeurs de vérité en Ruby.rindex
trouve le dernier index d'une valeur dans un tableau.Utilisation :
Retourne 1
Si on me permettait de passer une chaîne de 0 et de 1 en tant que paramètres de ligne de commande (ce n'est pas comme ça que ruby représente des listes de booléens), je pourrais le réduire à 24:
Cela utilise des expressions régulières et affiche la longueur de la chaîne renvoyée par l'expression régulière
/(1*)\z/
, où\z
est la fin de la chaîne.$*[0]
est le premier argument passé et est une chaîne de 0 et de 1.Usage:
Retourne 1.
la source