Замена магнитов на холодильник


29

При написании сообщения с магнитами на холодильник вы часто будете заменять 1собой I. В этой задаче ваша цель - выяснить, можно ли написать сообщение, используя буквы другого сообщения. Разрешенные замены:

A = 4
B = 8
C = U
E = M = W = 3
G = 6 = 9
I = 1
L = 7
N = Z
O = 0
R = 2
S = 5

Например, сообщение CIRCA 333может быть преобразовано в заклинание ICE CREAM, где первые два 3s повернуты на 180 градусов, чтобы сделать два Es, а последние 3повернуты на 90 градусов против часовой стрелки, чтобы сделать M. Пробелы могут быть включены в сообщения, но они не должны учитываться в вашем решении, так как они сделаны путем размещения магнитов на холодильнике.

вход

Две строки (или символьные массивы). Все сообщения будут совпадать^[A-Z0-9 ]+$

Выход

Правда, если две входные строки являются допустимыми перестановками друг друга, иначе ложь.

Примеры

["CIRCA 333", "ICE CREAM"] => true
["DCLV 00133", "I LOVE CODE"] => true
["WE ARE EMISSARIES", "33   423    3315542135"] => true
["WE WANT ICE CREAM", "MET CIRCA 334 MEN"] => true
["I HAVE ICE CREAM", "HAVE 2 ICE CREAMS"] => false

Более правдивые примеры

Это все 15+ буквенных слов, которые соответствуют другому слову. Некоторые являются тривиальными заменами, но я включил все, что нашел.

["ANTHROPOMORPHISE","ANTHROPOMORPHISM"]
["ANTIPHILOSOPHIES","ANTIPHILOSOPHISM"]
["CIRCUMSTANTIALLY","ULTRAMASCULINITY"]
["DECENTRALIZATION","DENEUTRALIZATION"]
["DIMETHYLNITROSAMINE","THREEDIMENSIONALITY"]
["INSTITUTIONALISE","INSTITUTIONALISM"]
["INTERCRYSTALLINE","INTERCRYSTALLIZE"]
["INTERNATIONALISE","INTERNATIONALISM"]
["OVERCENTRALIZATION","OVERNEUTRALIZATION"]
["OVERCENTRALIZING","OVERNEUTRALIZING"]
["PREMILLENNIALISE","PREMILLENNIALISM"]
["TRANSCENDENTALIZE","TRANSCENDENTALIZM"]

Поскольку это сложная задача для игры в гольф, выигрывает самое короткое решение! Я приму самое короткое решение за 7 дней с момента публикации. Удачного игры в гольф!

Пример решения, не для игры в гольф

Связанный

РЕДАКТИРОВАТЬ : сделал ошибку в заменах, имел G = 6и 6 = 9как отдельные замены, объединил их в одну.


2
Я думаю, что 48 часов немного мало. А как насчет людей, которые играют в гольф только по выходным?
адам

Хороший вопрос, я дам это на неделю.
максимум

1
Другими заменами, которые вы могли бы рассмотреть, являются 7 для T, H для I (но не 1 для H) и 2 для N или Z
Джефф Цейтлин

1
@JeffZeitlin Мы обсуждали это в тестовой песочнице, и я решил исключить все замены, которые не являются обратимыми. Так как Tи Lне подлежат обмену, я не могу добавить T = 7. То же самое N = Z = 2, что подразумевает это N = Z = R = 2. Тем не менее, предлагаемые вами варианты заменят более сложную версию этой задачи, которую я мог бы опубликовать позже. Я просто хотел посмотреть, будут ли такие вызовы хорошо приняты в первую очередь.
максимум

1
@ 3D1T0R да, замена должна идти в обе стороны. Проверка состоит в том, что две строки являются допустимыми перестановками друг друга . Ваш пример вернется false.
максимум

Ответы:


4

Japt , 38 36 33 30 байт

Принимает ввод как массив из 2 строк.

®d`z³m`i`oiglbg`í)Ôu)ñ xÃr¶

Попробуйте или запустите все тесты

3 байта сохранены благодаря ETHProductions

®d`z...m`i`o...g`í)Ôu)ñ xÃr¶
                                 :Implicit input of array U
®                                :Map each Z
 d                               :  For each pair of characters in the following string,
                                 :  replace all occurrences of the 1st character in Z with the 2nd
  `z...m`                        :    The compressed string "znewem"
         i                       :    Prepend
          `o...g`                :      The compressed string "oireasglbg"
                 í               :      Interleave 0-based indices
                  )              :    End prepend
                   Ô             :    Reverse
                    u            :    Convert to uppercase
                     )           :  End replace
                      ñ          :  Sort
                        x        :  Trim
                         Ã       :End map
                          r      :Reduce
                           ¶     :  By testing equality

