Desafío:
Entradas:
- Una cadena que contiene ASCII imprimible (excluyendo espacios, tabulaciones y nuevas líneas)
- Un booleano †
Salida:
Las partes de la cadena se dividen en cuatro grupos:
- Letras minusculas
- Letras mayúsculas
- Dígitos
- Otro
Con base en el valor booleano, mostramos la aparición más alta de uno (o varios) de estos cuatro grupos, o la más baja, reemplazando todo lo demás con espacios.
Por ejemplo:
Entrada: "Just_A_Test!"
Contiene:
- 3 letras mayúsculas: JAT
- 6 letras minúsculas: ustest
- 0 dígitos
- 3 otros:__!
Estos serían los resultados para true
o false
:
true: " ust est "
// digits have the lowest occurrence (none), so everything is replaced with a space
false: " "
(Nota: puede ignorar los espacios finales, por lo que las salidas también pueden ser " ust est"
y ""
respectivamente).
Reglas de desafío:
- La entrada nunca estará vacía o contendrá espacios, y solo consistirá en ASCII imprimible en el rango
33-126
o a'!'
través'~'
. - Se le permite tomar la entrada y / o salida como matriz de caracteres o lista si lo desea.
- † Se permiten dos valores consistentes y distintos para el booleano:
true
/false
;1
/0
;'H'
/'L'
;"highest"
/"lowest"
; ¡Tenga en cuenta que estos valores distintos deben usarse (algo) como un valor booleano! Por lo tanto, no está permitido ingresar dos programas completos, uno que proporcione el resultado correcto paratrue
y el otro parafalse
, y luego que solo tenga su código real<run input with parameter>
. La nueva laguna predeterminada relevante que he agregado, aunque todavía puede usar una gran cantidad de ajustes con respecto a las definiciones. - Si la ocurrencia de dos o más grupos es la misma, mostramos todas esas ocurrencias.
- Los espacios finales necesarios son opcionales, y una nueva línea final también es opcional. Los espacios iniciales necesarios son obligatorios. Y no se permiten otros espacios iniciales o nuevas líneas.
Reglas generales:
- Este es el código de golf , por lo que la respuesta más corta en bytes gana.
No permita que los lenguajes de code-golf lo desanimen a publicar respuestas con lenguajes que no sean codegolfing. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación. - Se aplican reglas estándar para su respuesta, por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados, programas completos. Tu llamada.
- Las lagunas predeterminadas están prohibidas.
- Si es posible, agregue un enlace con una prueba para su código.
- Además, agregue una explicación si es necesario.
Casos de prueba:
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 "
y" 9 "
(con espacios apropiados) en lugar de"H 9"
?H
y9
son parte de la "menor cantidad"."max"
/"min"
, que luego se usaMath[b]
para referirse aMath.max
oMath.min
?b?"max":"min"
tu respuesta ... Supongo que es una línea muy fina, tal vez debería usar un valor verdadero / falso la próxima vez ...Respuestas:
Casco ,
27262422 bytes-2 bytes gracias a Zgarb
-2 bytes gracias a Leo
Toma
' '
asFalse
y'a'
asTrue
(en Husk, los espacios en blanco en Fasly y todos los demás personajes son Truthy)Pruébalo en línea!
¿Como funciona?
†
ḟ
es una función que toma un predicadop
y una listaL
y devuelve el primer elementoL
que satisfacep
. Si ningún elemento satisface,p
se devuelve un argumento predeterminado. En este caso' '
. Al aplicarḟ
a una cadena de un carácter, estamos diciendo esencialmenteif p c then c else ' '
.Ṫ
Es la función que toma una funciónf
y dos listasL1
,L2
. Devuelve una tabla def
aplicado sobre todos los pares deL1
yL2
. En este casof
esḟ
,L1
es nuestra lista de 4 funciones, yL2
es la lista de cadenas de un carácter.Después
Ṫḟ
tenemos una lista de cadenas donde cada cadena es el resultado de reemplazar caracteres que no satisfacen una de las reglas con a' '
.Nota: en las versiones más nuevas de Husk,
ġ#¬Ö#≡⁰
se puede reemplazar pork#≡⁰
un ahorro de 3 bytes.fuente
' '
y'a'
? Tal vez lo entiendo mejor cuando se agrega la explicación, porque no puedo leer Husk. ;)Ṫ
.Mmm
que me estaba haciendo :)S`?'
podría ser más simple como?IK'
I
, a veces hace que el intérprete tome una eternidad. También parece un desperdicio.Jalea , 31 bytes
Pruébalo en línea!
Los valores booleanos son
2
y1
(o cualquier otro par positivo / impar positivo), que representanTrue
yFalse
respectivamente. Intentaré agregar una explicación después de seguir jugando al golf.¡Gracias a caird coinheringaahing por guardar 2 bytes, y a Lynn por guardar 4 bytes! Gracias a uno de los trucos de Erik. , que me inspiró a ahorrar 4 bytes!
Cómo funciona
Tenga en cuenta que esta es la explicación de la versión de 35 bytes. El nuevo hace más o menos lo mismo (pero Lynn lo modificó un poco), así que no lo cambiaré.
fuente
µ
D extraña :ØṖḟØBṭØBUs26¤
y luego prueba la membresía conf
y enÇ
lugar dee¢$
.Python 2 ,
166158 bytesPruébalo en línea!
fuente
R ,
193186179158 bytes-7 bytes gracias a NofP y su sugerencia de
cbind
-6 bytes usando
outer
, -1 byte de conmutación[^a-zA-Z0-9]
con[[:punct:]]
-21 bytes gracias a MickyT por señalar una lista de caracteres está permitido
Verificar todos los casos de prueba
Toma
1/T
como verdadero (max
) y0/F
como falsey (min
), y tomaS
como una lista de caracteres individuales.Pruébalo en línea!
En mi versión original (con las sugerencias de NofP), la matriz
y
se construye evaluandogrepl(regex, S)
para cada unoregex
, luego concatenándolos juntos como columnas de una matriz. Esto da como resultado múltiples llamadas agrepl
, pero, comoS
se solucionó, parecía que había que hacer algo más. Como señalé:Utilicé en
outer
lugar demapply
, que siempre devuelve una matriz (una matriz en este caso), y me vi obligado a hacerloVectorize
grepl
, que en realidad es solo unmapply
envoltura a su alrededor.También descubrí el grupo de caracteres predefinido
[:punct:]
que coincide con los caracteres de puntuación (sin espacio, no alfanuméricos).fuente
like this
. :)S=el(strsplit(G,""))
Casco ,
31 2928 bytesUtiliza 0 para mínimos y 1 para recuentos de caracteres máximos. Pruébalo en línea!
Explicación
Las listas de funciones son geniales.
fuente
Python 2 , 140 bytes
Pruébalo en línea!
Jonathan Frech guardó un byte. ¡Gracias!
Más alto es
m=-1
, más bajo esm=0
.fuente
+x.isalpha()*-~(x>'Z')
con-~(x>'Z')*x.isalpha()
.Jalea , 35 bytes
Pruébalo en línea!
fuente
Java (OpenJDK 8) ,
448439432362361354352348343320 bytesPruébalo en línea!
fuente
+
in\\|+$
por un byte -1 adicional.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()
puede sern=-1>>>1
por un -4 adicional.[0-9]
->\\d
rubí ,
118116 bytesToma
0
(lowest) or-1
(highest) for its second argument.-2 bytes gracias a Lynn.
Pruébalo en línea!
Sin golf
fuente
-1
as the “highest” value and replaceminmax[t]
bysort[t]
.Python 2,
190183174173 bytesThanks to Jonathan Frech for shortening it
This takes the strings
'max(l)'
and'min(l)'
as true and false. (I don't think this breaks the rules...?) This is longer than the other two python answers but different so I thought I'd post it. I'm not a great golfer so I'm guessing this could be improved further but all the things I tried didn't work.Try it online!
fuente
sum(1for m...
should besum(1 for m...
, but I think there are other problems too. Could you provide a link to an online interpreter (such as tio) to demonstrate how you're calling this, and to show it isn't erroring?max(l)
andmin(l)
as strings, that's why I was getting errors. Thanks for clearing that up! Although now, this is on the edge of violating rule #3, ` Note that these distinct values should be used (somewhat) as a boolean`, but it's definitely a little bit of a gray area.JavaScript (ES6),
151149 bytesSadly the rules probably don't allow me to pass
Math.max
orMath.min
as the flag. Edit: Saved 2 bytes thanks to @JustinMariner.fuente
Jelly, 37 bytes
Try it online!
-6 bytes "borrowing" from Erik's post :D
fuente
Java (OpenJDK 8),
307 + 34306 + 27295 bytesMy "interesting" take on the challenge.
Thanks to Kevin Cruijssen for
cutting down the import bytesremoving the import entirely!Try it online!
Explanation:
First replaces each group with an integer between 0 and 3 using some simple regex and stores this in a new String.
int a[]={0,0,0,0},m,i=0,z=0,y=-1>>>1;
Initialises an array of integers as well as a couple of other integers to use later. Sets the
y
variable to the max int size using unsigned right bit shift.t.chars().forEach(j->{a[j%4]++;});
For each character in the modified string, this uses its ASCII value modulo 4 to calculate the index of the aforementioned array to increment.
This then loops through the counts of each group stored in the array and calculates the minimum (
y
) and the maximum (z
).Loops through every character in the String again, checking if the group of that characters group is equal to the min/max (using the modulo trick mentioned earlier). If it isn't equal, then a space is added to the new String in the characters place, otherwise the original character is added.
return v;
Finally return the new String!
fuente
import java.util.stream.IntStream;
can beimport java.util.stream.*;
and,i
can be,i=0
after which you can removei=0
from the for-loop. Oh, and(s,b)->
can bes->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();
can bel=s.length(),x=0,y=l
andfor(int x:a){z=x>z?x:z;y=x<y?x:y;}
and(b?z:y)
, so you no longer need the import. Putting it all together becomes: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 bytes).Bash,
229227212 bytesTry it Online
fuente
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.
fuente
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
fuente