Czy litera mieści się w drugiej?


23

Czy pamiętasz moją matę odpowiednio pogrupowaną według kolorów ?

Moja mata odpowiednio pogrupowana według kolorów

Wczoraj patrzyłem na to i zdałem sobie sprawę, że niektóre litery mieszczą się w innych. Przykład: litera Ppasuje do miejsca, w którym się Rznajduje. Oto proste wyzwanie: biorąc pod uwagę dwie litery, zwróć prawdziwą wartość, jeśli jedna z liter pasuje do drugiej (bezpośrednio lub obrócona, ale nie odwrócona), lub wartość falsey, jeśli nie. To znaczy, jeśli dane wejściowe to [P,R]lub [R,P], musisz zwrócić prawdę, ponieważ w obu przypadkach jedna litera mieści się w drugiej. Jeśli dostaniesz [L,U], musisz zwrócić falsey, ponieważ żaden nie mieści się w drugim.

Zasady

  • Dane wejściowe muszą składać się z dwóch znaków alfanumerycznych z zakresu [0-9A-Z], ponieważ w macie znajdują się również liczby, w dowolnej potrzebnej formie (dwa osobne znaki jako dwa dane wejściowe, lista z dwoma znakami, ciąg znaków z 2 znaki, cokolwiek).
  • Wynik musi być spójny (wartości true i falsey muszą być zawsze takie same).
  • Poniżej znajduje się tabela okuć (zwróć uwagę, że litera zawsze pasuje we właściwe miejsce, na wypadek gdybyś dostał coś takiego [Y,Y]jak dane wejściowe):

    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
    

Uroczyście przysięgam, że przetestowałem każdy element w macie mojego dziecka. (Wysusza pot z czoła.)

To jest , więc może wygrać najkrótszy kod dla każdego języka!

Niektóre przypadki testowe

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

Post w piaskownicy . Proszę wybacz mi, jeśli zauważysz więcej brakujących elementów. Ogromne podziękowania dla Οurous za pomoc w liście wyposażenia.



1
1nie pasuje F?
user202729,

@ user202729 nie, ponieważ musisz obrócić, 1aby zmieścić go w, Fale nie jest to dozwolone w mojej macie. :-)
Charlie,

4
Ilustracja ASCII-art wykres (oczywiście dopasowanie jest przechodnie)
user202729

1
@ Οurous, to było w tym drugim pytaniu, kiedy już miało dwie odpowiedzi ... Poza tym wyzwanie ma już wiele przypadków do przetestowania, więcej przypadków nic do niego nie doda (myślę, że najbardziej twórczą częścią jest to, że dwa dane wejściowe są wymienne, ponieważ musisz sprawdzić oba łączniki).
Charlie,

Odpowiedzi:


6

Python 2 , 135 130 129 bajtów

-1 bajt dzięki 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'

Wypróbuj online!

Python 3 , 143 bajty

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)

Wypróbuj online!



2

Czysty , 276 226 bajtów

Niejasno golfa. Poleruje jutro.

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

Wypróbuj online!



2

JavaScript 155 153 151 149 bajtów

Myślę, że działa to we wszystkich przypadkach, 1/0 dla wartości prawda / fałsz.

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

Wyjaśnienie:

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

Dziennik zmian:

  • zapisane 2 bajty dzięki kamoroso94
  • zaoszczędził 2 bajty dzięki Chrisowi M.
  • zapisano 2 bajty, zmieniając metodę wyszukiwania na .some ()

Czy to zwraca prawdę, jeśli cpasuje flub fpasuje c? Wygląda na to, że sprawdzasz tylko jeden przypadek.
Charlie,

Naprawiono kod zwracający wartość true, jeśli fpasujec
Brian H.

Nie jestem zbyt dobry w wyjaśnianiu, jeśli ktoś chce to wyjaśnić, możesz zaproponować edycję
Brian H.,

Możesz użyć includes(f)zamiast indexOf(f)>=0zapisać 2 bajty.
kamoroso94,

niesamowite, nawet nie wiedziałem, że to była rzecz: D
Brian H.

1

Julia 0.6 , 139 bajtów

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

Wypróbuj online!

Zaoszczędzono kilka bajtów, grupując znaki, które pasują do „O”. Ale testowanie odwróconego wejścia zużywa zbyt dużo kodu ...

Wyjaśnienie:

  • zip(☐)zamki błyskawiczne odpowiadające pojedynczym literom "OCFILMPV16"i ciąg pasujących liter.
  • .in(☐) jest stosowany elementarnie, np (in(a,'O'),in(b,"OCFILMPV16"))
  • all(.in(☐)) Oba muszą zostać znalezione ...
  • |dla jednego a,blub b,a...
  • any(map(☐)) dla co najmniej jednego elementu listy spakowanej.

1

Kotlin , 147 139 bajtów

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

Wypróbuj online!

Przykład w Try It Online obejmuje przypadki testowe dla każdej pozytywnej kombinacji i kilka negatywnych.

Nie zoptymalizowałem pliku reg.ex. za dużo, więc może być dłuższy niż to konieczne

EDYCJA: zapisano kilka bajtów na reg.ex.


1

C (gcc) , 211 bajtów

Pierwsza próba. Bardzo prosto.

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

Wypróbuj online!


0

PHP , 204 bajty

-147 bajtów, ponieważ cofam się, aby usunąć 2 bajty, aby stwierdzić, że mój kod zawiera kilka błędów i nieużywanych zmiennych! Mój kod jest teraz znacznie krótszy.

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

Wypróbuj online!


0

Rubinowy, 140 bajtów

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

Prawie to samo co odpowiedź na python 3, ale z innym wykonaniem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.