Desafio:
Entradas:
- Uma sequência contendo ASCII imprimível (excluindo espaços, tabulações e novas linhas)
- Um booleano †
Resultado:
As partes da String são divididas em quatro grupos:
- Letras minúsculas
- Letras maiúsculas
- Dígitos
- De outros
Com base no booleano, produzimos a ocorrência mais alta de um (ou vários) desses quatro grupos, ou o menor, substituindo todo o resto por espaços.
Por exemplo:
Entrada: "Just_A_Test!"
Contém:
- 3 letras maiúsculas: JAT
- 6 letras minúsculas: ustest
- 0 dígitos
- 3 outras:__!
Estes seriam os resultados para true
ou false
:
true: " ust est "
// digits have the lowest occurrence (none), so everything is replaced with a space
false: " "
(Nota: Você tem permissão para ignorar espaços à direita, para que as saídas também possam ser " ust est"
e ""
respectivamente.)
Regras do desafio:
- A entrada nunca estará vazia ou conterá espaços e consistirá apenas em ASCII imprimível no intervalo
33-126
ou'!'
através dele'~'
. - Você pode receber as entradas e / ou saídas como matriz ou lista de caracteres, se desejar.
- † São permitidos dois valores consistentes e distintos para o booleano:
true
/false
;1
/0
;'H'
/'L'
;"highest"
/"lowest"
; etc. Observe que esses valores distintos devem ser usados (um pouco) como um booleano! Portanto, não é permitido inserir dois programas completos, um que forneça o resultado corretotrue
e o outro parafalse
, e apenas ter o seu código real<run input with parameter>
. Nova brecha padrão relevante que eu adicionei, embora ainda possa usar muitas afinações nas definições. - Se a ocorrência de dois ou mais grupos for a mesma, produzimos todas essas ocorrências.
- Os espaços à direita necessários são opcionais, e uma única nova linha à direita também é opcional. Os espaços de liderança necessários são obrigatórios. E quaisquer outros espaços à esquerda ou novas linhas não são permitidos.
Regras gerais:
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados, programas completos. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código.
- Além disso, adicione uma explicação, se necessário.
Casos de teste:
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 "
e" 9 "
(com espaços apropriados) ser emitido em vez de"H 9"
?H
e9
são parte do "menor número"."max"
/"min"
, que é usadoMath[b]
para se referir aMath.max
ouMath.min
?b?"max":"min"
sua resposta .. É uma linha tênue eu acho, talvez eu deveria usar apenas um valor truthy / Falsey próxima vez ..Respostas:
Casca ,
27262422 bytes-2 bytes graças ao Zgarb
-2 bytes graças a Leo
Toma
' '
comoFalse
e'a'
comoTrue
(em Husk, espaço em branco em Fasly e todos os outros caracteres são Truthy)Experimente online!
Como funciona?
†
ḟ
é uma função que recebe um predicadop
e uma listaL
e retorna o primeiro elementoL
que satisfazp
. Se nenhum elemento atender,p
um argumento padrão será retornado. Nesse caso' '
. Ao aplicarḟ
a uma cadeia de um caracter, estamos essencialmente dizendoif p c then c else ' '
.Ṫ
É uma função que recebe uma funçãof
e duas listasL1
,L2
. Retorna uma tabela def
aplicada sobre todos os pares deL1
eL2
. Neste casof
éḟ
,L1
é a nossa lista de 4 funções, eL2
é a lista de um cadeias de caracteres.Depois de
Ṫḟ
, temos uma lista de cadeias em que cada cadeia é o resultado da substituição de caracteres que não satisfazem uma das regras por a' '
.NB: Nas versões mais recentes do Husk,
ġ#¬Ö#≡⁰
pode ser substituído pork#≡⁰
uma economia de 3 bytes!fonte
' '
e'a'
? Talvez eu entenda melhor quando a explicação for adicionada, porque não consigo ler Husk. ;)Ṫ
.Mmm
estava fazendo eu mesmo :)S`?'
pode ser mais simples como?IK'
I
, às vezes isso leva o intérprete para sempre. Também parece um desperdício.Gelatina , 31 bytes
Experimente online!
Os valores booleanos são
2
e1
(ou qualquer outro par par / ímpar positivo), que representamTrue
eFalse
respectivamente. Vou tentar adicionar uma explicação depois de mais golfe.Agradecemos a caird coinheringaahing por salvar 2 bytes e a Lynn por salvar 4 bytes! Graças a um dos truques de Erik , que me inspiraram a economizar 4 bytes!
Como funciona
Observe que esta é a explicação para a versão de 35 bytes. O novo faz aproximadamente o mesmo (mas aprimorado um pouco por Lynn), então não vou mudar.
fonte
µ
D estranho :ØṖḟØBṭØBUs26¤
e teste a associação comf
e emÇ
vez dee¢$
.Python 2 ,
166158 bytesExperimente online!
fonte
R ,
193186179158 bytes-7 bytes graças ao NofP e sua sugestão de
cbind
-6 bytes usando
outer
-1 comutação de bytes[^a-zA-Z0-9]
com[[:punct:]]
-21 bytes graças ao MickyT por apontar uma lista de caracteres é permitido
Verifique todos os casos de teste
Toma
1/T
como verdade (max
) e0/F
como falsey (min
) e levaS
como uma lista de caracteres únicos.Experimente online!
Na minha versão original (com sugestões da NofP), a matriz
y
é construída avaliandogrepl(regex, S)
cada uma delasregex
e concatenando-as juntas como colunas de uma matriz. Isso resulta em várias chamadas paragrepl
, mas comoS
é corrigido, parecia que algo mais precisava ser feito. Como observei:Eu usei,
outer
e nãomapply
, que sempre retorna uma matriz (neste caso, uma matriz) e fui forçado aVectorize
grepl
, o que é realmente apenas ummapply
invólucro em torno dela.Também descobri o grupo de caracteres predefinido
[:punct:]
que corresponde aos caracteres de pontuação (não espaço, não alfanumérico).fonte
like this
. :)S=el(strsplit(G,""))
Casca ,
31 2928 bytesUsa 0 para o mínimo e 1 para o número máximo de caracteres. Experimente online!
Explicação
Listas de funções são legais.
fonte
Python 2 , 140 bytes
Experimente online!
Jonathan Frech salvou um byte. Obrigado!
Maior é
m=-1
, menor ém=0
.fonte
+x.isalpha()*-~(x>'Z')
por-~(x>'Z')*x.isalpha()
.Geléia , 35 bytes
Experimente online!
fonte
Java (OpenJDK 8) ,
448439432362361354352348343320 bytesExperimente online!
fonte
+
em\\|+$
para um -1 byte 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()
pode tern=-1>>>1
um -4 adicional.[0-9]
->\\d
Ruby ,
118116 bytesAceita
0
(mais baixo) ou-1
(mais alto) para seu segundo argumento.-2 bytes graças a Lynn.
Experimente online!
Ungolfed
fonte
-1
como o valor "mais alto" e substituirminmax[t]
porsort[t]
.Python 2,
190183174173 bytesObrigado a Jonathan Frech por reduzi-lo
Isso leva as cordas
'max(l)'
e'min(l)'
como verdadeiro e falso. (Eu não acho que isso viole as regras ...?) Isso é mais longo que as outras duas respostas python, mas diferente, então pensei em publicá-la. Eu não sou um grande jogador de golfe, então acho que isso poderia ser melhorado, mas todas as coisas que tentei não funcionaram.Experimente online!
fonte
sum(1for m...
deve sersum(1 for m...
, mas acho que há outros problemas também. Você poderia fornecer um link para um intérprete on-line (como tio ) para demonstrar como você está chamando isso e mostrar que não está errado?max(l)
emin(l)
como strings, é por isso que eu estava recebendo erros. Obrigado por esclarecer isso! Embora agora, isso esteja à beira da violação da regra # 3, `Observe que esses valores distintos devem ser usados (um pouco) como um booleano`, mas é definitivamente um pouco de uma área cinza.JavaScript (ES6),
151149 bytesInfelizmente as regras provavelmente não me permitem passar
Math.max
ouMath.min
como bandeira. Editar: salvou 2 bytes graças a @JustinMariner.fonte
Geléia , 37 bytes
Experimente online!
-6 bytes "emprestando" da postagem de Erik: D
fonte
Java (OpenJDK 8) ,
307 + 34306 + 2727295 bytesMinha "interessante" assumir o desafio.
Agradecemos a Kevin Cruijssen por
reduzir os bytes de importação,removendo a importação totalmente!Experimente online!
Explicação:
Primeiro, substitui cada grupo por um número inteiro entre 0 e 3 usando alguma regex simples e armazena isso em uma nova String.
int a[]={0,0,0,0},m,i=0,z=0,y=-1>>>1;
Inicializa uma matriz de números inteiros, bem como alguns outros números inteiros para usar posteriormente. Define a
y
variável para o tamanho máximo int usando deslocamento de bit direito não assinado.t.chars().forEach(j->{a[j%4]++;});
Para cada caractere na cadeia modificada, isso usa seu valor ASCII módulo 4 para calcular o índice da matriz acima mencionada para incrementar.
Em seguida, ele percorre as contagens de cada grupo armazenado na matriz e calcula o mínimo (
y
) e o máximo (z
).Repete cada caractere na String novamente, verificando se o grupo desse grupo de caracteres é igual ao mínimo / máximo (usando o truque de módulo mencionado anteriormente). Se não for igual, um espaço será adicionado à nova String no lugar dos caracteres, caso contrário, o caractere original será adicionado.
return v;
Finalmente, retorne a nova String!
fonte
import java.util.stream.IntStream;
pode serimport java.util.stream.*;
e,i
pode ser,i=0
depois do qual você pode removeri=0
do loop for. Ah, e(s,b)->
pode sers->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();
pode serl=s.length(),x=0,y=l
efor(int x:a){z=x>z?x:z;y=x<y?x:y;}
e(b?z:y)
, assim você não precisa mais da importação. Juntar tudo se torna: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 bytesExperimente Online
fonte
f(){((
.(
, também 2 bytes poderiam ser salvas usando(
em vez de{
, desempenho degradante porque a criação de um subnívelPHP,
161158 bytesCorrer com
-nr
ou experimente online .e conte as ocorrências de grupos nos quais o personagem atual não é .
(essa negação salvou 3 bytes)
da contagem mínima / máxima, em seguida, imprima o espaço, caso contrário, imprima o caractere.
fonte
JavaScript (ES6), 139 bytes
Entrada e saída é uma matriz de caracteres. Toma valores booleanos reais para entrada.
Uma abordagem diferente da resposta de @ Neil ; quase evitando expressões regulares. Em vez disso, usei uma série de verificações para determinar a categoria de cada personagem:
true
parac>-1
porque não dígitos falhar comparações matemáticas/[a-z]/i
e possuem pontos de código menores que"a"
"a"
Casos de teste
Mostrar snippet de código
fonte