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


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

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



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(☐)) хотя бы для одного элемента из архива.

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

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


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

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


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, но с другим исполнением.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.