Odd'em out: letras

11

Objetivo

Escriba un programa o función (o equivalente) que clasifique y devuelva la letra impar en la matriz de tamaño aleatorio.

Detalles

Se le pasará una matriz (como una cadena) como entrada de dimensiones aleatorias como esta.

bbbbbbbbbb
bbbbbdbbbb
bbbbbbbbbb
bbbbbbbbbb
bbbbbbbbbb

Su trabajo es encontrar la letra que no coincide con el resto (en este caso, se dencuentra en la línea 2, col 6) y devolver esa letra como salida. La matriz consistirá en letras A-Z, a-zlíneas nuevas ( \nsolo en los extremos de las filas) y tendrá dimensiones que van desde 5x5 a 10x10 (25-100 letras).

Se aplican lagunas estándar. Este es un desafío de código de golf; la entrada con el código de bytes mínimos gana.

Entrada

La entrada se pasará a través de la entrada estándar como una cadena si es un programa o como argumento si es una función (o similar).

Salida

Un único personaje que es la "extraña" en la matriz o None , nil, NUL, o la cadena "None", si no hay ningún carácter "extraño".

Más ejemplos

AAAAAAA
AAAAAAA
AAAAAAA
AAAIAAA
AAAAAAA

Responder: I

vvqvvvvvvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvvvvv
vvvvvvvvvv

Responder: q

puuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu
uuuuuuuuu

Responder: p

Generador

Aquí hay un generador de matriz aleatorio escrito en Python que puede usar para probar su programa. Nota: Existe una pequeña posibilidad de que pueda cometer un error y no poner una letra extraña.

juniorrubista
fuente
1
Aquí hay una traducción literal de su código Python a JS.
Arnauld
1
@juniorRubyist "eliminar el bono" no es lo mismo que "hacer obligatorio el bono". Al trasladar la parte que era opcional hasta ahora a los requisitos del desafío, ha invalidado una gran parte de las respuestas existentes.
Martin Ender

Respuestas:

6

J , 12 10 7 bytes

-.}./.~

Pruébalo en línea!

    /.~        Group identical items together
  }.           Remove one item from each group
-.             Remove the rest from the input

Versión de 10 bytes