Здорово, сейчас бьешь желе! Я думаю, что вы можете сделать в конце, чтобы сохранить 3 байта.
ETHproductions

О да, я забыл это. Спасибо, @ETHproductions.
Лохматый


10

Рубин , 99 72 71 байт

->a{!!a.map{|x|x.tr("0-9UZMW","OIREASGLBGCNE").chars.sort-[" "]}.uniq!}

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

Принимает массив строк, предполагает ввод в верхнем регистре, как и во всех тестовых случаях.

-1 байт в гольфе от benj2240.



Да, это работает, спасибо.
Кирилл Л.

9

JavaScript (ES6), 102 100 байт

Принимает ввод в виде двух массивов символов в синтаксисе карри (a)(b). Возвращает логическое значение.

a=>b=>(g=s=>s.map(c=>'648UD3F6H1JK73Z0PQ25TUV3'[parseInt(c,36)-9]||c).sort().join``.trim())(a)==g(b)

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

Как?

Используя вспомогательную функцию g () , для каждого входа s :

  • Цифры от 0 до 8 и буквы X , Y и Z остаются без изменений. Все остальное явно переведено.

    0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
             ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    .........648UD3F6H1JK73Z0PQ25TUV3...
    

    Код:

    s.map(c => '648UD3F6H1JK73Z0PQ25TUV3'[parseInt(c, 36) - 9] || c)
  • Мы сортируем символы (которые приводят все пробелы в начале), соединяем их и удаляем все начальные пробелы.

    Код:

    .sort().join``.trim()

Наконец, мы сравниваем оба выхода.


6

Сетчатка 0.8.2 , 42 байта

T` dUZMW`_\OIR\EASG\LBGCN\E
%O`.
^(.*)¶\1$

Попробуйте онлайн! Принимает ввод в отдельных строках, но Link включает тестовые случаи и заголовок. Объяснение:

T` dUZMW`_\OIR\EASG\LBGCN\E

Сопоставьте все буквы с минимальным набором, удалив пробелы.

%O`.

Сортировка каждой строки в порядке.

^(.*)¶\1$

Сравните два значения.


5

APL (Dyalog Unicode) , 49 байтов SBCS

-1 благодаря нгн.

Функция анонимного молчаливого префикса.

(≡/(⍋⌷¨⊂)¨)(,¨⎕D,'UMWZ ')⎕R('OIREASGLBGCEEN',⊂⍬)

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

⎕R PCRE R eplace:
'UMWZ ' эти пять символов
⎕D,  с цифр по
 отдельности (каждый из них превращается в строку, а не в один символ)
 с:
⊂⍬ ничем не
'OIREASGLBGCEEN', предшествуют эти символы

() Примените к этому следующую молчаливую функцию:

( Применить следующую молчаливую функцию к каждому:

   приложить это (рассматривать это в целом)

  ⍋⌷¨ использовать каждый из индексов, которые будут сортировать его, чтобы индексировать всю строку (сортирует)

≡/ они идентичны? (Лит. сокращение матча)


''->
нгн

@ngn Не уверен, почему это работает, но все равно спасибо.
Адам

5

Python 2 , 108 байт

lambda a,b:g(a)==g(b)
g=lambda s:sorted('85930A4614012B3C4D5EF6378GH9AI2J3KL7'[int(c,36)]for c in s if'!'<c)

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

Существует 23 класса эквивалентности символов. Используя строку из 36 символов '85930A4614012B3C4D5EF6378GH9AI2J3KL7', мы сопоставляем каждый символ с его классом эквивалентности (игнорируя пробелы), а затем сортируем полученный массив. Две строки эквивалентны, если результирующие списки равны.


4

Java 10, 262 260 258 216 208 174 байта

a->b->n(a).equals(n(b));String n(String s){return s.chars().mapToObj(x->x<48?"":"OIREASGLBG.......ABCDEFGHIJKLENOPQRSTCVEXYN".split("")[x-48]).sorted().reduce("",(a,b)->a+b);}

-2 байта благодаря @Arnauld .
-76 байт благодаря @ OlivierGrégoire .

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

Объяснение:

a->b->                      // Method with two String parameters and boolean return-type
  n(a).equals(n(b))         //  Return if both Strings are equal in the end

String n(String s){         // Separated method with String as both parameter return-type
  return s.chars()          //  Loop over all characters as integers
          .mapToObj(x->x<48?//   If the current character is a space:
             ""             //    Replace it with an empty String to skip it
            :               //   Else:
             "OIREASGLBG.......ABCDEFGHIJKLENOPQRSTCVEXYN".split("")[x-48]
                            //    Convert multi-substitution characters to a single one
          .sorted()         //  Sort all of the converted characters
          .reduce("",(a,b)->a+b);}
                            //  And join all of them together as single String

2
"A4B8CUEMEWE3G6G9I1L7NZO0R2S5".split("(?<=\\G.{2})")кажется, работает ... хотя я даже не уверен, как именно. : p
Арнаулд

@Arnauld Спасибо, -2 байта, и {2}может быть .еще 2 байта. Я также не уверен на 100%, как это работает. Я знаю, (?<= ... )что используется для разделения, но сохраняю конечный разделитель для каждого элемента . Но я немного сбит с толку, почему (?=\\G..)(продолжайте приводить разделитель) не работает в этом отношении. И также на самом деле не знаю, как \\G..vs ..действует в расколе здесь. Посмотрим, смогу ли я где-нибудь это выяснить, потому что мне не любопытно. ; p В любом случае спасибо за сохраненные байты. Нужно помнить \\Gпри разделении на четные блоки. :)
Кевин Круйссен

1
@Arnauld Если вы хотите получить некоторую предысторию (?<=\\G..)внутри раскола, я задал вопрос StackoverFlow, который пролил некоторый свет. По сути, это неопределенное поведение, работающее по-разному почти на каждом языке. Хотя \Gэто нулевая длина, в Java с положительным вниманием к разделению, она как бы противоречит обоим правилам, вызывающим поведение, которое мы видим здесь. Лично для меня это все еще немного расплывчато, но в этом ответе, по крайней мере, сэкономлено 4 байта. ;)
Кевин Круйссен

