Соответствует ли это шаблону цифр?


23

Недавно я прошел тест по математике и заметил, что определенное число в тесте соответствует интересной схеме. Число ( 28384) соответствует общей последовательности цифр, которая выглядит следующим образом

(n)(x)(n+1)(x)(n+2)(x)(n+3) etc...

где nи xоднозначные целые числа. Последовательность может начинаться либо xили nи заканчиваются либо xили n+y.

Ваша задача, учитывая многозначное положительное целое, вывести истинное или ложное значение, в зависимости от того, соответствует ли входное значение шаблону. Длина ввода будет от 4 до 18 цифр. Вы можете принять ввод как строковое представление целого числа. Ввод не будет начинаться с 0, но может содержать или заканчиваться 0.

n+y всегда будет однозначным числом (отсюда и ограничение длины 18).

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

Это должно вывести истинное значение

182838485868788898
4344
85868
12223242526

И это должно быть фальсией

12345
6724013635
36842478324836
1222232425
5859510511

Как и во всех гольф-кодах, выигрывает самый короткий код! Удачи и пусть шансы, будь всегда в твою пользу!


Можем ли мы принять ввод как строку?
Kritixi Lithos

@KritixiLithos "Вы можете принять ввод как строковое представление целого числа."
г-н Xcoder

Являются ли оба xи nненулевыми для чисел, которые соответствуют правилу?
г-н Xcoder

@ Mr.Xcoder число не может начинаться с 0, но может содержать или заканчиваться на 0 с
caird coinheringaahing

Ответы:


8

Python 2 , 84 81 80 79 байтов

-1 байт благодаря овсу

lambda x:g(x,1)|g(x,0)
g=lambda x,a:len(set(x[a::2]))==(x[a<1::2]in"123456789")

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


Python 3 , 82 79 78 77 байт

lambda x:g(x,1)|g(x,0)
g=lambda x,a:len({*x[a::2]})==(x[a<1::2]in"123456789")

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

Немного короче в Python 3, но я не думаю, что он заслуживает своего собственного ответа.


объяснение

Мы создали функцию, gкоторая принимает строку и индекс (либо 1, либо 0). gзатем возвращает значение len(set(x[a::2])), равное или нет , то есть число уникальных цифр в любой другой позиции, равно (x[a==0::2]in"123456789")или нет, находятся ли другие цифры в порядке возрастания. Если цифры расположены в порядке возрастания, возвращается тот факт, являются ли они одинаковыми или нет, если нет, то будет задан вопрос, является ли набор пустым, чего не может быть, поэтому всегда возвращается значение false.


Как обычно, я переиграл>. <
Mr. Xcoder

x[a<1::2]in"123456789"может быть "0"<x[a<1::2]<":"(сравнение символов сравнивает коды)
CalculatorFeline

@CalculatorFeline Я не думаю, что это правда. Это просто проверяет, что строка начинается с числа.
Пшеничный волшебник

Ах да, но это работает для отдельных персонажей.
CalculatorFeline

Но вам на самом деле нужно a<1? Похоже, что это может быть просто a.
CalculatorFeline

4

Желе , 13 11 байт

Ds2ZI’M¦Ẏ¬Ạ

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

Объяснение:

Ds2ZI’M¦Ẏ¬Ạ Accepts an integer
D           Get individual digits
  2         2
 s          Split into chunks of specific length
   Z        Zip
    I       Take deltas
     ’      Decrement
      M     Take maximal indices
       ¦    Apply at specific indices
        Ẏ   Reduce dimensionality
         ¬  Vectorized NOT
          Ạ Check if all are truthy

2

05AB1E , 15 байтов

TG9LNýN.øŒ})˜Iå

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

объяснение

TG9LNýN.øŒ})˜Iå
TG        }     # For 1 to 9...
  9L             # Push [1 .. 9]
    Ný           # Join with current value 
      N.ø        # surround with current value
         Π      # Push substrings
           )    # Wrap stack to array
            ˜   # Deep flatten the array
             I  # Push input
              å # Is the input in the array?
                # Implicit print

Это должно работать (тестовые случаи сделали), но если вы обнаружите какие-либо недостатки, пожалуйста, дайте мне знать.

14 байт, если нет выходных данных, считается ложным:

TG9LNýN.øŒIåi1


2

Haskell, 108 113 97 95 байт

d(x:_:r)=x:d r
d r=r
c(x:n:r)=and$all(==x)(d r):zipWith(==)(d$n:r)[n..]
f s@(_:n:_)=c s||c(n:s)

