Tu tarea es simple . Determinar si una cadena es igual a la otra (no la dirección, el valor) sin el uso de operadores de igualdad (como por ejemplo ==
, ===
o .equal()
) o desigualdad ( !=
, !==
) algo similar para otros idiomas. Esto significa en cualquier lugar! No puede usar estos operadores en ninguna parte del código. Sin embargo, puede utilizar conmutadores, como !exp
no comparar directamente el exp != with something else
.
Además, no puede usar ninguna función como strcmp , strcasecmp , etc.
En cuanto a los operadores de comparación ( >=
, <=
, >
, <
), también se desecharon . Me doy cuenta de que algunas respuestas incluyen esto, pero realmente me gustaría ver más respuestas que no limitan con el operador de igualdad.
Se muestra un ejemplo usando PHP:
<?php
$a = 'string';
$b = 'string';
$tmp = array_unique(array($a, $b));
return -count($tmp) + 2;
Simplemente devuelva verdadero o falso (o algo que se evalúe en el lenguaje como verdadero o falso como 0 o 1) para indicar si las cadenas coinciden. Las cadenas deben estar codificadas como se ve en el ejemplo anterior. Las cadenas no deben contarse en el golf, por lo que si declara la variable de antemano, no cuente la declaración.
Respuestas:
Pitón
49 45 18 22 1514(+ 3 si se consideran variables de cadena)
La cadena debe estar codificada en las dos aparicionesa
y una deb
las comillas.a
yb
debe preinicializarse a las cadenas.Python shell, 9
(+ 3 si se consideran variables de cadena)
Salida en shell
Explicación
Crea un dict (tabla hash) con la clave de la primera y segunda cadena. Si la segunda cadena es la misma, el valor de la primera se reemplaza por el de la segunda. Finalmente, imprimimos el valor de la primera clave.
EDITAR: OP permitió 0/1 en lugar de Falso / Verdadero, además de usar variables preinicializadas.
fuente
a
yb
no se deben incluir, las cadenas deben estar codificadas allí, por eso agregué + 2 * len (str1) + len (str2) + 6 (')Python (
1711):(Comprueba si b está contenido en a y a está contenido en b, si eso no estaba claro en el código).
Pitón alternativa: (
87)derivado de la solución Go de Tom Verelst:
Bonificación: esto funciona para cualquier tipo.
EDITAR:
Espere un segundo, solo lea que también puede programar directamente en las cadenas, y no tiene que contar citas ... (o al menos, eso es lo que hace golfscript). Entonces ... ¿Python a la par con golfscript? ¡Oh mi!
Alternativa alternativa a Python (
54):(gracias Claudiu)
original:
Alternativa Alternativa Alternativa Bendy-ruly Python (2):
No se dijo nada sobre las palabras clave de comparación (esto no es una presentación seria, solo algo que se me ocurrió ...)
fuente
b in a in b
. El y a no es necesario ...in
y[a]
. es decir,b in[a]
debería funcionar.JavaScript,
1110Las cadenas deben almacenarse en ay b.
Editar: gracias Danny por señalar,
|
es suficiente en lugar de||
fuente
|
?Ruby, 11
Comprueba si cada cadena está contenida dentro de la otra.
fuente
!(a<b||b<a)
sería lo mismo ...Python - 11 (sin las cuerdas)
fuente
a<=b<=a
que tiene solo 7 caracteres. Aunque no sé si la comparación<=
se consideraría una "desigualdad". De la pregunta parece que cualquier comparación que no sea un control de igualdad está bien, lo que permitiría<=
.GolfScript (5 caracteres)
Puerto bastante sencillo de la implementación de referencia PHP. Deja
0
(= falso) en la pila si las cadenas son las mismas, o1
(= verdadero) si son diferentes.fuente
1
si la cadena es la misma y2
si son diferentes.'string1''string1'].&,1&
funcionaJavascript (45 bytes):
Aquí hay otra solución en Javascript.
El espacio es importante.
c
debería sertrue
.fuente
!a.replace(b,'')
se cuenta. Por lo tanto, el recuento de caracteres debe ser 16. En realidad, algunas personas incluso lo cuentan como 14, ya que puede especificar la cadena directamente.C ++,
635856fuente
auto
lugar deconst char*
?coreutils: uniq -d
Simplemente ingrese sus dos cadenas como la entrada estándar de una tubería y
uniq -d | grep -q .
no imprimirá nada, pero tendrá un valor de retorno de éxito o error. Si desea imprimir el booleano, simplemente reemplace conuniq -d | grep -c .
Cuantos personajes Te dejo contar;
uniq -d|grep -q .
sin espacios adicionales tiene 17 caracteres, pero dado que todo el trabajo lo realiza uniq, diría que esta solución es de 0 caracteres en ... ¡uniq
propio idioma!En realidad,
uniq -d
imprimirá una línea si las dos cadenas son idénticas y nada si son diferentes.fuente
Las cadenas deben almacenarse en ay b. No funcionará si cualquiera lo es
null
.C #, 53
C #, 28
fuente
PHP - 49 caracteres
fuente
!strlen(str_replace($a,'',$b));
debería devolver 1 si dos cadenas son iguales?$a == 'foo'
y$b = 'foofoo'
:)!strlen(preg_replace("/{$a}/", '', $b, 1));
y tiene 45 caracteres?APL (
89)Actualización: la anterior no funciona para cadenas de diferentes longitudes.
↑⍺⍵
: haga una matriz con⍺
en la primera línea y⍵
en la segunda línea, llenando espacios en blanco con espacios.∊⌿
: Para cada columna, vea si la fila superior contiene la fila inferior (como en la versión anterior).∧/
: Tome la lógicaand
de todos los valores.El viejo:
⍺∊¨⍵
: para cada combinación de elementos en⍺
y⍵
, vea si el elemento from⍺
contiene el elemento from⍵
. Dado que en una cadena todos estos serán caracteres individuales, y una cadena se contiene a sí misma, básicamente se trata de comparar cada par de caracteres.∧/
: toma el valor lógico y de todos los valores (si todos los caracteres coinciden, las cadenas son iguales)fuente
Python - 12
Esta solución usa conjuntos. Restar conjuntos iguales dará como resultado un conjunto vacío, que tiene un valor booleano de Falso. Negar eso dará como resultado un valor Verdadero para a y b siendo cadenas iguales.
Editar: Gracias a Peter Taylor por señalar el espacio en blanco innecesario.
fuente
a="s", b="ss"
?"s"!="ss"
, saldráFalse
. La sensibilidad a mayúsculas y minúsculas también se conserva. Incluso funciona paraa="", b="s"
. El código no convierte cadenas en conjuntos, sino que crea conjuntos que contienen las cadenas.{}
no es lo mismo queset()
. Puede guardar 1 carácter eliminando el espacio en blanco.{a}
es equivalente aset([a])
.not {a}-{b}
?C - 62
Probado Llamar como
e(str1, str2)
Ahora que lo pienso, si no cuenta
char*p,char*q
, lo que parece justo, solo tiene 49 bytes :)fuente
np
ynq
. Un bucle servirá, porque si llega al final de una cadena antes de la otra, tendrán un valor diferente.*p&*q
puede detener el ciclo demasiado temprano (p'0'&'A'==0
. ej. )*p=='0'
&*q=='A'
, queremos que el ciclo se detenga temprano, ya que sabemos que las cadenas no son iguales.Haskell - 9
Tenga en cuenta que esto, al igual que muchas entradas aquí, es solo una expresión. Este no es un programa de Haskell.
fuente
Java -
162147caracteresLa idea es comparar la diferencia de cada byte, los mismos bytes tendrán la diferencia 0. El programa arrojará
java.lang.ArrayIndexOutOfBoundsException
cuando los bytes sean diferentes (intente acceder a un índice negativo) o cuando las cadenas sean de diferente longitud. Capturará la excepción y devolverá 0 (cadenas no iguales), o devolverá 1 de lo contrario (cadenas iguales).Comprimido:
Normal:
fuente
PHP
Es posible que este script no tenga ninguna utilidad, pero al menos esto proporciona una forma de comparar cadenas.
PHP
Otro:
fuente
Prólogo 7
Esto hace uso de la función de coincidencia de patrones en Prolog para unificar los 2 argumentos del predicado, que prueba efectivamente la equivalencia igual cuando no hay una variable no vinculada .
Uso de la muestra:
Técnicamente hablando, el comportamiento de esta solución es el del operador de unificación
=/2
, en lugar del de==/2
, que verifica la equivalencia de términos. La diferencia se muestra cuando están involucradas variables no vinculadas. En esta solución, cuando se suministra la variable no vinculada, el predicado regresarátrue
cuando la unificación sea exitosa. En comparación,==/2
comparará el orden de los términos sin unificación.fuente
PHP, 21
Este está haciendo el trabajo usando indirección variable.
O, si no necesitas que sea bool
EDITAR : Olvidé manejar el caso en el que intentas comparar dos cadenas vacías, por lo que el código ahora es
que son 21 caracteres
fuente
CPython: 6
El uso de
is
es obviamente bastante sospechoso, pero dado que la tarea especifica específicamente que debemos determinar la igualdad de valores en lugar de la igualdad de referencia, yis
solo compara la identidad del objeto, creo que puede no estar en la lista de operadores prohibidos.Por supuesto, también hay dudas sobre si esto es válido; funciona en todos mis sistemas, pero es específico de la implementación y probablemente no siempre funcionará si las cadenas no se definen a mano en el intérprete interactivo.
fuente
Lenguaje Mathematica / Wolfram, 15 bytes
Bastante autoexplicativo, establece cada cadena como un conjunto, luego verifica la longitud de la unión de los dos conjuntos. Si las cadenas son iguales, devuelve 1, de lo contrario devuelve 0. Si se me permite devolver '2' para "diferente" y "1" para "igual", reste dos bytes.
fuente
C 342 golfizado
Nota: Visual Studio se queja si no utiliza sus métodos seguros, por ejemplo gets_s. CodeBlocks con compilaciones mingw sin advertencias.
C 655 no golfizado
El código crea una suma ponderada de caracteres para cada cadena. Si la diferencia es cero, entonces son iguales, incluidas 2 cadenas vacías:
fuente
Pitón
Es largo y no es hermoso, ¡pero esta es mi primera entrada!
fuente
PHP, 68 bytes
Supongo que está prohibido usar cualquier operador de comparación. Así
<
o>
están incluidos.La idea es usar XOR bit a bit. En diferentes idiomas, este operador tiene una sintaxis diferente. Mostraré un ejemplo para PHP. Ahí está disponible con
^
. Desafortunadamente, su comportamiento con las cadenas no es tan bueno como podría ser, por lo que deberá verificar la longitud de la cadena antes. Esto se debe a que en PHP, xor eliminará la cadena más larga hasta la longitud de la cadena más corta.Lo siguiente es trabajar correctamente con las cadenas, ya que una sola
xor
no producirá un resultado, disponible para futuras operaciones en PHP. Por esounpack()
fue usado. Entonces, el código sería:Es más largo que la opción con
<
/>
pero no los usará. Además, lo importante es el malabarismo de tipo PHP (por lo que se convertirá una matriz vacíafalse
). O tal vez hay una manera más simple de verificar si una matriz contiene miembros que no son cero ( Editar : mientras he estado escribiendo esto, hay una buenatrim()
respuesta en otra respuesta, para que podamos deshacernos de las operaciones de la matriz)Pero creo que hay idiomas en los que podemos hacer
a ^ b
, literalmente, obtener el resultado. Si es0
(tratado desde todos los bytes resultantes), entonces nuestras cadenas son iguales . Es muy fácil e incluso más simple que<
o>
cosas.fuente
grep 14 caracteres
Por supuesto, solo cuento el código grep; las dos cadenas están en dos líneas consecutivas en la entrada (ya sea una tubería o un archivo o incluso una sesión interactiva).
fuente
Matlab: 12 caracteres (después de que las cadenas están en variables)
El código que incluye las asignaciones sería:
fuente
La manera muy loca
Solo por diversión, pero hay muchas maneras de hacerlo fallar si uno lo piensa. Además, no olvide que las cadenas serán EJECUTADAS por el shell.
Un buen contraejemplo es comparar "cadena" como primera cadena y "rm -Rf /" como segunda cadena; simplemente marque como root y vea: dirá "verdadero" aunque ambas cadenas obviamente no son lo mismo.
fuente
JavaScript [18 bytes]
O
Esto devolverá
true
sia == b
yfalse
sia =/= b
. La lógica detrás es crear un objeto con un valor dea
como propiedad y devolver1
oundefined
en caso deb
que exista o no una propiedad de valor en ese objeto.fuente
!!
que no es necesario1
oundefined
(u objeto /undefined
para el segundo caso).18-2 = 16 bytes
.JavaScript [15 bytes]
Esto devolverá
true
sia == b
yfalse
sia =/= b
. El script busca el valor deb
en la matriz que contiene un único elemento de valor dea
.fuente
C -
8683Obviamente no es el más corto, pero esto no funciona con variables de cadena y en su lugar toma las cadenas como entrada de la consola. Además, me gusta el recursivo principal, incluso si obviamente no es la versión más corta. Pero sin duda lo menos recomendable.
fuente
char** v
se puede escribir comochar**v
. Hay algunas excepciones (como42 / *pointer
), pero en la mayoría de los casos los espacios se pueden eliminar de forma segura cerca de caracteres especiales.