Чи відповідає це цифрі цифри?


23

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

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

де nі xє одноцифровими цілими числами. Послідовність може починатися з або xабо nзакінчуватися будь-яким xабо n+y.

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

n+y завжди буде одноцифровим числом (отже, чому обмеження довжини дорівнює 18).

Випробування

Вони повинні виводити значення "truthy"

182838485868788898
4344
85868
12223242526

І це повинні бути фальси

12345
6724013635
36842478324836
1222232425
5859510511

Як і у всіх кодових гольфів, найкоротший виграш коду! Успіхів і, можливо, шанси будуть вам завжди на користь!


Чи можемо ми приймати введення як рядок?
Kritixi Lithos

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

Чи є xі nнульовими для чисел, які відповідають правилу?
Містер Xcoder

@ Mr.Xcoder число не може починатися з 0, але може містити або закінчуватися 0s
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"), чи є інші цифри у порядку зростання чи ні. Якщо цифри знаходяться у порядку зростання, це повертає, чи всі вони однакові, чи ні, якщо ні, він запитає, чи множина порожня, чого не може бути, таким чином, завжди повертається помилковим.


Як завжди, я перевершив>. <
Містер Xcoder

x[a<1::2]in"123456789"можна "0"<x[a<1::2]<":"(порівнюючи символи порівнювати коди)
CalculatorFeline

@CalculatorFeline Я не думаю, що це правда. Це просто перевіряє, що рядок починається з числа.
Пшеничний майстер

Ну правильно, однак це працює для одиноких персонажів.
CalculatorFeline

Але вам насправді потрібно a<1? Схоже, що це може бути просто a.
CalculatorFeline


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: Дякую за підказку! Я відповідно замінив функцію.
siracusa

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
ви можете замінити екземпляри iз 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

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

Піт, 17 байт

qU2Ssm{.+d.TcjQT2

Спробуйте тут

Той самий алгоритм, що і моя відповідь на Jelly.

Пояснення:

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}. (принаймні в python 3)
Пшеничний майстер

@WheatWizard дякую. Редагування
Містер 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)

(Трейлінг нового рядка) перетворює кожну цифру на різницю між собою та одним 2 плямами перед нею

^1+;1+

(Трейлінг нового рядка) видаляє перші 2 цифри

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

Підраховує кількість збігів цього шаблону, який перевіряє на чергування 0 і 1

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.