Пример вызова: f "182838485868788898"доходностьTrue

Безголовая версия с объяснениями:

-- Take every other element from the string, starting with the first
d (x:_:r) = x : d r
d r       = r
c (x:n:r) = and $ all (== x) (d r)              -- Every other char is equal to the first
                : zipWith (==) (d $ n:r) [n..]  -- The remaining chars are a prefix of n(n+1)(n+2)...
f s@(_:n:_) = c s      -- The case where s already starts with x
           || c (n:s)  -- If not, prepend a dummy x and try again

2
Добро пожаловать в PPCG и Haskell в гольф в частности! isPrefixOfне в Prelude, поэтому вы должны включить import Data.Listв свой код или использовать альтернативу, например and(zipWith(==)(n:r)[n..]).
Лайкони

@Laikoni: Спасибо за подсказку! Я заменил функцию соответственно.
Сиракуза

1
Я думаю, x/=yможет быть просто 1>0потому, что если нет, x/=yто x==yи первый случай это ловит.
CalculatorFeline

Вы также не нуждаетесь в whereопределении, cи dкак вспомогательные функции за пределами fхорошо. fможет быть сокращено до f s@(_:n:_)=c s||c(n:s).
Лайкони

1
Тогда вас может заинтересовать руководство по правилам игры в гольф на Хаскеле . Даже если это не правило, вы можете использовать вместо новой строки ;. Это тот же счетчик байтов, но улучшает читаемость кода.
Лайкони

1

JavaScript (ES6), 66 63 60 байт

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

s=>[...s].every((d,i)=>d-s[j^(k=i+j&1)]==k*i>>1,j=s[2]-s[0])

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



1

Python 3 , 99 96 89 байт

  • Сохранено 3 байта: использование all()функции
  • @WheatWizard сэкономил 7 байт: сокращение & |и замена дополнительной переменной наk<1
lambda x,g=lambda x,k:(x[k<1::2]in'123456789')&all(j==x[k]for j in x[k::2]):g(x,0)|g(x,1)

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

Объяснение:

Сначала разбейте строку на два списка: один с нечетным индексом, а другой с четным элементом. Предполагается, что два списка A и B таковы:

  1. A содержит одно и то же число, а B содержит последовательные числа в порядке возрастания.

ИЛИ как раз наоборот

  1. B содержит одно и то же число, а A содержит последовательные числа в порядке возрастания.

Последовательное условие проверяется: a in '123456789'

Условие того же номера проверяется: all(i=a[x] for i in a)


1
Вы можете заменить экземпляры на iwith k<1и отбросить iаргумент все вместе.
Пшеничный волшебник

1
Вы также можете заключить первый предикат в скобки и использовать &вместо and. Ваш orможет быть заменен |на.
Пшеничный волшебник

1
Я вижу, что это в конечном итоге сходится к вашему ответу ..: D
officialaimm

1

PHP , 68 байт

for(;$v<10;)$s.=strstr(+$v.join(+$v,range(1,9)).+$v++,$argn);echo$s;

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

Вывести часть строки поиска, начиная с первого вхождения ввода и до конца строки поиска, в качестве истинного значения и ничего для фальши

2 байта больше , вы можете заменить echo$s;с , !!echo$s;чтобы получить в 1качестве truthy значения

Найти вхождение ввода в одной из следующих строк в массиве

Array
(
    [0] => 0102030405060708090
    [1] => 1112131415161718191
    [2] => 2122232425262728292
    [3] => 3132333435363738393
    [4] => 4142434445464748494
    [5] => 5152535455565758595
    [6] => 6162636465666768696
    [7] => 7172737475767778797
    [8] => 8182838485868788898
    [9] => 9192939495969798999
)

1

JavaScript (ES6), 54 байта

f=
s=>[...s].every((e,i)=>i<2|e-s[i-2]==(s[2]!=s[0])^i%2)
<input oninput=o.textContent=this.value[3]?f(this.value):``><pre id=o>

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


1

MATL , 15 байт

2L&),duw]hSFTX=

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

С помощью @LuisMendo в чате. Обратите внимание, что если пустые выходные данные + ошибка также считаются ложными, то Xих можно пропустить, увеличив счет до 14 байт .

2L&)     % Split the input into odd and even-indexed elements
    ,   ] % Do twice (new feature since MATL v20.0), i.e., on both halves of the input
     d     % Pairwise differences of the array. Results in [0,0,...] for the 'constant' part,
            %  and [1,1,...] for the 'increasing' part.
      u      % Get unique elements. Results in [0] for the constant part, [1] for the increasing part.
       w      % Swap the stack to do the same for the other half of the input.
         hS    % Horizontal concatenation followed by sort. Results in [0,1] for the desired string.
           FTX= % Check if the result is indeed [0,1]. Implicit display.

