Decimos que una cadena no discrimina si cada uno de los caracteres de la cadena aparece la misma cantidad de veces y al menos dos veces.
Ejemplos
"aa!1 1 !a !1"
es no discriminatorio , porque cada uno de los personajes!
,a
y1
aparecerá tres veces."abbaabb"
no es discriminatorio porqueb
aparece con más frecuencia quea
."abc"
es también no no discriminatorio porque los personajes no aparecen al menos dos veces.
Tarea
Escriba un programa o función no discriminatorio que devuelva un valor verdadero si una cadena dada no es discriminatoria y un valor falso de lo contrario.
Es decir, el programa ejecutado en su propio código fuente debería devolver un valor verdadero.
Cada envío debe poder manejar cadenas no vacías que contengan ASCII imprimible , así como todos los caracteres que aparecen en el código fuente del envío.
Casos de prueba
Verdad:
<your program's source code>
"aaaa"
"aa!1 1 !a !1"
"aabbccddeeffgg"
"1Q!V_fSiA6Bri{|}tkDM]VjNJ=^_4(a&=?5oYa,1wh|R4YKU #9c!#Q T&f`:sm$@Xv-ugW<P)l}WP>F'jl3xmd'9Ie$MN;TrCBC/tZIL*G27byEn.g0kKhbR%>G-.5pHcL0)JZ`s:*[x2Sz68%v^Ho8+[e,{OAqn?3E<OFwX(;@yu]+z7/pdqUD"
Falsy
"a"
"abbaabb"
"abc"
"bQf6ScA5d:4_aJ)D]2*^Mv(E}Kb7o@]krevW?eT0FW;I|J:ix %9!3Fwm;*UZGH`8tV>gy1xX<S/OA7NtB'}c u'V$L,YlYp{#[..j&gTk8jp-6RlGUL#_<^0CCZKPQfD2%s)he-BMRu1n?qdi/!5q=wn$ora+X,POzzHNh=(4{m`39I|s[+E@&y>"
Respuestas:
Brachylog , 10 bytes
Pruébalo en línea!
Explicación
fuente
Java 8,
198192186174168165160 bytes (recuento de caracteres65)Pruébalo en línea.
Código utilizado para verificar las ocurrencias de los personajes , que fue mi respuesta para este desafío .
-5 bytes gracias a @ OlivierGrégoire nuevamente al deshacerse del comentario y hacer un desastre. ;)
Antigua respuesta de 168 bytes (recuento de caracteres 6) :
Pruébalo en línea.
Código utilizado para verificar las ocurrencias de los caracteres, excluyendo el comentario , que fue mi respuesta para este desafío .
-6 bytes gracias a la eliminación de @ OliverGrégoire
<
cambiando los cheques a>
.Explicación del programa de golf base (98 bytes):
Pruébelo en línea.
Algunas cosas que hice para reducir la cantidad de caracteres utilizados:
o
,w
,u
,f
,r
, ye
fueron escogidos a propósito personajes para reutilizar los que ya teníamos (pero no superior a 6).2222
se usa en lugar de256
.e>0&u!=e|u<2
a!(e<2|u==e)|u<2
quitar 6x&
.f
, y volvemos si todavía 0 se encuentra en el extremo (esto significaba que podía quitar la 6xby
desdebyte
ahora que sólo utilizamosn
enint
6 veces en lugar de 8).e<2
yu<2
cambiado a2>e
y2>u
para eliminar 6x<
.Lo que hice para reducir la cuenta de char 6 a 5:
int
parabyte
que la cantidad den
uso sea 4 en lugar de 6.x[0]
lugar de una nueva variable,f=0
por lo que la cantidad=
utilizada es 5 en lugar de 6.2222
a por3333
lo que la cantidad de2
uso es 2 en lugar de 6.f
y der
nuevo para que ya no sean 6 tampoco.Lo que hizo @ OlivierGrégoire para deshacerse del comentario y, por lo tanto, el 5x
/
:,i,fe,fi,w;
.s:w:no0r3sswwyyy:
.|2>2
{}
alrededor de los bucles for y ifs, y agregó un{}
bloque no utilizado.!
a!!!
.|
a||
.333
a+333-3|2
para deshacerse de los operadores aritméticos sobrantes+-|
y el2
.!(x[0]>0)
a!!(0>--x[0])
.fuente
<
a>
.Jalea ,
18161210 bytesPruébalo en línea!
Cómo funciona
fuente
Brachylog ,
1412 bytesPruébalo en línea!
Explicación
Solución alternativa de 12 bytes que se reutiliza en
t
lugar deᵐ
:fuente
T-SQL, 320 bytes (32 caracteres x 10 cada uno)
La entrada es a través de una tabla preexistente
FILL
con campo varcharSTEW
, según nuestros estándares de IO .Nunca he estado más complacido, pero horrorizado, por un fragmento de código.
Debe ejecutarse en un servidor o base de datos establecida en una intercalación entre mayúsculas y minúsculas. Hay 10 cada uno de los 32 caracteres diferentes, incluidos mayúsculas y minúsculas
E
(los comandos SQL no distinguen entre mayúsculas y minúsculas, por lo que se invierten algunos según sea necesario), espacios y pestañas (las pestañas se muestran como saltos de línea en el código anterior, para facilitar la lectura).Encontré formas de incluir 10 de cada uno de los otros símbolos
+ = ,
en el código, pero desafortunadamente no pude encontrar una manera de hacerlo<
, así que tuve que agregar el carácter de comentario-
.Aquí está el código formateado antes de meter todo el relleno adicional:
La línea superior es un CTE recursivo que genera una tabla de números
b
, que unimos a la cadena de origen para separar por carácter. Esos caracteres se agrupan y cuentan, y laIIF
instrucción devuelve 0 o 1 dependiendo de si la cadena de entrada no es discriminatoria.fuente
C (gcc) ,
333168bytes¡Gracias a @Kevin Cruijssen por guardar 9 bytes y gracias a @Laikoni por guardar 45 bytes!
Pruébalo en línea!
C, 333 bytes
¡Incluso el bytecount no es discriminatorio!
Pruébalo en línea!
fuente
128
a222
para que8
se pueda descartar.i
,v
,S
,s
yL
de personajes que ya aparecen en las palabras clavechar
,for
yreturn
: probar en línea!05AB1E ,
20181614 bytesPruébalo en línea!
El programa se divide esencialmente en 2 partes donde el objetivo de la primera parte es hacer la tarea real y el objetivo de la segunda parte es utilizar las mismas funciones que la primera parte sin alterar el resultado.
Explicación (primera parte)
Explicación (segunda parte)
fuente
{γ€gDË*P≠qq{γ€gDË*P≠
es otro para 20;).¢
... buena idea hombre, también me alegra ver que≠
fue tan útil como pensé que podría ser jaja.Casco , 14 bytes
Pruébalo en línea!
Explicación
Las dos líneas cortas no funcionan, ya que la función principal nunca las llama.
fuente
m
también aparece dos veces: en la primera línea y en la segunda línea. La explicación no incluye las dos líneas cortas porque no afectan el comportamiento del programa.Python 2 ,
7569 bytesLa salida es por presencia o ausencia de un error. El error es un ValueError (uno o más caracteres aparecen solo una vez) o un NameError (los recuentos de caracteres son desiguales).
Pruébalo en línea!
fuente
{{e.dil:-tu,r.dil:-tu,}}
Dios mío, ¿qué es eso?a
y todo se rompió. ¿Podría explicar más por favor?or
. Agregaré una explicación cuando esté en una computadora.Brachylog v2, 8 bytes (en el conjunto de caracteres de Brachylog)
Pruébalo en línea!
Parece que ha habido una guerra de golf por esta pregunta en Brachylog, así que pensé en unirme, ahorrando un par de bytes en la siguiente mejor respuesta.
Este es un programa completo que toma la entrada como una lista de códigos de caracteres. (Esto se debe en parte a que Brachylog parece tener algunos errores muy extraños relacionados con las barras invertidas en las cadenas, y en parte porque el
\
comando no funciona en las listas de cadenas).Explicación
El
koḅ
final es irrelevante;k
siempre tendrá un elemento para actuaro
yḅ
no puede fallar si se le da una lista como entrada.La razón para comenzar
oḅ
debe ser clara; divide la lista de entrada por valor, por ejemplo,[1,2,1,2,4,1]
se convertiría en[[1,1,1],[2,2],[4]]
. Para que cada carácter aparezca la misma cantidad de veces, cada una de estas listas debe tener la misma longitud, es decir, la lista resultante es un rectángulo. Podemos afirmar esta rectangularidad usando\
, que también transpone las filas y columnas como un efecto secundario.Ahora tenemos un valor actual que consiste en múltiples copias del conjunto de caracteres, por ejemplo, si la entrada fuera
[4,2,1,2,4,1]
el valor actual sería[[1,2,4],[1,2,4]]
. Si eliminamos una copia, la matriz resultante sigue siendo rectangular, por lo que podemos volver a usarla\
. Sin embargo, si la razón por la matriz era rectangular fue que todos los caracteres introducidos eran distintos, la matriz resultante tendrá ningún elemento de la izquierda, y\
no no tratar a una matriz "0 × 0" como rectangular (más bien, se produce un error). Deoḅ\k\
manera tan efectiva afirma que cada carácter que aparece en la entrada aparece la misma cantidad de veces, y esa cantidad de veces no es 1.Esa es toda la funcionalidad de nuestro programa (como un programa completo, obtenemos
true
si no se produjeron fallas de aserción,false
si alguna ocurrió). Sin embargo, tenemos que obedecer la restricción de diseño de la fuente, así que agregué un adicionalkoḅ
que no tiene ningún propósito pero que no puede fallar (a diferencia\
,o
yḅ
estamos felices de actuar en listas vacías).fuente
Python 2 ,
8480 bytesPruébalo en línea!
fuente
JavaScript (Node.js) ,
144...10096 bytesPruébalo en línea!
24 personajes diferentes * 6 veces cada uno28 caracteres diferentes * 5 veces cada uno27 caracteres diferentes * 5 veces cada uno27 caracteres diferentes * 4 veces cada uno26 caracteres diferentes * 4 veces cada uno25 personajes diferentes * 4 veces cada uno24 personajes diferentes * 4 veces cada uno
Explicación
fuente
PowerShell , 104 bytes
Pruébalo en línea!
Esto fue muy divertido para el golf. La limitación era
$
, que necesitamos cuatro como mínimo (uno para la entrada$args
, uno para asignar el resultado del cálculo$qe
, uno para verificar el último carácter$qe[-1]
y otro para verificar el primer carácter$qe[0]
, por lo que ese era el número máximo de caracteres en funcionamiento.A partir de ahí, se trataba de jugar al golf (y no jugar al golf, como tener un nombre de variable de dos letras) para que el programa sea divisible por cuatro. Tenga en cuenta que tenemos un pequeño comentario (todo lo que sigue al
#
) para tener en cuenta algunos elementos faltantes, pero intenté mantener el comentario lo más pequeño posible.fuente
Haskell,
907572 bytesCada personaje aparece 6 veces. La cadena de entrada se toma como una lista singleton .
Pruébalo en línea!
Como referencia, versiones anteriores:
75 bytes, cada char 5 veces
Pruébalo en línea!
90 bytes, cada char 3 veces:
Pruébalo en línea!
fuente
Python 2 ,
1081049288 bytes-12 bytes gracias a Rod
-4 bytes gracias a Kevin Cruijssen
Pruébalo en línea!
fuente
s=input();c=s.count;print[all(c(s[[]>[1]])>=c(o)>1. for o in s)];aaafffillpprrtuu=1.>1.;
88 bytes al deshacerse del comentario.aaabb
parece cederTrue
MATL , 12 bytes
La entrada es una cadena entre comillas simples. Las comillas simples en la cadena se escapan duplicando.
La salida es una matriz no vacía, que es verdadera si no contiene ceros, y es falsa si contiene al menos un cero.
Pruébalo en línea!O verifique todos los casos de prueba , incluida la prueba estándar de veracidad / falsedad para mayor comodidad.
Cómo funciona
Las declaraciones marcadas con
(*)
no son necesarias ni dañinas, y se han incluido solo para que el código fuente no sea discriminatorio.fuente
Perl 5 ,
-p
57 bytesCada personaje aparece 3 veces. Solo una
1
no hace nadaSe agregaron 12 bytes a una solución básica de 45 caracteres para hacer que no sea discriminatorio
Pruébalo en línea!
fuente
R , 90 bytes
Pruébalo en línea!
Salidas
TRUE
para una cadena no discriminatoria, yFALSE
para una cadena discriminante. He escrito mucho código feo para desafíos en este sitio, pero creo que este es el más feo hasta ahora.45 caracteres, utilizados dos veces cada uno (incluidos algunos en un comentario). La mejor respuesta R anterior fue de 116 bytes , con 29 caracteres utilizados 4 veces cada uno; Estoy publicando esto por separado ya que es sustancialmente diferente.
El código es equivalente a
que convierte la entrada en un vector de enteros, calcula una tabla de contingencia
y
de de los valores, luego verifica que todos los recuentos en esa tabla sean iguales al primer recuento, y que el primer recuento sea mayor que 1.La dificultad inicial fue usar solo 2 pares de paréntesis. Esto se logra redefiniendo las funciones unarias
!
y?
to beutf8ToInt
yprod
respectivamente. (No puedo usarall
porque necesito ela
). Hay cuatro tareas: dos con=
y dos con<-
. Esto significa que la prueba de igualdad entrey
yz
no puede usary==z
niy-z
;y%in%z
viene al rescateLa definición de estas funciones utiliza todas las comillas posibles: dos comillas dobles, dos comillas simples, y necesitaré los dos backticks en el siguiente párrafo, así que tuve que recurrir a en
readLines()
lugar descan(,"")
. (Las otras opciones, comoscan(,letters)
oscan(,month.abb)
todas, usaban un preciosot
que no podía ahorrar).En este punto, tenía la mayor parte de los componentes básicos:
utf8ToInt
,prod
,table
,readLines
,%in%
. Tres personajes aparecen tres veces en esos nombres:ent
. Primero, descubrí quetable(foo)
es equivalente axtabs(~foo)
guardar ele
. Puedo rescatar eln
y elt
con el truco de código hexadecimal / octal ; la solución más golfista es usaru\164f8ToI\x6Et
(en backticks) parautf8ToInt
.fuente
NA
lamentablemente no se considera un valor verdadero (en R, si (NA) x más y causa un error, porNA
lo que no es ni verdadero ni falso) )Brachylog , 18 bytes
Pruébalo en línea!
Desafortunadamente, no puedo eliminar los avances de línea, ya que
ḅ
en un número se activa un error.fuente
Ruby ,
8778 bytes26 caracteres repetidos 3 veces cada uno
Pruébalo en línea!
fuente
gets
y;
. Lo cambié, de todos modos es más corto como una lambdaR,
132116bytesTampoco contiene comentarios ni cadenas superfluas, aunque probablemente este sea mi único momento en el código de golf llamando a una función
crudcardounenforceableuploads
.¡Probablemente haya un gran anagrama en alguna parte para el nombre de la función!Gracias a John Dvorak por señalar un buen solucionador de anagramas, que usé para el nombre.Tabla de caracteres:
ejemplos:
fuente
>
s, cambiando la comparación conf
. También se puede usar en=
lugar de<<-
.strsplit
Sin embargo, es inevitable, que es la fuente de la mayoría de los otros personajes.utf8ToInt
lugar de hacerlostrsplit
, pero no estoy seguro de si eso ayudará. ¿También puede incluir un enlace a TIO?.
parece ser superfluo.BASH 144 bytes
Esta línea de código toma una cadena estándar como entrada. "grep -o". pone a cada personaje en una nueva línea. "uniq -c" cuenta el uso de cada personaje. El script awk crea una matriz con cada uso como un elemento diferente, y genera verdadero cuando solo hay 1 índice de matriz y el valor es al menos 2. Cada carácter se usa 4 veces, por lo que esta fuente devuelve verdadero
fuente
Stax ,
262418 bytesPruébalo en línea!
La solución más corta hasta ahora que solo utiliza ASCII imprimiblesBeaten byMATL.Supongo que me estaba acercando al problema por el camino equivocado. Repetir un bloque de trabajo no es golf ni interesante. Ahora al menos se ve mejor ...
Explicación
:u{m*
produce algo de basura que no afecta la salida.fuente
#
y dos:
s, ¿leíste mi respuesta en la segunda línea? ¿Te saltaste el primer párrafo de mi "Explicación"?Pip , 22 bytes
Pruébalo en línea!
Explicación
Cada personaje aparece dos veces.
Versión alternativa de 22 bytes con menos no-ops:
fuente
SmileBASIC,
164152148140 bytes35 personajes diferentes, repetidos 4 veces cada uno.
No se utilizaron comentarios (pero la expresión posterior
neXT
nunca se evalúa realmente)Guión para verificar las respuestas:
Mostrar fragmento de código
fuente
Retina 0.8.2 ,
16890 bytesLa salida estará vacía si es falsa o no vacía si es verdadera.
Pruébalo en línea
Programa principal (39 bytes)
Explicación
Todo el programa central está en un bucle silencioso. La primera etapa ordena la entrada. La segunda etapa imprimirá la cadena actual si consta de pares sucesivos de caracteres diferentes. La tercera etapa elimina la última aparición de cada carácter (eliminando uno de cada carácter en la cadena).
Sobre la basura en la parte superior: el orden es importante. Además de la necesidad de ser sintácticamente válido, debe haber un punto y coma después de los asteriscos y antes de los puntos de retroceso, siempre que
*
esté en la cadena de configuración, para que no se imprima.fuente
CoffeeScript 1 ,
969390 bytesPruébalo en línea!
Comencé con mi respuesta ES6 pero volví a usar
Array.every
.323130 fichas @ 3 cada unafuente
Pyth, 30 bytes
Espacios principales necesarios.
Pruébalo en línea!
El programa actual es justo
&q1lJ{hMrSz8<1hJ
. Acabo de anteponer la cadena"&8<MQSlqr{"
para que no sea discriminatoria. Pero para que la cadena no se imprima, tuve que agregar un espacio, así que agregué 2 espacios.length_encode
here (r <any> 8
) toma una secuencia y genera la longitud de cada ejecución del mismo carácter, ej."aaabbcc"
se convierte[[3, "a"], [2, "b"], [2, "c"]]
.Entonces esto toma la entrada, la ordena para ponerla en codificación de longitud y toma el primer elemento de cada lista en la lista resultante (por ejemplo, el ejemplo anterior sería
[3, 2, 2]
). Esto da un recuento de cuántas veces aparecen los caracteres. Luego se deduplica (el ejemplo anterior sería[3, 2]
), y J está configurado para eso.Luego verifica si la longitud es 1, es decir, solo hay 1 número único de veces que ocurre un carácter, y si es> 1, es decir,> = 2.
Puede haber un reemplazo para reemplazar
rSz8
ohMrSz8
no puedo encontrar uno.fuente
C (gcc) , 153 bytes
Pruébalo en línea!
Devuelve la dirección de la cadena como valor verdadero y cero como falso.
fuente
Perl 6 ,
5857 bytesPruébalo en línea!
Resulta que la versión de tres caracteres es ligeramente más corta que la de dos caracteres.
fuente