1
217 байтов . Может сохранить больше байтов, хотя.
Оливье Грегуар,


3

R , 123 байта

function(x,y=chartr("48UMW36917Z025","ABCEEEGGILNORS",gsub(" ","",x)))all(g(y[1])==g(y[2]))
g=function(z)sort(utf8ToInt(z))

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

utf8ToInt преобразует строку в вектор кодовых точек Unicode.

!sd(a-b)на один байт короче,all(a==b) но это не помогает, потому что я имею дело с целыми числами, а не с логикой.


Очень хорошо! Я думаю, что вам нужно !anyвместо того, !sdчтобы элементы могли быть все равны, но 1. Попробуйте:f(list("BCDEF","ABCDE"))
JayCe

2

J , 56 байт

-:&(-.&' '/:~@rplc'0123456789UMWZ';"0'OIREASGLBGCEEN'"1)

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

Объяснение:

& для левого и правого аргумента

-.&' ' удаляет пробелы из ввода,

rplc Заменяет

'0123456789UMWZ';"0'OIREASGLBGCEEN'"1 символы на входе путем замены символов в левом столбце на символы в правом: (здесь транспонировано для экономии места)

      |:'0123456789UMWZ';"0'OIREASGLBGCEEN'
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│0│1│2│3│4│5│6│7│8│9│U│M│W│Z│
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│O│I│R│E│A│S│G│L│B│G│C│E│E│N│
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘

/:~@ и сортирует полученные строки

-: равны ли отсортированные строки?

Мое первоначальное решение:

J , 77 73 байта

-:&(1#.(' '-.~])e."1[:(,a.,.@-.,)'EMW3','G69',9 2$'A4B8CUI1L7NZO0R2S5'"1)

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

Объяснение:

(' '-.~]) удаляет пробелы из обоих аргументов и

e."1 проверяет каждый символ на принадлежность к следующей таблице:

[:(,a.,.@-.,)'EMW3','G69',9 2$'A4B8CUI1L7NZO0R2S5'"1 ссылка:

EMW3
G69 
A4  
B8  
CU  
I1  
L7  
NZ  
O0  
R2  
S5  
.
.
.  
All other symbols one in a row

1#. складывает таблицы сравнения для каждого аргумента

-:& они совпадают?






1

05AB1E , 38 33 байта

εðK.•2Θ`ĆĀÑεÉ•u6«•B/óÕ¦•…CN9«‡{}Ë

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

ε                   # Map each value in the (implicit) input-list by:
 ðK                 #  Remove all spaces
   .•2Θ`ĆĀÑεÉ•      #  Push compressed string "abemwgilorsuz"
              u     #  To uppercase: "ABEMWGILORSUZ"
               6«   #  Append a 6: "ABEMWGILORSUZ6"
   B/óÕ¦•          #  Push compressed integer 48333917025
          CN9«     #  Append "CN9": "48333917025CN9"
                   #  Transliterate; map all characters in "ABEMWGILORSUZ" in the
                    #  map-string to "48333917025CN9" at the same indices
    {               #  Then sort all characters
}                   # Close the map
 Ë                  # And check if both are equal (which is output implicitly)

См. Этот мой совет 05AB1E (разделы Как сжимать строки, не являющиеся частью словаря? И Как сжимать большие целые числа? ), Чтобы понять, почему .•2Θ`ĆĀÑεÉ•есть "abemwgilorsuz"и •B/óÕ¦•есть 48333917025.

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