Défi:
Contributions:
- Une chaîne contenant de l'ASCII imprimable (hors espaces, tabulations et sauts de ligne)
- Un booléen †
Production:
Les parties de la chaîne sont divisées en quatre groupes:
- Minuscules
- Lettres capitales
- Chiffres
- Autre
Sur la base du booléen, nous générons soit l'occurrence la plus élevée d'un (ou plusieurs) de ces quatre groupes, soit la plus faible, remplaçant tout le reste par des espaces.
Par exemple:
Entrée: "Just_A_Test!"
Il contient:
- 3 lettres majuscules: JAT
- 6 lettres minuscules: ustest
- 0 chiffres
- 3 autres:__!
Ce seraient les sorties pour true
ou false
:
true: " ust est "
// digits have the lowest occurrence (none), so everything is replaced with a space
false: " "
(Remarque: Vous êtes autorisé à ignorer les espaces de fin, les sorties peuvent donc également être " ust est"
et ""
respectivement.)
Règles du défi:
- L'entrée ne sera jamais vide ou contiendra des espaces, et ne sera constituée que d'ASCII imprimables dans la plage
33-126
ou à'!'
travers'~'
. - Vous êtes autorisé à prendre les entrées et / ou sorties sous forme de tableau de caractères ou de liste si vous le souhaitez.
- † Deux valeurs cohérentes et distinctes pour le booléen sont autorisées:
true
/false
;1
/0
;'H'
/'L'
;"highest"
/"lowest"
; etc. Notez que ces valeurs distinctes doivent être utilisées (quelque peu) comme un booléen! Il n'est donc pas autorisé de saisir deux programmes complets, l'un qui donne le résultat correct pourtrue
et l'autre pourfalse
, puis d'avoir uniquement votre code réel<run input with parameter>
. Nouvelle faille par défaut pertinente que j'ai ajoutée, bien qu'elle puisse encore utiliser beaucoup de réglages finaux concernant les définitions. - Si l'occurrence de deux ou plusieurs groupes est la même, nous générons toutes ces occurrences.
- Les espaces de fin nécessaires sont facultatifs, et une seule nouvelle ligne de fin est également facultative. Les espaces de tête nécessaires sont obligatoires. Et tout autre espace de tête ou nouvelle ligne n'est pas autorisé.
Règles générales:
- C'est le code-golf , donc la réponse la plus courte en octets l'emporte.
Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues non-golfeur de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation. - Les règles standard s'appliquent à votre réponse, vous êtes donc autorisé à utiliser STDIN / STDOUT, des fonctions / méthodes avec les paramètres appropriés, des programmes complets. Ton appel.
- Failles par défaut sont interdites.
- Si possible, veuillez ajouter un lien avec un test pour votre code.
- Veuillez également ajouter une explication si nécessaire.
Cas de test:
Inputs: Output:
"Just_A_Test!", true " ust est " (or " ust est")
"Just_A_Test!", false " " (or "")
"Aa1!Bb2@Cc3#Dd4$", either "Aa1!Bb2@Cc3#Dd4$"
"H@$h!n9_!$_fun?", true " @$ ! _!$_ ?"
"H@$h!n9_!$_fun?", false "H 9 " (or "H 9")
"A", true "A"
"A", false " " (or "")
"H.ngm.n", true " ngm n"
"H.ngm.n", false " " (or "")
"H.ngm4n", false "H. 4 " (or "H. 4")
"H "
- on et" 9 "
(avec les espaces appropriés) être émis à la place de"H 9"
?H
et9
font partie des "moins"."max"
-elle être /"min"
, qui est ensuite utilisée pourMath[b]
faire référence àMath.max
ouMath.min
?b?"max":"min"
dans votre réponse .. C'est une ligne fine, je suppose, peut-être que je devrais simplement utiliser une valeur truey / falsey la prochaine fois ..Réponses:
Husk ,
27262422 octets-2 octets grâce à Zgarb
-2 octets grâce à Leo
Prend au
' '
furFalse
et à'a'
mesureTrue
(dans Husk, les espaces dans Fasly et tous les autres personnages sont Truthy)Essayez-le en ligne!
Comment ça marche?
†
ḟ
est une fonction qui prend un prédicatp
et une listeL
et renvoie le premier élémentL
qui satisfaitp
. Si aucun élément ne satisfait,p
un argument par défaut est retourné. Dans ce cas' '
. En appliquantḟ
à une chaîne d'un caractère, nous disons essentiellementif p c then c else ' '
.Ṫ
Est fonction qui prend une fonctionf
et deux listesL1
,L2
. Il retourne un tableau desf
appliqués sur toutes les paires deL1
etL2
. Dans ce casf
estḟ
,L1
notre liste de 4 fonctions, etL2
la liste d'une des chaînes de caractères.Après
Ṫḟ
nous avons une liste de chaînes où chaque chaîne est le résultat du remplacement de caractères qui ne satisfont pas à l'une des règles par un' '
.NB: Dans les versions plus récentes de Husk,
ġ#¬Ö#≡⁰
peut être remplacé park#≡⁰
pour une économie de 3 octets!la source
' '
et'a'
? Peut-être que je comprends mieux quand l'explication est ajoutée, parce que je ne peux pas lire Husk. ;)Ṫ
.Mmm
que je faisais moi-même :)S`?'
pourrait être plus simple?IK'
I
, parfois cela rend l'interprète éternel. Cela semble aussi du gaspillage.Gelée , 31 octets
Essayez-le en ligne!
Les valeurs booléennes sont
2
et1
(ou toute autre paire paire paire / impaire positive), qui représententTrue
etFalse
respectivement. Je vais essayer d'ajouter une explication après avoir joué au golf.Merci à caird coinheringaahing d' avoir économisé 2 octets et à Lynn d' avoir économisé 4 octets! Merci à l'une des astuces d' Erik , qui m'a inspiré pour économiser 4 octets!
Comment ça fonctionne
Notez que ceci est l'explication de la version 35 octets. Le nouveau fait à peu près la même chose (mais un peu modifié par Lynn), donc je ne le changerai pas.
la source
µ
D étranger :ØṖḟØBṭØBUs26¤
, puis testez l'appartenance avecf
etÇ
au lieu dee¢$
.Python 2 ,
166158 octetsEssayez-le en ligne!
la source
R ,
193186179158 octets-7 octets grâce à NofP et sa suggestion de
cbind
-6 octets en utilisant
outer
, -1 octet de commutation[^a-zA-Z0-9]
avec[[:punct:]]
-21 octets grâce à MickyT pour avoir signalé qu'une liste de caractères est autorisée
Vérifier tous les cas de test
Prend
1/T
comme véridique (max
) et0/F
comme falsey (min
), et prendS
comme une liste de personnages uniques.Essayez-le en ligne!
Dans ma version originale (avec les suggestions de NofP), la matrice
y
est construite en évaluantgrepl(regex, S)
pour chacunregex
, puis en les concaténant ensemble sous forme de colonnes d'une matrice. Il en résulte plusieurs appels àgrepl
, mais comme celaS
est résolu, il semblait que quelque chose d'autre devait être fait. Comme je l'ai noté:J'ai utilisé
outer
plutôt quemapply
, qui renvoie toujours un tableau (une matrice dans ce cas), et a été forcé deVectorize
grepl
, ce qui n'est vraiment qu'unmapply
wrapper autour.J'ai également découvert le groupe de caractères prédéfini
[:punct:]
qui correspond aux caractères de ponctuation (sans espace, non alphanumériques).la source
like this
. :)S=el(strsplit(G,""))
Husk ,
31 2928 octetsUtilise 0 pour un nombre minimal de caractères et 1 pour un nombre maximal de caractères. Essayez-le en ligne!
Explication
Les listes de fonctions sont cool.
la source
Python 2 , 140 octets
Essayez-le en ligne!
Jonathan Frech a enregistré un octet. Merci!
Le plus haut est le
m=-1
plus basm=0
.la source
+x.isalpha()*-~(x>'Z')
par-~(x>'Z')*x.isalpha()
.Gelée , 35 octets
Essayez-le en ligne!
la source
Java (OpenJDK 8) ,
448439432362361354352348343320 octetsEssayez-le en ligne!
la source
+
dans\\|+$
pour un montant supplémentaire -1 octet.String r=(w[0]!=m?"[a-z]|":"")+(w[1]!=m?"[A-Z]|":"")+(w[2]!=m?"[0-9]|":"")+(w[3]!=m?"[^a-zA-Z0-9]|":"");return r.isEmpty()?s:s.replaceAll(r.replaceAll(".$","")," ");}
.n=s.length()
peut êtren=-1>>>1
pour un -4 supplémentaire.[0-9]
->\\d
Ruby ,
118116 octetsPrend
0
(le plus bas) ou-1
(le plus haut) pour son deuxième argument.-2 octets grâce à Lynn.
Essayez-le en ligne!
Non golfé
la source
-1
comme valeur «la plus élevée» et remplacerminmax[t]
parsort[t]
.Python 2,
190183174173 octetsMerci à Jonathan Frech de l'avoir raccourci
Cela prend les cordes
'max(l)'
et'min(l)'
comme vrai et faux. (Je ne pense pas que cela enfreigne les règles ...?) C'est plus long que les deux autres réponses en python mais différent, alors j'ai pensé le publier. Je ne suis pas un grand golfeur, donc je suppose que cela pourrait être encore amélioré, mais toutes les choses que j'ai essayées n'ont pas fonctionné.Essayez-le en ligne!
la source
sum(1for m...
êtresum(1 for m...
, mais je pense qu'il y a aussi d'autres problèmes. Pourriez-vous fournir un lien vers un interprète en ligne (tel que tio ) pour montrer comment vous appelez cela et pour montrer que ce n'est pas une erreur?max(l)
et enmin(l)
tant que chaînes, c'est pourquoi je recevais des erreurs. Merci d'avoir clarifié ça! Bien que maintenant, cela soit sur le point de violer la règle n ° 3, `Notez que ces valeurs distinctes doivent être utilisées (quelque peu) comme booléennes`, mais c'est certainement un peu une zone grise.JavaScript (ES6),
151149 octetsMalheureusement, les règles ne me permettent probablement pas de passer
Math.max
ouMath.min
comme drapeau. Edit: enregistré 2 octets grâce à @JustinMariner.la source
Gelée , 37 octets
Essayez-le en ligne!
-6 octets "emprunt" au poste d'Erik: D
la source
Java (OpenJDK 8) ,
307 + 34306 + 27295 octetsMa prise «intéressante» du défi.
Merci à Kevin Cruijssen d'
avoir réduit les octets d'importationsupprimant complètement l'importation!Essayez-le en ligne!
Explication:
Remplace d'abord chaque groupe par un entier compris entre 0 et 3 à l'aide d'une expression régulière simple et le stocke dans une nouvelle chaîne.
int a[]={0,0,0,0},m,i=0,z=0,y=-1>>>1;
Initialise un tableau d'entiers ainsi que quelques autres entiers à utiliser ultérieurement. Définit la
y
variable à la taille int maximale en utilisant un décalage de bit à droite non signé.t.chars().forEach(j->{a[j%4]++;});
Pour chaque caractère de la chaîne modifiée, cela utilise sa valeur ASCII modulo 4 pour calculer l'index du tableau susmentionné à incrémenter.
Cela parcourt ensuite les comptes de chaque groupe stocké dans le tableau et calcule le minimum (
y
) et le maximum (z
).Parcourt à nouveau chaque caractère de la chaîne, vérifiant si le groupe de ce groupe de caractères est égal au min / max (en utilisant l'astuce modulo mentionnée plus haut). S'il n'est pas égal, un espace est ajouté à la nouvelle chaîne à la place des caractères, sinon le caractère d'origine est ajouté.
return v;
Enfin, retournez la nouvelle chaîne!
la source
import java.util.stream.IntStream;
peuvent êtreimport java.util.stream.*;
et,i
peuvent être,i=0
après lesquelles vous pouvez retireri=0
de la boucle for. Oh, et(s,b)->
peut l'êtres->b->
.java.util.function.Function<String, java.util.function.Function<Boolean, String>> g = s->b->{...};
.IntStream z=IntStream.of(a);m=(b?z.max():z.min()).getAsInt();
peut êtrel=s.length(),x=0,y=l
etfor(int x:a){z=x>z?x:z;y=x<y?x:y;}
et(b?z:y)
, donc vous n'avez plus besoin de l'importation. Mettre tout cela ensemble devient:s->b->{String t=s.replaceAll("\\d","2").replaceAll("[a-z]","0").replaceAll("[A-Z]","1").replaceAll("\\D","3"),v="";int a[]={0,0,0,0},i=0,l=s.length(),z=0,y=l;t.chars().forEach(j->{a[j%4]++;});for(int x:a){z=x>z?x:z;y=x<y?x:y;}for(;i<l;i++)v+=a[t.charAt(i)%4]!=(b?z:y)?" ":s.charAt(i);return v;}
( 294 octets ) .Bash,
229227212 octetsEssayez-le en ligne
la source
f(){((
.(
, also 2 bytes could be saved using(
instead of{
, degrading performance because creating a subshellPHP,
161158 bytesRun with
-nr
or try it online.and count the occurences of groups that the current character is not in.
(that negation saved 3 bytes)
from min/max non-count then print space, else print character.
la source
JavaScript (ES6), 139 bytes
Input and output is an array of characters. Takes actual boolean values for input.
A different approach from @Neil's answer; almost avoiding regular expressions. Instead, I used a series of checks to determine the category of each character:
true
forc>-1
because non-digits fail mathematical comparisons/[a-z]/i
and have codepoints less than"a"
"a"
Test Cases
Show code snippet
la source