0

Mathematica, 121 байт

(m[x_]:=Take[s=IntegerDigits@#,{x,Length@s,2}];w[b_,n_]:=Union@Differences@m@b=={1}&&Length@Union@m@n==1;w[1,2]||w[2,1])&

0

Pyth , 20 байт

ASm.+sMd.Tcz2&-GZ-H1

Выводится, []когда число соответствует шаблону цифр, в противном случае - иначе.

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

Пояснения (пример с вводом 85868)

ASm.+sMd.Tcz2&-GZ-H1

          cz2           # Chop the input in pairs: ['85', '86', '8']
        .T              # Transpose, ignore absences: ['888', '56']
     sM                 # Convert to integers: [[8, 8, 8], [5, 6]]
  m.+  d                # Compute deltas: [[0, 0], [1]]
 S                      # Sort: [[0, 0], [1]]
A                       # Assign first list to G and second list to H
              -GZ       # Filter 0 on G (on absence): [0, 0] -> []
                 -H1    # Filter 1 on H (on absence): [1] -> []
             &          # Check both lists are empty (logical and): [] & [] -> []

0

Pyth, 17 байт

qU2Ssm{.+d.TcjQT2

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

Тот же алгоритм, что и у моего желе-ответа.

Объяснение:

qU2Ssm{.+d.TcjQT2 Accepts an integer
             jQT  Take digits of input
            c   2 Split in pairs
          .T      Transpose
     m            Map the following on each of the two resulting lists:
       .+d          Take deltas
      {             Deduplicate
    s             The list is now in [[a, b, ...], [A, B, ...]] format, convert it to [a, b, ..., A, B, ...]
   S              Sort
qU2               Check if equal to [0, 1]

0

Python 3 , 167 161 157 131 106 байт

-55 байт благодаря предложениям @ WheatWizard

def g(t):k,c,f,j=t[::2],t[1::2],'123456789',''.join;return(len({*k})and j(c)in f)or(len({*c})and j(k)in f)

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


Можно играть в гольф дальше. Я уже редактирую.
г-н Xcoder

Возможно, вы видели этот трюк в моем ответе, но set(c)это то же самое, что и {*c}. (по крайней мере, в питоне 3)
Wheat Wizard

@WheatWizard спасибо. Редактирование
Mr. Xcoder

3
[t[z]for z in range(0,len(t),2)]это также просто склейка списка. Вы можете сделать это просто с t[::2]. Если вы не знакомы с этим синтаксисом, я предлагаю ознакомиться с документами, потому что он довольно полезен.
Пшеничный волшебник

@WheatWizard Вау, это действительно полезно. К сожалению, я не могу редактировать ответ прямо сейчас. Я сделаю это, как только смогу. Большое спасибо за совет ...
Мистер Xcoder

0

Java (OpenJDK 8) , 128 119 118 108 107 104 байта

s->{int i=3,a=s[2]-s[0],b=s[3]-s[1];for(;++i<s.length;)a+=b-(b=s[i]-s[i-2]==a?a:2);return(a|b)==1&a!=b;}

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

Объяснение:

s->{                             // lambda
  int i=3,                       //  iterating index
      a=s[2]-s[0],               //  diff of even-indexed characters
      b=s[3]-s[1];               //  diff of odd-indexed characters
  for(;++i<s.length;)            //  iterate
    a+=b-(b=                     //   swap a and b
        s[i]-s[i-2]==a?a:2       //    or set b to 2 if the diffs don't match
      ));                        //
  return (a|b)==1                //  return true if both a and b are in (0,1)
        &a!=b;                   //         but different
}

0

Сетчатка , 47 байт

.
$*11;
(1+)(?<=\1;1+;\1)

^1+;1+

^;?(;1;)+;?$

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

Выводит 1, если соответствует шаблону, 0, если нет

объяснение

.
$*11;

Преобразовать каждую цифру n в n + 1 в одинарных, разделенных точкой с запятой

(1+)(?<=\1;1+;\1)

(Завершающий перевод строки) преобразует каждую цифру в разницу между собой и двумя предыдущими

^1+;1+

(Завершающий перевод строки) удаляет первые 2 цифры

^;?(;1;)+;?$

Подсчитывает количество совпадений этого шаблона, который проверяет наличие чередующихся 0 и 1

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