Простой код для игры в гольф: модели персонажей!


22

В этом задании вы получите строку ввода, содержащую строку из X, Y и Z, например. "XYZZ". X, Y и Z представляют определенный символ. Этот шаблон затем сравнивается со вторым вводом строки. Если шаблон существует как подстрока во втором входе, верните True, в противном случае верните False. Как только в слове найден шаблон, программа прекращает поиск и возвращается True.

Примеры

Выкройка: "XXYY"

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

Выкройка: "XYXYZ"

bananas ---> True (pattern found: nanas)
banana  ---> False (pattern not found)
  • Примечание: это не фактический ввод. Это пример того, как программа должна работать. Ваша программа должна вывести Trueили False, или другие значения Truthy / Falsy.

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

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

Удачи!


Шаблон может быть чем угодно. Я, наверное, должен был упомянуть, что шаблон не должен иметь X, Y и Z, он может иметь только X и Y. Однако эти шаблоны являются просто примерами, так что не стесняйтесь придумывать свои собственные примеры с этими шаблонами.
notHalfBad

Что вы имеете в виду "шаблон существует"? Как смежный кусок? Как подстрока? Могут ли, скажем, X и Y обозначать одно и то же?
xnor

@xnor X и Y должны быть независимы друг от друга, и я имею в виду под существующим шаблоном то, что где-нибудь в строке есть подстрока, которая соответствует шаблону. Я добавлю их в свое описание задачи, чтобы уточнить.
notHalfBad

3
Связанный. (То же самое, но запрашивает точное совпадение шаблона, а не подстрок.)
Мартин Эндер

4
Более подробная информация: шаблон может быть пустым? Строка поиска? Будет ли строка поиска использовать только строчные буквы? Будет ли шаблон в алфавитном порядке первым среди эквивалентных шаблонов, то есть сначала использовать X, затем Y, а затем Z?
xnor

Ответы:


12

Perl 5 , 85 байт

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

83 байта кода + -plфлаг.

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

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

XYXYZ преобразуется в ((?!\1).)((?!\1)(?!\2).)\1\2((?!\1)(?!\2)(?!\3).)(да, некоторые тесты не могут быть истинными, но в этом случае они короче), и второй вход затем проверяется на соответствие этому регулярному выражению. (см. объяснения моей старой версии, чтобы понять, как это работает)


Моя старая версия:
Спасибо Арно, который указал на ошибку, которую я сделал в моей первой версии.
113 байт кода +-pl флаги и -Mre=eval.

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

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

На примере XYXYZ: (.) (.) (.) Первое регулярное выражение будет преобразовывать шаблон к \ 1 \ 2, и добавить в конце тест , чтобы проверить , если $1, $2и $3различны: если да, то $\будет установлен в единицу. Затем вторым вводом являются тесты против этого регулярного выражения, и $\он имплицитно печатается в конце.
Регулярное выражение генерируется для XYXYZ это (.)(.)\1\2(.)(?{++$c;$\=1if!grep{$v{$c}{${$_}}++}1..3})^.
(Я добавлю немного больше деталей к объяснениям, когда у меня будет время)


Итак, используя регулярное выражение, чтобы превратить не регулярное выражение в регулярное выражение? coolio
Мэтью Ро,

@ Arnauld Действительно, спасибо. (Должно быть, я прочитал вызов слишком быстро, мой плохой). Пришлось удвоить число пользователей, чтобы исправить это, но теперь это работает!
Дада

Разве не было бы лучше создать такое регулярное выражение (.)((?!\1).)\1\2((?!\1)(?!\2).)?
Питер Тейлор,

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

@ Питер Тейлор не имеет значения, он будет на 30 байт короче; Я
Dada

10

Желе , 9 байт

=þ
ẆÇ€ċÇ}

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

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

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

ẆÇ€ċÇ}  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.

8

JavaScript (ES6), 94 байта

f=
(p,s)=>s.match(p.replace(/./g,c=>m[c]||(t=r,r=`(?!\\${++g})`+r,m[c]=`\\`+g,t),g=m=[],r=`(.)`))
<div oninput=o.textContent=!!f(p.value,s.value)><input id=p placeholder=Pattern><input id=s placeholder=String><span id=o>

Работает путем преобразования шаблона в регулярное выражение, например, для XYXYZнего генерирует/(.)(?!\1)(.)\1\2(?!\2)(?!\1)(.)/ .

