Простий код завдання для гольфу: Шаблони персонажів!


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
Matthew Roh

@Arnauld Дійсно, дякую. (Мабуть, я прочитав виклик занадто швидко, моя погана). Довелося подвоїти рахунок, щоб виправити це, але це працює зараз!
Дада

Чи не було б гравцем генерувати такий регулярний вираз (.)((?!\1).)\1\2((?!\1)(?!\2).)?
Пітер Тейлор

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

@ Петер Тейлор ніколи не має значення, це буде на 30 байт коротше; Я трохи
Дада,

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 regexp: у 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 О, я про це не знав.
Денніс

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), хоча я ще не перевірив його.
користувач59178

1
Не працює для мене: пісочниця . У всякому разі golfed версії коду: [,$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 Подарунок був навчальним зусиллям з !. Більше варто, ніж бали, які я міг би досягти за вашого приємного рішення.
Йорг Гюльсерманн

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

C #, 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
Кевін Круїссен

Подвійна перевірка фактично залишилася від більшої, якщо система, яка зникла в гольфі, тому s використовувалася багато, я буду її вдосконалювати далі. Спасибі!
downrep_nation

Ви можете декларувати всю свою змінну в один рядокint l = p.Length,i = 0, j;
aloisdg повідомляє Відновити Моніку

Можна перемістити ваш i++і ваш j--внутрішній цикл for. наприклад:for(j=i;j>=0;)if(p[i]==p[j]==(n[i]!=n[j--]))
aloisdg каже

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

Математика 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.