Простая Задача По Гольфу: Шаблоны Персонажей!

  • Автор темы Greldinard
  • Обновлено
  • 23, Oct 2024
  • #1

В этом задании вы получаете на вход строку, содержащую строку из X, Y и Z, например. «ХИЗЗ». X, Y и Z представляют конкретный символ. Затем этот шаблон сравнивается со вторым строковым входом. Если шаблон существует как подстрока во втором входе, верните

 
 False 
, otherwise, return True . Как только в слове найден шаблон, программа прекращает поиск и возвращает результат. bananas ---> True (pattern found: nanas) banana ---> False (pattern not found) .

Примеры

Узор: «XXYY»

succeed ---> True (pattern found: ccee) success ---> False (pattern not matched) balloon ---> True (pattern found: lloo)

Узор: «XYXYZ»

True
  • Примечание. Это не фактический ввод. Это пример того, как должна работать программа. Ваша программа должна вывести False or True или другие значения «Истина/Ложь».

Другая важная/полезная информация

  • Шаблон не обязательно должен содержать X, Y и Z, он может содержать X и Y или даже (хотя и несколько бессмысленно) только X.
  • Шаблон не может быть пустым, но он не будет использоваться в качестве тестового примера.
  • Строка поиска не будет пустой и будет записана строчными буквами.
  • Алфавитный порядок X, Y и Z в шаблоне не имеет значения.
  • X, Y и Z должен быть уникальными персонажами.
  • Вы можете использовать любую библиотеку по вашему желанию.
  • Оценка определяется размер кода, в байтах. Побеждает наименьший результат.

Удачи!

#код-гольф

Greldinard


Рег
04 Oct, 2011

Тем
67

Постов
188

Баллов
543
  • 26, Oct 2024
  • #2

Перл 5, 85 байт

Сэкономлено 40 байт благодаря предложению Питера Тейлора! (см. мою старую версию ниже, чтобы увидеть различия)

83 байта кода +

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 True 
flag.

StringContainsQ["bananas", x_ ~~ y_ ~~ x_ ~~ y_ ~~ z_]

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

XYXYZ трансформируется в True (yup, some of the tests can't be true, but it's shorter that way), and the second input is then checked against that regex. (see the explanations of my older version to get more intuition of how it works)


Моя старая версия:
Спасибо Арно за указание на ошибку, которую я допустил в своей первой версии.
113 байт кода + StringContainsQ["succeed", x_ ~~ x_ ~~ y_ ~~ y_] flags, and StringContainsQ[string,pattern] .

let f = p=>g=s=>s&&g(s.slice(1))|[...p].every((C,i,x)=>C==(x[c=s[i]]=x[c]||'XYZ'[c&&j++]),j=0) console.log(f("XXYY")("succeed")) // 1 console.log(f("XXYY")("success")) // 0 console.log(f("XXYY")("balloon")) // 1 console.log(f("XYXYZ")("bananas")) // 1 console.log(f("XYXYZ")("banana")) // 0

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

В примере XYXYZ: первое регулярное выражение преобразует шаблон в (.)(.)\1\2(.) и добавляет в конце тест, проверяющий, p => // main function: takes pattern p as input, returns g g = s => // g = recursive function: takes string s as input s && // if s is not empty: g(s.slice(1)) // do a recursive call, starting at the next character | // merge the result with this iteration [...p].every((C, i, x) => // for each character C at position i in p: C == // check whether C is matching the next expected ( // character, which is either: x[c = s[i]] = x[c] || // - a substitution character already associated to s[i] 'XYZ'[c && j++] // - the next substitution character ('X', 'Y' or 'Z') ), // - undefined if c = s[i] doesn't exist or j > 2 j = 0 // initialize j = pointer in 'XYZ' ) // , p=>g=s=>s&&g(s.slice(1))|[...p].every((C,i,x)=>C==(x[c=s[i]]=x[c]||'XYZ'[c&&j++]),j=0) и 1 are different: if so, 0 установлено на единицу. Затем второй вход — это тесты против этого регулярного выражения, и (p)(s) is implicitely printed at the end.
Регулярное выражение, созданное для XYXYZ: s .
(Я добавлю немного больше деталей к объяснениям, когда у меня будет минутка)

 