Я заметил интересное различие между PCRE и регулярным выражением JavaScript: в PCRE происходит \<n>сбой (и, следовательно, (?!\<n>)успех) до определения группы захвата, в то время как в JavaScript он успешно соответствует пустой строке (и, следовательно, происходит (?!\<n>)сбой).


7

Python 2 , 70 байт

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

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

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


73 байта:

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

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

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



4

05AB1E , 19 16 байт

ÙœJv¹y…XYZ‡²åi1q

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


Ùœ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.

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


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

05AB1E , 14 байтов

ÙœJv¹y…XYZ‡²å—

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


Предполагая, что непустая строка является достоверной в 05AB1E, а пустая - ложной, ваша вторая версия должна соответствовать спецификации.
Деннис

1
Неправильный результат на входе «abcd» и «XYZZ». Вам нужно добавить четвертую букву в качестве замены по умолчанию.
GB

@Dennis: Если мы пойдем по мета-посту, единственные истинные значения в 05AB1E - это 1и True(что обычно является недостатком для такого рода вызовов), но если спецификацию задачи можно интерпретировать как позволяющую нам определить истинность / ложь для задачи вторая версия работает как вы говорите.
Emigna

@ Emigna О, я не знал об этом.
Денис

4

Java 7, 177 176 173 байта

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

Объяснение:

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

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

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

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

Выход:

true
false
true
true
false

4

PHP, 89 байт

Подарок от @Christoph и @Titus

for(;$v=$argv[1][$i++];)$r.=$$v?"\\".$$v:"(.)".!$$v=++$j;echo preg_match("#$r#",$argv[2]);

PHP, 105 байт

Подарок от @Christoph

foreach(str_split($argv[1])as$v)$r.=$x[$v]?"\\$x[$v]":"(.)".!$x[$v]=++$y;echo preg_match("#$r#",$argv[2]);

PHP, 167 байт

[,$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);

1
Вы должны быть в состоянии сохранить 2 байта, используя ++$pвместо ($p+1), хотя я на самом деле не проверял это.
user59178

1
Не работает для меня: Песочница . Во всяком случае, гольф-версия кода [,$a,$b]=$argv;foreach(str_split($a)as$k=>$v)$r.=$k==($p=strpos($a,$v))?"(.)":"\\".++$p;echo preg_match("#$r#",$b);.
Кристоф

1
Примите это в качестве подарка: [,$a,$b]=$argv;foreach(str_split($a)as$v)$r.=$x[$v]?"\\$x[$v]":'(.)'.!$x[$v]=++$y;echo preg_match("#$r#",$b);(Обратите внимание, что вы должны сохранить свои старые результаты, используя <strike>)
Кристоф

1
@Christoph A Gift был учебным усилием с !. Это более ценно, чем те моменты, которых я мог бы достичь с вашим хорошим решением.
Йорг Хюльсерманн

1
Я считаю 109, а не 108. -3 байта, если вы не копируете $argvв $aи $b; -6 байт с for(;a&$v=$argv[1][$i++];); -1 байт с более длинными именами переменных ( действительно!: Используйте $vvвместо $v, $iiвместо $i, $rrвместо $r, $yyвместо, $yи вы можете использовать $$vvвместо $x[$v])
Титус

4

С # 184 165 155 байтов

спасибо aloisdg!

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

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

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

я только заметил, что игра в гольф разоблачена логикой, которую я не использовал, скоро
обновлю

2
Прежде всего, почему var s=l==n.Length;? Вы используете его только в return s?!s:(где !sвсегда false), поэтому его можно изменить на return l==n.Length?0>1:. Кроме того , что это: (n[i]!=n[j]||n[i]!=n[j]). Вы проверяете n[i]!=n[j]дважды .. Это всегда будет true or true/ false or false..: S
Кевин Круйссен

Двойная проверка фактически осталась от более крупной системы, которая исчезла в гольфе, поэтому она использовалась много раз, и я буду ее улучшать. Благодарность!
downrep_nation

Вы можете удалить все переменные из одной строкиint l = p.Length,i = 0, j;
aloisdg говорит Reinstate Monica

Можете двигать i++и j--внутри и за петлю. например:for(j=i;j>=0;)if(p[i]==p[j]==(n[i]!=n[j--]))
aloisdg говорит восстановить Monica

3

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

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

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

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


2

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

Принимает вход p (шаблон) иs (строка) в синтаксисе карри (p)(s). Возвращает 0/ 1.

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)

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

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'
    )                            //

Контрольные примеры

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


0

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

StringContainsQ[string,pattern]

Примеры:

StringContainsQ["succeed", x_ ~~ x_ ~~ y_ ~~ y_]

True

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

True


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