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


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.