¿Una letra cabe dentro de la otra?


23

¿Recuerdas mi esterilla correctamente agrupada por colores ?

Mi esterilla correctamente agrupada por colores.

Ayer lo estaba mirando y me di cuenta de que algunas letras encajan dentro de otras. Ejemplo: una letra Pcabe en el lugar donde Rva la letra . Así que aquí hay un desafío simple: dadas dos letras, devuelve un valor verdadero si alguna de las letras encaja dentro de la otra (directamente o girado, pero no invertido), o un valor falsey si no lo hacen. Es decir, si la entrada es [P,R]o [R,P], debe devolver la verdad porque en ambos casos una letra cabe dentro de la otra. Si lo consigues [L,U]debes regresar falsey ya que ninguno cabe dentro del otro.

Reglas

  • La entrada debe tener dos caracteres alfanuméricos en el rango [0-9A-Z], ya que también hay números en el tapete, en cualquier forma que necesite (dos caracteres separados como dos entradas, una lista con dos caracteres, una cadena con el 2 caracteres, lo que sea).
  • La salida debe ser coherente (los valores de veracidad y falsey deben ser siempre los mismos).
  • La siguiente es la tabla de ajustes (tenga en cuenta que una letra siempre cabe en su lugar correcto, en caso de que obtenga algo [Y,Y]como entrada):

    char fits inside chars
    --------------------------------------------------------
       C             G,O
       F             B,E,P,R
       G             O
       I             0,1,7,B,D,E,F,H,K,L,M,N,O,P,R,T,V,W,X,Z
       L             E
       M             W
       P             R
       S             O
       V             A
       W             M
       0             O
       1             B,E,L
       3             O
       6             9,O
       8             O
       9             6,O
    

Juro solemnemente que he probado cada ajuste en la colchoneta de mi hijo. (Se seca el sudor de la frente).

Este es el , ¡así que puede ganar el código más corto para cada idioma!

Algunos casos de prueba

input  output
-------------
[C,G]  truthy (C fits inside G)
[G,C]  truthy (C fits inside G)
[F,R]  truthy (F fits inside R)
[M,W]  truthy (both fit inside the other)
[O,S]  truthy (S fits inside O)
[T,T]  truthy (T fits in its place)
[E,V]  falsey (no fit found)
[P,L]  falsey

Puesto de sandbox . Por favor, perdóname si ves más accesorios que me perdí. Muchas gracias a Οurous por ayudarme con la lista de accesorios.



1
1no encaja F?
user202729

@ user202729 no, porque debes voltearlo 1para que quepa en el, Fpero eso no está permitido en mi tapete. :-)
Charlie

44
Gráfico gráfico de arte ASCII (por supuesto, el ajuste es transitivo)
usuario202729

1
@ Οurousivo fue en esta otra pregunta cuando ya tenía dos respuestas ... Además, el desafío ya tiene muchos casos para probar, más casos no agregarán nada (creo que la parte más creativa es que las dos entradas son intercambiable ya que tiene que verificar ambos accesorios).
Charlie

Respuestas:


6

Python 2 , 135 130 129 bytes

-1 byte gracias a Lynn

lambda s:cmp(*s)%2*s[::cmp(*s)|1]in'OIH TIE XI7 RF O8 OGC LI0 O3 O96 VA O6 KI PI WI L1 WMI O0 RIB NI1 FE SOC VID ZIFB1 PF LE1 RP'

Pruébalo en línea!

Python 3 , 143 bytes

lambda*i:any({*i}&{a,c}=={*i}for a,b in zip('CFGILMPSVW013689','GO BEPR O 017BDEFHKLMNOPRTVWXZ E W R O A M O BEL O 9O O 6O'.split())for c in b)

Pruébalo en línea!



2

limpia , 276 226 bytes

Vagamente golfista. Puliré mañana.

import StdEnv
i a b=isMember b a
t=True
f'C'b=i['GO']b
f'F'b=i['BEPR']b
f'O'b=i['GS03689']b
f'I'b=i['017BDEFHKLMNOPRTVWXZ']b
f'L''E'=t
f'P''R'=t
f'V''A'=t
f'M''W'=t
f'1'b=i['BEL']b
f'6''9'=t
f _ _=False
?a b=a==b||f a b||f b a

Pruébalo en línea!



2

Javascript 155 153 151 149 bytes

Creo que esto funciona en todos los casos, 1/0 para verdadero / falso.

(c,f,q=1)=>"CGO,FBEPR,GO,I017BDEFHKLMNOPRTVWXZ,LE,MW,PR,SO,VA,WM,0O,1BEL,3O,69O,8O,96O".split`,`.some((v=>v[0]==c&v.includes(f)))|c==f|(q?F(f,c,0):0)

Explicación:

F=(
c, // input 1
f, // input 2
q=1 // variable used to execute F twice
)=>(
"CGO,FBEPR,GO,I017BDEFHKLMNOPRTVWXZ,LE,MW,PR,SO,VA,WM,0O,1BEL,3O,69O,8O,96O".split`,` 
                              // array of strings where [0] is input 1 and [>0] are the fittings
.some(                        // any element of the array meets:
(v=>v[0]==c&v.includes(f)))|  // input 1 equals [0] and input 2  exists in the lookup string OR
c==f|                         // input 1 equals input 2 OR
(q?F(f,c,0):0)                // input 2 fits inside input 1

let F=(c,f,q=1)=>"CGO,FBEPR,GO,I017BDEFHKLMNOPRTVWXZ,LE,MW,PR,SO,VA,WM,0O,1BEL,3O,69O,8O,96O".split`,`.some((v=>v[0]==c&v.includes(f)))|c==f|(q?F(f,c,0):0);
let tests = [
  ["C","G"],  //truthy (C fits inside G)
  ["G","C"],  //truthy (C fits inside G)
  ["F","R"],  //truthy (F fits inside R)
  ["M","W"],  //truthy (both fit inside the other)
  ["O","S"],  //truthy (S fits inside O)
  ["T","T"],  //truthy (T fits in its place)
  ["E","V"],  //falsey (no fit found)
  ["P","L"]   //falsey
];
tests.forEach((v)=>{console.log("F('"+v[0]+"','"+v[1]+"') = " + F(v[0],v[1]))});

Registro de cambios:

  • ahorró 2 bytes gracias a kamoroso94
  • ahorró 2 bytes gracias a Chris M
  • ahorró 2 bytes cambiando el método de búsqueda a .some ()

¿Esto devuelve cierto si cencaja fo fencaja c? Parece que solo marca un caso.
Charlie

Código corregido para devolver verdadero si fcabec
Brian H.

No soy muy bueno explicando, si alguien quiere aclararlo, siéntase libre de sugerir una edición
Brian H.

Puede usar en includes(f)lugar de indexOf(f)>=0guardar 2 bytes.
kamoroso94

increíble, ni siquiera sabía que era una cosa: D
Brian H.

1

Julia 0.6 , 139 bytes

(a,b)->(a==b)|any(map(x->all(in.((a,b),x))|all(in.((b,a),x)),zip("OCFILMPV16",split("CGS0368 G BEPR 017BDEFHKLMNOPRTVWXZ E W R A BEL 9"))))

Pruébalo en línea!

Guarda algunos bytes al agrupar los caracteres que se ajustan a 'O'. Pero probar la entrada invertida usa demasiado código ...

Explicación:

  • zip(☐) comprime las letras individuales correspondientes de "OCFILMPV16" & una cadena de letras coincidentes.
  • .in(☐) se aplica por elementos, p. ej. (in(a,'O'),in(b,"OCFILMPV16"))
  • all(.in(☐)) Ambos deben ser encontrados ...
  • |para cualquiera a,bo b,a...
  • any(map(☐)) para al menos un elemento de la lista comprimida.

1

Kotlin , 147 139 bytes

fun p(s:String)=setOf(s,s.reversed()).any{it.matches(Regex("(.)\\1|F[BEPR]|I[017BDEFHKLMNOPRTVWXZ]|1[BEL]|69|CG|LE|MW|PR|VA|O[CG69038S]"))}

Pruébalo en línea!

El ejemplo de Try It Online incluye casos de prueba para cada combinación positiva y algunas negativas.

No he optimizado el reg.ex. demasiado, por lo que podría ser más largo de lo necesario

EDITAR: guardado algunos bytes en reg.ex.


1

C (gcc) , 211 bytes

Un primer intento. Muy sencillo.

i;char*c="CFGILMPSVW013689",*x[]={"GO","BEPR","O","017BDEFHKLMNOPRTVWXZ","E","W","R","O","A","M","O","BEL","O","9O","O","6O"};h(a,b){return(i=strchr(c,a)-c)>=0&&strchr(x[i],b);}f(a,b){return a==b|h(a,b)|h(b,a);}

Pruébalo en línea!


0

PHP , 204 bytes

-147 bytes porque volví a la cámara para eliminar 2 bytes solo para descubrir que mi código tenía algunos errores y variables no utilizadas. Mi código ahora es mucho más corto.

<?php $a=fgets(STDIN);for($w=0;$w<2;$w++){if(strpos(explode(',','GO,BEPR,O,017BDEFHKLMNOPRTVWXZ,E,W,R,O,A,M,O,BEL,O,9O,O,6O')[strpos(CFGILMPSVW013689,$a[0])],$a[1])!==false){echo"t";break;}$a=strrev($a);}

Pruébalo en línea!


0

Rubí, 140 bytes

->c,t{x='CFGILMPSVW013689'.chars.zip('GO BEPR O 017BDEFHKLMNOPRTVWXZ E W R O A M O BEL O 9O O 6O'.split).to_h;p x.key?(c)&&x[c].include?(t)}

Más o menos lo mismo que la respuesta de Python 3, pero con una ejecución diferente.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.