Une lettre rentre-t-elle dans l'autre?

23

Vous souvenez-vous de mon tapis correctement groupé par couleurs ?

Mon tapis correctement groupé par couleurs

Hier, je l'ai regardé et j'ai réalisé que certaines lettres se glissaient à l'intérieur des autres. Exemple: une lettre Ptient à l'endroit où elle Rva. Voici donc un défi simple: étant donné deux lettres, renvoyez une valeur vraie si l'une des lettres s'inscrit dans l'autre (directement ou pivotée, mais pas retournée), ou une valeur de falsey si elles ne le font pas. Autrement dit, si l'entrée est [P,R]ou [R,P], vous devez retourner véridique car dans les deux cas, une lettre s'inscrit dans l'autre. Si vous obtenez, [L,U]vous devez retourner falsey car aucun ne rentre dans l'autre.

Règles

  • L'entrée doit être composée de deux caractères alphanumériques dans la plage [0-9A-Z], car il y a également des nombres dans le mat, sous toutes les formes dont vous avez besoin (deux caractères séparés comme deux entrées, une liste avec deux caractères, une chaîne avec le 2 caractères, peu importe).
  • La sortie doit être cohérente (les valeurs de vérité et de falsey doivent toujours être les mêmes).
  • Voici le tableau des raccords (notez qu'une lettre tient toujours à sa place, juste au cas où vous obtiendrez quelque chose comme [Y,Y]en entrée):

    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
    

Je jure solennellement d'avoir testé chaque essayage du tapis de mon enfant. (Sèche sa sueur de son front.)

C'est du , alors le code le plus court pour chaque langue peut gagner!

Quelques cas de test

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

Poteau de bac à sable . S'il vous plaît, pardonnez-moi si vous repérez plus d'accessoires que j'ai ratés. Un grand merci à Οurous pour m'avoir aidé avec la liste des raccords.

Charlie
la source
1
kolmogorov-complexité .
user202729
1
1ne rentre pas F?
user202729
@ user202729 non, car vous devez retourner le 1pour l'adapter au Fmais ce n'est pas autorisé dans mon tapis. :-)
Charlie
4
Illustration Graphique ASCII (bien sûr, l'adaptation est transitive)
user202729
1
@ Οurous c'était dans cette autre question quand il y avait déjà deux réponses ... D'ailleurs, le défi a déjà beaucoup de cas à tester, plus de cas n'y ajouteront rien (je pense que la partie la plus créative est que les deux entrées sont interchangeables car vous devez vérifier les deux raccords).
Charlie

Réponses:

6

Python 2 , 135 130 129 octets

-1 octet grâce à 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'

Essayez-le en ligne!

Python 3 , 143 octets

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)

Essayez-le en ligne!

ovs
la source
5

Rétine , 93 92 octets

O`.
(.)\1|1[BEL]|69|AV|CG|BF|EF|EL|FP|FR|[017BDEFH]I|I[KLMNOPRTVWXZ]|MW|PR|OS|[03689CG]O

^$

Essayez-le en ligne! Edit: 1 octet enregistré grâce à @ovs.

Neil
la source
Est- ce que cela fonctionne pour 92 octets?
ovs
2

Nettoyer , 276 226 octets

Vaguement golf-ish. Polira demain.

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

Essayez-le en ligne!

Οurous
la source
2

Haskell , 149 145 octets

[]!_=0>1
(a:b:c)!t=(a,b)==t||(b,a)==t||c!t
f x y=x==y||"0I0O1B1E1I1L3O696O7I8O9OAVBFBICGCODIEFEIELFIFPFRGOHIIKILIMINIOIPIRITIVIWIXIZMWOSPR"!(x,y)

Essayez-le en ligne!

user28667
la source
2

Javascript 155 153 151 149 octets

Je pense que cela fonctionne sur tous les cas, 1/0 pour vrai / faux.

(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)

Explication:

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]))});

Journal des modifications:

  • enregistré 2 octets grâce à kamoroso94
  • enregistré 2 octets grâce à Chris M
  • enregistré 2 octets en changeant la méthode de recherche en .some ()
Brian H.
la source
Est -ce que ce retour vrai si des ccrises fou des fcrises c? Il semble que vous ne cochez qu'un seul cas.
Charlie
Code corrigé pour retourner vrai si fajustéc
Brian H.
Je ne suis pas trop bien expliqué, si quelqu'un veut que ce soit plus clair, n'hésitez pas à suggérer une modification
Brian H.
Vous pouvez utiliser includes(f)au lieu de indexOf(f)>=0pour enregistrer 2 octets.
kamoroso94
génial, je ne savais même pas que c'était une chose: D
Brian H.
1

Julia 0,6 , 139 octets

(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"))))

Essayez-le en ligne!

Enregistré quelques octets en regroupant les caractères qui correspondent à «O». Mais tester l'entrée inversée utilise trop de code ...

Explication:

  • zip(☐)zippe les lettres simples correspondantes de "OCFILMPV16"& une chaîne de lettres correspondantes.
  • .in(☐) est appliqué par élément, par exemple (in(a,'O'),in(b,"OCFILMPV16"))
  • all(.in(☐)) Les deux doivent être trouvés ...
  • |pour ou a,bou b,a...
  • any(map(☐)) pour au moins un élément de la liste zippée.
LukeS
la source
1

Kotlin , 147 139 octets

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]"))}

Essayez-le en ligne!

L'exemple sur Try It Online comprend des cas de test pour chaque combinaison positive et quelques négatifs.

Je n'ai pas optimisé le reg.ex. trop, donc cela pourrait être plus long que nécessaire

EDIT: enregistré quelques octets sur reg.ex.

Damiano
la source
1

C (gcc) , 211 octets

Une première tentative. Très simple.

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);}

Essayez-le en ligne!

gastropner
la source
0

PHP , 204 octets

-147 octets car je reviens en arrière pour supprimer 2 octets seulement pour constater que mon code avait quelques bugs et des variables inutilisées! Mon code est maintenant beaucoup plus court.

<?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);}

Essayez-le en ligne!

NK1406
la source
0

Rubis, 140 octets

->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)}

À peu près la même que la réponse python 3, mais avec une exécution différente.

Håvard Nygård
la source