-._1 1{\:~

siseo ...

       \:~        Sort down
  _1 1{           Take the last character (which is a newline) and the second one.
-.                Remove those from the input
FrownyFrog
fuente
2
@ FrownyFrog Esta es una manera inteligente de encontrar el personaje extraño
Galen Ivanov el
no puedo decidir qué me gusta más: este encantador gancho o tu broma de dragón ...
Jonás
4

Brachylog , 8 4 bytes

oḅ∋≠

Pruébalo en línea!

Explicación

No he usado Brachylog antes, por lo que esto puede no ser óptimo.

oḅ∋≠  Input is a string.
o     Sort the input.
 ḅ    Split it into blocks of equal elements.
  ∋   There is a block
   ≠  whose elements are all different.
      That block is the output.
Zgarb
fuente
Ese uso de ∋≠after para obtener los resultados de la longitud 1 es muy inteligente. Definitivamente debe publicarlo en la pregunta de consejos Brachylog .
Fatalize
@ Fatalize Gracias, agregué el consejo.
Zgarb
3

K (oK) , 7 6 bytes

Solución

*<#:'=

Pruébalo en línea!

Ejemplo:

*<#:'="vvqvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv"
"q"

Explicación:

Encontró un enfoque un poco más corto: evaluado de derecha a izquierda:

*<#:'= / the solution
     = / group matching items together
  #:'  / count (#:) each (')
 <     / sort ascending
*      / take the first one

Notas:

Si bien espero que se elimine el aspecto adicional de este desafío, esta solución devolverá el carácter de nueva línea \nsi no hay un carácter extraño:

*<#:'="vvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv\nvvvvvvvvvv"
"\n"
callejero
fuente
3

Prólogo (SWI) , 46 bytes

p(L):-select(X,L,Y),\+member(X,Y),writef([X]).

Pruébalo en línea!

O si el resultado verdadero estándar de las consultas de prólogo no está bien:

Prólogo (SWI) , 48 bytes

Z*L:-select(X,L,Y),\+member(X,Y),char_code(Z,X).

Pruébalo en línea!

Explicación

Find the first element X in the input  
that when removed, results in output  
that does not contain X

then depending on the version above either:  
print X as a character  
or  
return X as an atom
Emigna
fuente
3

C (gcc) , 93 92 90 66 62 Bytes

Mucho más corto como una función

t;f(char*p){for(t=*p;*p;)t^*p++?putchar(*p^*--p?*p:t),*p=0:0;}

Pruébalo en línea!

código de prueba

main()
{
    char s[99];
    for(;gets(s);)f(s);
}

la versión anterior es un programa

C 86 Bytes

char*p;s[9];main(t){for(;p=gets(s);)for(t=*p;*p;)t^*p++?putchar(*p^*--p?*p:t),*p=0:0;}

Emite el carácter impar, o nada. corre así;

C:\eng\golf>python matrix_gen.py | a.exe
X
C:\eng\golf>python matrix_gen.py | a.exe
G
C:\eng\golf>python matrix_gen.py | a.exe
x
C:\eng\golf>python matrix_gen.py | a.exe

C:\eng\golf>python matrix_gen.py | a.exe
J
cleblanc
fuente
No sé si es bastante justo ponerlo gets()en el controlador de prueba, ya que está desinfectando la entrada al eliminar los caracteres \ n para usted. Eso está haciendo un trabajo para que su función no funcione en la entrada original.
Michael Dorgan
@MichaelDorgan Funciona con la entrada canalizada del script de Python, así como con la entrada en TIO. Otros simplemente codificaron la entrada que no parecía con el espíritu del desafío.
cleblanc
3

05AB1E ,  4  2 bytes

Guardado 2 bytes gracias a Adnan

.m

Pruébalo en línea!

Explicación

.m   # push a list of the least frequent character(s) in input
Emigna
fuente
¿Necesita eliminar las nuevas líneas, ya que estamos garantizados que la entrada tendrá al menos 5 líneas?
Shaggy
@ Shaggy: No, no lo hago. Eso fue para manejar 2x2matrices. Me perdí la parte sobre 5x5y arriba. ¡Gracias!
Emigna
Tiene que regresar nilsi no tiene un "extraño" ¿no?
Urna mágica del pulpo
@MagicOctopusUrn Esa parte era opcional cuando se publicó esta respuesta. Supongo que ese cambio invalida la mayoría de las respuestas ahora ...
Martin Ender
2

Retina , 13 bytes

s(O`.
(.)\1+

Pruébalo en línea!

Explicación

s(O`.

Ordenar todos los personajes.

(.)\1+

Elimina los caracteres que aparezcan al menos dos veces.

Martin Ender
fuente
2

Casco , 2 bytes

◄=

Pruébalo en línea!

Esta es una función que toma una cadena como entrada y devuelve un carácter. Se necesita el mínimo de la cadena de entrada al comparar caracteres para igualdad (es decir, devuelve el carácter que es igual al menor número de otros caracteres).

León
fuente
2

C, 94 bytes

Regreso por puntero. Si no hay ninguno, regrese \0.

Esto provocará pérdidas de memoria. Suponiendo que intes de 4 bytes.

*t;f(c,p,i)char*c,*p;{t=calloc(64,8);for(*p=-1;*c;c++)t[*c]--;for(i=0;++i<128;)!~t[i]?*p=i:0;}

Pruébalo en línea!

Colera Su
fuente
@Shaggy En realidad, no sé cómo interpretar esa regla, ya que veo que algunos (otros) usuarios saben explícitamente sobre esa regla pero aún publican respuestas como esta.
user202729
2
@ user202729, solo porque otros lo hagan no significa que sea correcto;) Si detecta tales soluciones, es mejor señalarlas.
Shaggy
@Shaggy Bueno, señalé explícitamente la regla, pero ese usuario dijo "la regla dice explícitamente que esta es válida". No se que decir. El | En este caso, la función requiere que la matriz tse ponga a cero antes de llamar cada vez, no la primera vez.
user202729
@ Shaggy Gracias, arreglado.
Colera Su
2

Bash , 15 20 bytes

fold -1|sort|uniq -u

Pruébalo en línea!

Explicación: fold s la entrada al 1carácter por línea, sorts en grupos de letras coincidentes, luego imprime solo las líneas que son unique.

Gracias @Nahuel Fouilleul por atrapar y ayudar a solucionar un problema con este enfoque.

Justin Mariner
fuente
no funciona si el personaje extraño es el segundo o el penuitimate
Nahuel Fouilleul
@NahuelFouilleul Buena captura ... No estoy seguro de cómo solucionarlo en este momento, pero lo arreglaré o eliminaré más adelante a menos que haya una solución sugerida.
Justin Mariner
simplemente se puede solucionar, |sort|pero puede haber una solución mejor
Nahuel Fouilleul
También encontré una solución con grep pero es más largagrep -oP '^(.)((?=(?!\1).){2}|.*\K(?!\1).)'
Nahuel Fouilleul
@NahuelFouilleul Me voy con la sortsolución, gracias. Sin embargo, siempre puedes publicar esa respuesta grep como si fuera tuya.
Justin Mariner
1

Pyth , 4 bytes

ho/Q

Pruébalo aquí!

Sr. Xcoder
fuente
.m/Qes de 4 bytes también
Dave
@Dave Eso sale como una lista, sin embargo, elegí esto porque era más elegante ;-)
Sr. Xcoder
1

Matlab, 25 bytes

a=input('');a(a~=mode(a))

La entrada "a" donde "a" no es el modo de "a". Emite una matriz vacía para ningún bicho raro.

Jeremiah Peek
fuente
1

Haskell, 33 * 0.75 = 24.75 bytes

f s=[c|[c]<-(`filter`s).(==)<$>s]

Devuelve una lista vacía si no hay caracteres extraños.

Pruébalo en línea!

Para cada carácter cen la matriz (dado como una cadena s), haga una cadena de todos los caracteres sque sean iguales cy mantenga los de longitud 1.

nimi
fuente
1

JavaScript (ES6), 37 bytes

Devuelve nullsi no hay letras impares.

s=>s.match(`[^
${s.match(/(.)\1/)}]`)

Casos de prueba

Arnauld
fuente
1

Japt , 6 bytes

Toma la entrada como una cadena de varias líneas y genera una cadena de un solo carácter, o una cadena vacía si no hay solución.

k@èX É

Intentalo


Explicación

Elimine los caracteres que devuelven verdadero ( k) cuando se pasa a través de una función ( @) que cuenta ( è) las ocurrencias del elemento actual ( X) en la entrada y resta 1 ( É).

Lanudo
fuente
1

Lisp común, 47 bytes

(lambda(s)(find-if(lambda(x)(=(count x s)1))s))

Pruébalo en línea!

Devuelve la letra impar o NIL si no existe.

Renzo
fuente
1

Jalea , 4 bytes

ċ@ÐṂ

Pruébalo en línea!

Regresar \n(una nueva línea) en caso de que no haya un carácter impar. Obviamente \nno es un personaje imprimible.

Casualmente, este es exactamente el mismo algoritmo que la respuesta Mr.Xcoder Python. (Se me ocurrió de forma independiente)

Explicación:

  ÐṂ    Ṃinimum value by...
ċ@      ċount. (the `@` switch the left and right arguments of `ċ`)

Eso funciona porque en una m×nmatriz:

  • Si existe un carácter impar: hay m-1líneas nuevas, 1 carácter impar y m×n-1carácter normal, y 1 < m-1 < m×n-1porque 5 ≤ m, n ≤ 10.
  • Si no existe un carácter extraño: hay m-1líneas nuevas y m×ncaracteres normales, y m-1 < m×n.
usuario202729
fuente
1

C # (.NET Core) , 54 bytes

i=>i.GroupBy(x=>x).FirstOrDefault(g=>g.Count()<2)?.Key

Pruébalo en línea!

Wakawakamush
fuente
Tienes razón, mi respuesta fue incorrecta. Lo he eliminado Pero le faltan los 18 bytes de la usingdeclaración en el recuento de bytes.
raznagul
1

C (gcc) , 91 86 82 79 71 bytes

f(char*s){for(;*++s==10?s+=2:0,*s;)if(*s^s[-1])return*s^s[1]?*s:s[-1];}

Pruébalo en línea!

  • Gracias a Gastropner por el xor y? trucos (-3 bytes)
  • Se modificó la versión de comparación para corregir errores y se utilizó la magia de Gastropner de los comentarios.

Explicación:

Compara los caracteres actuales y anteriores mientras saltas las nuevas líneas. Si es diferente, compare con el siguiente personaje. Esto nos dice si devolvemos los caracteres actuales o anteriores. La función devuelve el valor char "impar" si existe o 0 si la matriz no es impar. Nos salimos con la "próxima" verificación de caracteres porque siempre hay una nueva línea antes del \0carácter. Si no hay caracteres impares, retornamos intrínsecamente el \ 0 del ciclo for.


Código xor más antiguo y sexy Explicación:

Haga una máscara xor en ejecución de los siguientes 3 valores de cadena. Si son todos iguales, entonces el valor será igual a cualquiera de los tres. Si son diferentes, entonces los 2 idénticos se cancelarán entre sí dejando el único.

Debe factorizar / n antes del xor o se vuelve desordenado. También debe verificar 2 caracteres para la desigualdad en caso de que s [0] sea el valor impar. Esto cuesta el extra || cheque.

v;f(char*s){while(s[3]){s[2]==10?s+=3:0;v=*s^s[1]^s[2];if(v^‌​*s++||v^*s)break;}}
Michael Dorgan
fuente
79 con algunos ajustes. El retorno v;f(char*s){while(s[3]){s[2]==10?s+=3:0;v=*s^s[1]^s[2];if(v^*s++||v^*s)break;}}
fallido
Para la basura que estoy escribiendo, TIO es con lo que me quedo. ¡Gracias!
Michael Dorgan
Reorganizar algunas expresiones permite otro -2 para 77: v;f(char*s){while(s[2]==10?s+=3:0,v=*s^s[1]^s[2],s[3])if(v^*s++||v^*s)break;} Sin embargo, tu caballo ganador es el otro, si v;f(char*s){for(v=-1;*++s==10?s+=2,v--:0,*s;v=0)if(*s^s[-1])return s[v];}
juegas
Sí, pero el xor parece muy sexy. :)
Michael Dorgan
Sugerir en s+=*++s-10?0:2lugar de*++s==10?s+=2:0
ceilingcat
1