Dimon7079


Рег
06 Feb, 2011

Тем
57

Постов
190

Баллов
495
  • 26, Oct 2024
  • #3

Желе, 9 байт

p

Возвращает количество раз, когда шаблон был найден, причем ненулевое значение означает истинность, а ноль — ложность.

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

Как это работает

->a,b{a.chars.permutation.any?{|w|a.tr((w|[])*'','XYZW')[b]}} ||answer||

JavaScript (ES6), 94 байта

public static bool c(string p,string n) { for (int l = p.Length, i = 0, j; i < l; i++) for (j = i; j >= 0;) if (p[i]==p[j]==(n[i]!=n[j--])) return l != n.Length && c(p,n.Substring(1)); return 2>1; } bool c(string p,string n){for(int l=p.Length,i=0,j;i<l;i++)for(j=i;j>=0;)if(p[i]==p[j]==(n[i]!=n[j--]))return l!=n.Length&&c(p,n.Substring(1));return 2>1;}

Работает путем преобразования шаблона в регулярное выражение, например. для [,$a,$b]=$argv;foreach($s=str_split($a)as$v)$r[]=$k++>strpos($a,$v)?"\\".(1+array_search($v,array_keys(array_count_values($s)))):"(.)";echo preg_match(_.join($r)._,$b); it generates foreach(str_split($argv[1])as$v)$r.=$x[$v]?"\\$x[$v]":"(.)".!$x[$v]=++$y;echo preg_match("#$r#",$argv[2]); .

Я заметил интересное различие между PCRE и регулярным выражением JavaScript: в PCRE for(;$v=$argv[1][$i++];)$r.=$$v?"\\".$$v:"(.)".!$$v=++$j;echo preg_match("#$r#",$argv[2]); fails (and therefore true false true true false успешен) до того, как будет определена группа захвата, в то время как JavaScript успешно сопоставляет пустую строку (и, следовательно, class M{ static Object c(String p,String s){int i=p.length();if(s.length()<i)return 0>1;for(;i-->0;)if(p.indexOf(p.charAt(i))!=s.indexOf(s.charAt(i)))return c(p,s.substring(1));return 1>0;} public static void main(String[] a){ System.out.println(c("XXYY", "succeed")); System.out.println(c("XXYY", "success")); System.out.println(c("XXYY", "balloon")); System.out.println(c("XYXYZ", "bananas")); System.out.println(c("XYXYZ", "banana")); } } fails).

 

Женя1111


Рег
06 Dec, 2011

Тем
81

Постов
199

Баллов
614
  • 26, Oct 2024
  • #4

Питон 2, 70 байт

