Чи вписується лист всередину іншого?


23

Ви пам'ятаєте мій килимок, правильно згрупований за кольорами ?

Мій килимок правильно згрупований за кольорами

Вчора я дивився на це і зрозумів, що одні листи вписуються всередину інших. Приклад: лист Pпоміщається в тому місці, куди Rйде лист . Тож ось простий виклик: задавши дві літери, поверніть триєдине значення, якщо будь-яка з букв поміщається всередину іншої (безпосередньо або повертається, але не перевертається), або значення фальси, якщо вони не відповідають цьому. Тобто, якщо вхід є [P,R]або [R,P], ви повинні повернути truthy, оскільки в обох випадках одна літера поміщається всередині іншої. Якщо ви отримаєте, [L,U]ви повинні повернути фальси, як ні один з інших.

Правила

  • Вхід повинен бути двома буквено-цифровими символами в діапазоні [0-9A-Z], оскільки в маті також є цифри в будь-якій потрібній вам формі (два окремі символи як два входи, список з двома символами, рядок з 2 символи, що завгодно).
  • Вихід повинен бути узгодженим (значення truthy та 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

Пісочний пост . Вибачте, будь ласка, якщо ви помітили більше фурнітури, яку я пропустив. Величезне спасибі forurous за те, що він допомагав мені зі списком фітингів.



1
1не вписується F?
користувач202729

@ user202729 ні, тому що вам потрібно перевернути його, 1щоб помістити його, Fале це не дозволено в моєму килимку. :-)
Чарлі

4
Ілюстрація графіку ASCII art (звичайно, пристрій є транзитивним)
user202729

1
@ Οurous це було в цьому іншому запитанні, коли на нього вже було дві відповіді ... Крім того, у виклику вже є багато випадків для перевірки, більше випадків до нього нічого не додасть (я думаю, що найкреативніша частина полягає в тому, що два входи є взаємозамінні, оскільки ви повинні перевірити обидві арматури).
Чарлі

Відповіді:




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 для істинного / хибного.

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

Журнал змін:

  • збережено 2 байти завдяки kamoroso94
  • врятував 2 байти завдяки Крісу М
  • збережено 2 байти, змінивши метод пошуку на .some ()

Чи справді це повернення, якщо cпідходить fчи fпідходить c? Здається, ви перевіряєте лише один випадок.
Чарлі

Код зафіксовано, щоб повернути істину, якщо 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. занадто багато, тому це може бути довше, ніж потрібно

EDIT: збережено кілька байтів на reg.ex.



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.