Octava , 26 25 bytes

1 byte guardado gracias a @Giuseppe

@(x)x(sum(x(:)==x(:)')<2)

Función anónima que toma una matriz de caracteres 2D como entrada y emite la letra impar o una cadena vacía si no existe.

Pruébalo en línea!

Luis Mendo
fuente
0

Alice , 16 * 75% = 12 bytes

/-.nDo&
\i..*N@/

Pruébalo en línea!

Salidas Jabberwockysi no hay caracteres duplicados.

Explicación

/...@
\.../

Este es un marco para programas lineales que operan completamente en Ordinal (modo de procesamiento de cadenas). El código real se ejecuta en zigzag y se despliega para:

i..DN&-o

i   Read all input.
..  Make two copies.
D   Deduplicate one copy, giving only the two letters and a linefeed.
N   Multiset difference. Removes one copy of each letter and one linefeed.
    Therefore it drops the unique letter.
&-  Fold substring removal over this new string. This essentially removes
    all copies of the repeated letter and all linefeeds from the input,
    leaving only the unique letter.
.   Duplicate.
n   Logical NOT. Turns empty strings into "Jabberwocky" and everything else
    into an empty string.
*   Concatenate to the previous result.
o   Print the unique letter or "Jabberwocky".

En lugar de &-, también podríamos usar ey(transliteración a una cadena vacía). Alternativamente, al gastar un carácter más en la manipulación de la pila, también podríamos deduplicar la entrada que nos permite eliminar los caracteres no deseados N, pero sigue siendo el mismo número de bytes:

i.D.QXN.n*o@

Alice , 13 bytes

/N.-D@
\i&.o/

Pruébalo en línea!

Esta es la solución sin la bonificación, simplemente falta la .n*.

Martin Ender
fuente
0

APL + WIN, 16 bytes

(1=+/a∘.=a)/a←,⎕

Solicita la entrada de pantalla y genera letras impares o nada si no hay letras impares

Graham
fuente
a/⍨1=+/a∘.=a←,⎕por un byte
Uriel
@Uriel Gracias, pero me temo que el operador ⍨ no está disponible en mi versión anterior de APL + WIN 5 :(
Graham
0

PowerShell , 39 bytes

([char[]]"$args"|group|sort c*)[0].Name

Pruébalo en línea!

Toma la entrada como una cadena con nuevas líneas (como se especifica en el desafío), la convierte en una charmatriz. Luego, Group-Objectlos personajes, de modo que los personajes se agrupan por sus nombres, luego en sortfunción de la cbúsqueda. Esto asegura que el personaje solitario sea el primero, por lo que tomamos el [0]índice y lo sacamos .Name.

Si la nueva línea es aceptable para "nada", entonces esto califica para el bono.

AdmBorkBork
fuente
Tenía la esperanza sort c*)[0]podría acortarse, pero lo que ocurrió fue el mismo número de bytes, ? c* -eq 1).
raíz
se puede acortar eliminando las comillas dobles $args. También es más preciso hacerlo, ([char[]]$args|group|? c* -eq 1).Nameya que regresará con precisión nullcuando no haya caracteres extraños (en lugar de una nueva línea). Sin embargo, en términos de bytes, esto todavía no lo llevará por debajo de 37.
cogumel0
@ cogumel0 No se ejecuta sin comillas dobles.
raíz
@root tienes razón. Sin embargo, para pasar uno de los requisitos (Un carácter único que es la "extraña" en la matriz o None, nil, NUL, o la cadena "None", si no hay ningún carácter "extraño".) Todavía debe ser cambiado. Newline no es parte de las respuestas aceptables.
cogumel0
@ cogumel0 Ah, el desafío cambió desde que publiqué mi respuesta. El "Ninguno / nulo / lo que sea" solía ser solo un bono en lugar de obligatorio. Voy a mantener mi respuesta tal como está.
AdmBorkBork
0

Perl 6 ,  27  24-25% = 18 bytes

*.comb.Bag.min(*.value).key

Pruébalo

{%(.comb.Bag.invert){1}}

Pruébalo

Esto devolverá un valor indefinido cuando se le da una entrada que no tiene un carácter extraño.

Expandido:

{  # bare block lambda with implicit parameter 「$_」

  %(        # coerce into a Hash

    .comb   # split the input into graphemes (implicit method call on 「$_」)
    .Bag    # turn into a weighted Set
    .invert # invert that (swap keys for values) returns a sequence

  ){ 1 }    # get the character that only occurs once
}
Brad Gilbert b2gills
fuente
0

Brainfuck, 125 bytes

,[----------[>],]<[->+<]<<[[->->+<<]>[>[->-<<<+>>]>[,<<,>>]<<<[->+<]>[->+<]<]>[-<<+>>]>[-<+>]<<<<]>>>>[<]<++++++++++.

Pruébalo en línea

Imprime la letra de la matriz si no hay ninguna extraña

Jo King
fuente
0

Java 8, 85 bytes

Este es un lambda de Stringa String(por ejemplo Function<String, String>). Es esencialmente una copia de la solución de Luca , pero he reducido un poco la clasificación de cadenas.

s->new String(s.chars().sorted().toArray(),0,s.length()).replaceAll("(.)\\1+|\\n","")

Pruébalo en línea

Jakob
fuente