Object c(String p, String s){ // Method with two String parameters and Object return-type int i = p.length(); // Index that starts at the length of the pattern if(s.length() < i) // If the length of the input is smaller than the length of the pattern return 0>1;//false // Simply return false for(;i-->0;) // Loop from 0 to length_of_pattern if(p.indexOf(p.charAt(i)) != s.indexOf(s.charAt(i))) // If the index of the characters of the pattern and input aren't matching return c(p, s.substring(1)); // Return the recursive-call of pattern and input minus the first character // End of loop (implicit / single-line body) return 1>0;//true // If every index of the characters are matching: return true } // End of method

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

Проверяет, соответствует ли строка шаблону, используя метод этот ответ. Использует префикс строки поиска, длина которой равна шаблону. Отрезает первый символ строковой строки, пока не будет найдено совпадение, или Object c(String p,String s){int i=p.length();if(s.length()<i)return 0>1;for(;i-->0;)if(p.indexOf(p.charAt(i))!=s.indexOf(s.charAt(i)))return c(p,s.substring(1));return 1>0;} if it becomes empty


73 байта:

ÙœJv¹y…XYZ‡²å—

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

Проверяет, соответствует ли строка шаблону, используя метод этот ответ. Рекурсивно проверяет все подстроки, удаляя первый или последний символ, пока строка не станет пустой.

 

U7iioio


Рег
27 Nov, 2016

Тем
74

Постов
200

Баллов
590
  • 26, Oct 2024
  • #5

Питон 3, 100 байт

ÙœJ # Get powerset of all unique characters in string. v # Loop through each... ¹ # Push input word. y # Push current set of letters in powerset. …XYZ‡ # Replace each of the 3 letters in the original word with XYZ. ²å # Check if second input is in this string, push 1 if it is. i1q # If 1, push 1 and quit.

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

 

Влад Левченко


Рег
23 Oct, 2020

Тем
83

Постов
182

Баллов
597
  • 26, Oct 2024
  • #6

05AB1E, 19 16 байт

ÙœJv¹y…XYZ‡²åi1q

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


l=len f=lambda p,s:l(p)<=l(s)and(l({*zip(p,s)})==l({*p})==l({s for _,s in{*zip(p,s)}})or f(p,s[1:]))

Вернет 1, если истинно, и ноль, если неверно.


Это может быть 14 байт, если разрешен возврат возможных значений XYZ:

05AB1E, 14 байт

f=lambda p,s:s>''and(map(s.find,s)==map(p.find,p))|f(p,s[1:])|f(p,s[:-1])

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

 

Endaneubono41


Рег
22 Oct, 2020

Тем
90

Постов
199

Баллов
699
  • 26, Oct 2024
  • #7

Java 7, 177 176 173 байта

False

Объяснение:

f=lambda p,s:s>''and(map(s.find,s[:len(p)])==map(p.find,p))|f(p,s[1:])

Тестовый код:

Попробуйте здесь.

(?!\<n>)

Выход:

(?!\<n>) ||answer||

PHP, 89 байт

Подарок от @Кристоф и @Титус

\<n>

PHP, 105 байт

Подарок от @Christoph

/(.)(?!\1)(.)\1\2(?!\2)(?!\1)(.)/

PHP, 167 байт

XYXYZ ||answer||

С#, 184 165 155 байт

спасибо, aloisdg!

<div oninput=o.textContent=!!f(p.value,s.value)><input id=p placeholder=Pattern><input id=s placeholder=String><span id=o>

решение для возврата, в качестве бонуса оно работает с шаблоном с любыми символами!

f= (p,s)=>s.match(p.replace(/./g,c=>m[c]||(t=r,r=`(?!\\${++g})`+r,m[c]=`\\`+g,t),g=m=[],r=`(.)`)) ||answer||

Рубин, 63 61 байт

ẆÇ€ċÇ} Main link. Left argument: s (string). Right argument: p (pattern) Ẇ Window; generate all substrings of s. Ç€ Map the helper link over the substrings. Ç} Apply the helper link to p. ċ Count the number of times the right result appears in the left result. =þ Helper link. Argument: t (string) =þ Compare all characters of t for equality with all characters of t, yielding a square matrix of Booleans.

Вместо поиска шаблона регулярного выражения просто попробуйте заменить «X», «Y» и «Z» всеми возможными способами и найти буквальное совпадение.

(На самом деле та же концепция, что и в ответе carusocomputing 05AB1E)

 

Alexhobs


Рег
25 Feb, 2009

Тем
58

Постов
178

Баллов
478
  • 26, Oct 2024
  • #8

JavaScript (ES6), 92 89 87 86 байт

Принимает ввод =þ ẆÇ€ċÇ} (pattern) and (.)(.)\1\2(.)(?{++$c;$\=1if!grep{$v{$c}{${$_}}++}1..3})^ (строка) в синтаксисе каррирования $\ . Returns $\ / $3 .

$2

Отформатировано и прокомментировано

$1

Тестовые случаи

s/./$h{$&}?"\\$h{$&}":($h{$&}=++$i,"(.)")/ge;$_.='(?{++$c;$\=1if!grep$v{$c}{${$_}}++,1..'.(keys%h).'})^';<>=~$_}{ ||answer||

Mathematica 18 символов (не считая строки и шаблона)

-Mre=eval

Примеры:

-pl

((?!\1).)((?!\1)(?!\2).)\1\2((?!\1)(?!\2)(?!\3).)

s/./$h{$&}?"\\$h{$&}":($h{$&}=$.,join("",map"(?!\\$_)",1..$.++)."(.)")/ge;$_=<>=~$_

-pl

 

Woosyloalsift81


Рег
12 Aug, 2011

Тем
64

Постов
185

Баллов
535
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно