Вписывается ли письмо в другой?

23

Вы помните мой коврик, правильно сгруппированный по цветам ?

Мой коврик правильно сгруппирован по цветам

Вчера я смотрел на это и понял, что некоторые буквы вписываются в другие. Пример: буква Pпомещается в том месте, куда Rидет буква . Итак, вот простая задача: с учетом двух букв вернуть истинное значение, если одна из букв вписывается в другую (прямо или повернуто, но не перевернуто), или ложное значение, если они этого не делают. То есть, если введено значение [P,R]или [R,P], вы должны вернуть truey, потому что в обоих случаях одна буква помещается внутри другой. Если вы получите, [L,U]вы должны вернуть фальси, так как ни один не помещается внутри другого.

правила

  • Ввод должен состоять из двух буквенно-цифровых символов в диапазоне [0-9A-Z], поскольку в мате также есть числа в любой нужной форме (два отдельных символа в качестве двух входных данных, список с двумя символами, строка с 2 символа, что угодно).
  • Вывод должен быть согласованным (значения truey и falsey должны быть всегда одинаковыми).
  • Ниже приведена таблица фитингов (обратите внимание, что буква всегда помещается на свое место, на случай, если вы получите что-то вроде [Y,Y]ввода):

    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
    

Я торжественно клянусь, что проверил каждую примерку на коврике моего ребенка. (Сушит пот со лба.)

Это , поэтому победит самый короткий код для каждого языка!

Некоторые тестовые случаи

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

Песочница пост . Пожалуйста, простите меня, если вы заметите больше деталей, которые я пропустил. Большое спасибо Οurous за помощь со списком деталей.

Чарли
источник
1
1не подходит F?
user202729
@ user202729 нет, потому что вам нужно перевернуть 1его, Fно это не разрешено в моем мате. :-)
Чарли
4
Иллюстрация ASCII-арт-графика (конечно, встраивание транзитивно)
user202729
1
@ Как ни странно, в этом другом вопросе уже было два ответа ... Кроме того, у задачи уже есть много случаев для тестирования, больше случаев ничего не добавят к этому (я думаю, что наиболее творческой частью является то, что два входа взаимозаменяемы, так как вы должны проверить обе фитинги).
Чарли

Ответы:

2

Чисто , 276 226 байт

Смутно в гольфе. Завтра отполирую.

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

Попробуйте онлайн!

Οurous
источник
2

Javascript 155 153 151 149 байт

Я думаю, что это работает во всех случаях, 1/0 для true / false.

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

Объяснение:

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

Changelog:

  • сэкономил 2 байта благодаря kamoroso94
  • сэкономил 2 байта благодаря Крису М
  • сэкономил 2 байта, изменив метод поиска на .some ()
Брайан Х.
источник
Это возвращает истину, если cподходит fили fподходит c? Кажется, вы проверяете только один случай.
Чарли
Код исправлен, чтобы возвращать true, если fподходитc
Брайан Х.
Я не слишком хорошо объясняю, если кто-то хочет прояснить
Брайан Х.
Вы можете использовать includes(f)вместо того, indexOf(f)>=0чтобы сохранить 2 байта.
kamoroso94
офигенно, даже не знал, что это была вещь: D
Брайан Х.
1

Юлия 0,6 , 139 байт

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

Попробуйте онлайн!

Сохранено несколько байтов путем группировки символов, которые вписываются в 'O'. Но тестирование обратного ввода использует слишком много кода ...

Объяснение:

  • zip(☐)застегивает соответствующие одиночные буквы из "OCFILMPV16"& строки совпадающих букв.
  • .in(☐) применяется поэлементно, например (in(a,'O'),in(b,"OCFILMPV16"))
  • all(.in(☐)) Оба должны быть найдены ...
  • |или a,bили b,a...
  • any(map(☐)) хотя бы для одного элемента из архива.
LUKEŠ
источник
1

Котлин , 147 139 байт

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

Попробуйте онлайн!

Пример Try It Online включает тестовые примеры для каждой положительной комбинации и несколько отрицательных.

Я не оптимизировал рег. слишком много, так что это может быть дольше, чем необходимо

РЕДАКТИРОВАТЬ: сохранил несколько байтов на reg.ex.

Дамиано
источник
1

C (gcc) , 211 байт

Первая попытка Очень просто.

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

Попробуйте онлайн!

gastropner
источник
0

PHP , 204 байта

-147 байт, потому что я вернулась, чтобы удалить 2 байта, только чтобы обнаружить, что в моем коде было несколько ошибок и неиспользуемых переменных! Мой код теперь намного короче.

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

Попробуйте онлайн!

NK1406
источник
0

Рубин, 140 байт

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

Почти так же, как и в ответе на python 3, но с другим исполнением.

Ховард Нигорд
источник