Всі разом зараз


24

Дано список цифр від 1 до 9, виведіть, чи згрупується кожна цифра як один суміжний блок. Іншими словами, жодна дві однакові цифри не розділяються різними цифрами. Добре, якщо цифра взагалі не відображається. Виграє найменше байт.

Введення: Непорожній список цифр від 1 до 9. Це може бути як десяткове число, рядок, список або подібна послідовність.

Вихід: Послідовне значення Truthy, якщо всі цифри згруповані в суміжні блоки, і послідовне значення Фальсі, якщо вони не є.

Справжні випадки:

3
51
44999911
123456789
222222222222222222222

Неправдиві випадки:

818
8884443334
4545
554553
1234567891


2
Чи буде список однорядних рядків прийнятним форматом введення?
Денніс

Так, одинаки добре.
xnor

Хто-небудь може мені сказати, який би найефективніший алгоритм цієї проблеми був би? Або є більш загальна проблема, що це підпадає під те, що я можу подивитися?

@ amt528 Ви можете це зробити в лінійний час, перебираючи кожну цифру і перевіряючи, чи немає жодних пробіжів минулого.
xnor

Чи можете ви навести приклад того, як це реалізується?

Відповіді:


18

Python 3, 38 34 33 байт

lambda s:s==sorted(s,key=s.index)

Тут очікується список цифр або однорядних рядків як аргумент. Перевірте це на Ideone .

Дякуємо @xsot за те, що виграли 4 байти!

Дякуємо @immibis за те, що виграли 1 байт!


Якщо вам дозволяється приймати список рядків замість цього, ви можете скоротити це доlambda s:s==sorted(s,key=`s`.find)
xsot

Ах, я спробував взяти список, але я не думав використовувати задній стік ... Я попрошу ОП.
Денніс

Я щось пропускаю - чому ти не можеш просто скористатися s.find?
користувач253751

@immibis sповинен бути списком однорядних рядків (або я повинен був би sпередати цей список для порівняння), і list.findне визначено ...
Dennis

@Dennis s.indexтоді? Здається, працює для мене.
користувач253751

14

JavaScript (ES6), 27 байт

s=>!/(.)(?!\1).*\1/.test(s)

Використовує негативну пошукову головку для пошуку двох безперервних цифр. Якщо принаймні дві такі цифри існують, то їх можна вибрати таким чином, щоб перша цифра передувала іншій цифрі.


1
Або просто використовуйте регулярний вираз XD. Це теж працює.
Conor O'Brien

1
ahem Retina ahem
Джон Дворак

13

05AB1E , 4 байти

Код:

Ô¹ÙQ

Пояснення:

Ô     # Push connected uniquified input. E.g. 111223345565 would give 1234565.
 ¹    # Push input again.
  Ù   # Uniquify the input. E.g. 111223345565 would give 123456.
   Q  # Check if equal, which yields 1 or 0.

Використовує кодування CP-1252 .

Спробуйте в Інтернеті!


2
Ти ... просто бив желе ... Я ніколи не думав, що це можливо ...
Белінт

11

Желе , 5 байт

ĠIFPỊ

Спробуйте в Інтернеті!

Як це працює

ĠIFPỊ  Main link. Input: n (list of digits or integer)

Ġ      Group the indices of n by their corresponding values, in ascending order.
       For 8884443334, this yields [[7, 8, 9], [4, 5, 6, 10], [1, 2, 3]].
 I     Increments; compute the all differences of consecutive numbers.
       For 8884443334, this yields [[1, 1], [1, 1, 4], [1, 1]].
  F    Flatten the resulting 2D list of increments.
   P   Product; multiply all increments.
    Ị  Insignificant; check if the product's absolute value is 1 or smaller.

П’ять байтів ви кажете? Що це за кодування?
Джон Дворак

4
У Jelly є своя сторінка коду , яка кодує кожен із 256 символів, які він розуміє як один байт.
Денніс

9

Pyth, 6 5 байт

1 байт завдяки FryAmTheEggman

SIxLQ

Натхненні рішенням Python тут .

Тестовий набір

Пояснення:

SIxLQ
  xLQ   Map each element in the input to its index in the input. Input is implicit.
SI      Check whether this list is sorted.

3
SIxLQздається, працює.
FryAmTheEggman

Це геній.
Мальтісен

1
Другий, Qздається, не розбирається належним чином, він міняється аргументом наказ або щось подібне, тому ви отримуєте всі 0s, і це завжди дає істину. Ось набір тестів.
FryAmTheEggman

8

R, 66 48 46 43 38 байт

function(s)!any(duplicated(rle(s)$v))

Це функція, яка приймає вхід як вектор цифр і повертає булеве значення. Щоб викликати його, призначте його змінній.

Не найкоротший, але я вважав, що це цікавий підхід. Запускаємо довжину, кодуємо вхідні дані та дістаємо значення. Якщо список значень містить дублікати, поверніть FALSE, інакше поверніть TRUE.

Перевірте всі тестові випадки в Інтернеті

Збережено 20 байт завдяки MickyT, 3 подякам Альберту Масклану та 5 завдяки mnel!


7

MATL , 8 байт

t!=tXSP=

Вихід - це масив, що містить лише одиниці для truthy, або масив, що містить принаймні один нуль для фальси.

Спробуйте в Інтернеті!

Пояснення

Розглянемо вхід 22331, який задовольняє умові. Тестування, якщо кожен символ дорівнює одному, дає 2D масив

1 1 0 0 0
1 1 0 0 0
0 0 1 1 0
0 0 1 1 0
0 0 0 0 1

Кінцевий результат повинен бути правдоподібним, якщо рядки цього масиву (вважаються атомними) знаходяться в (лексикографічному) порядку зменшення . Для порівняння, введення 22321дає масив

1 1 0 1 0
1 1 0 1 0
0 0 1 0 0
1 1 0 1 0
0 0 0 0 1

в яких рядки не сортуються.

t!   % Take string input. Duplicate and tranpose
=    % Test for equality, element-wise with broadcast: gives a 2D array that
     % contains 0 or 1, for all pairs of characters in the input
t    % Duplicate
XS   % Sort rows (as atomic) in increasing order
P    % Flip vertically to obtain decreasing order
=    % Test for equality, element-wise

5

Сітківка , 17 байт

M`(.)(?!\1).+\1
0

Спробуйте в Інтернеті! (Трохи модифікований для запуску всіх тестових випадків одночасно.)

Перші матчі регулярного виразу цифра , які будуть розділені іншими цифрами, тому ми отримуємо 0для дійсних входів і в будь-якому місці між 1і 9недійсні входи (з - за жадібності з .+, ми не можемо отримати більше , ніж n-1сірників для nрізних цифр).

Для інвертування істинності результату підраховуємо кількість 0s, що відповідає 1дійсним вводу та 0недійсним.


Я зробив коротший, але він достатньо близький до вашого, щоб натомість він став коментарем. Використовуйте AntiGrep замість Match, а потім видаліть останній рядок: A`(.)(?!\1).+\1на 15 байт. Також працює для декількох входів. Truthy - це вхід, фальш - це ніщо. Один не просто гольф Мартін своєю мовою. :)
mbomb007

@ mbomb007 Я думаю, що я насправді вважав це, але, на жаль, виклик вимагає постійного (і хибного) значення, тому друкувати введення як truthy заборонено.
Мартін Ендер

5

Java, 161 156 байт

Тому що Java ...

Безсоромно красти запозичення регексу з цієї відповіді, тому що я почав намагатися це робити з масивами та математичними маніпуляціями, але це стало жахливо складним, і регулярний вираз є настільки ж хорошим інструментом, як і будь-яка проблема для цієї проблеми.

import java.util.regex.*;public class a{public static void main(String[] a){System.out.println(!Pattern.compile("(.)(?!\\1).*\\1").matcher(a[0]).find());}}

Безголівки:

import java.util.regex.*;

public class a {
    public static void main(String[] args) {
        System.out.println(!Pattern.compile("(.)(?!\\1).*\\1").matcher(args[0]).find());
    }

Викладений як розважлива особа Java:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class  {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("(.)(?!\\1).*\\1");
        Matcher m = p.matcher(args[0]);
        System.out.println(!m.find());
    }
}

3
like a sensible Java personЦе було б, не використовуючи Java ніколи.
кіт

Інші рішення просто пропонують функцію, зробить її набагато коротшою. Щось на кшталтs->s.match("(.)(?!\\1).*\\1")
Андреас

2
Але тоді ми не змогли насолодитися багатозначністю відповіді.
ДжеймсЕНЛ


4

Рубін, 23 байти

Анонімна функція. Приймає рядок. Regex strat.

->n{/(.)(?!\1).*\1/!~n}

Поломка Regex

/(.)(?!\1).*\1/
 (.)            # Match a character and save it to group 1
    (?!\1)      # Negative lookahead, match if next character isn't
                #  the same character from group 1
          .*    # Any number of matches
            \1  # The same sequence as group 1

!~означає, якщо в рядку немає збігів регулярного вираження, повернути trueі іншим чином повернути false.



4

MATL, 13 11 байт

u"G@=fd2<vA

Дякуємо Луїсу Мендо за збереження двох байтів!

Спробуйте в Інтернеті!

Пояснення

        % Grab the input implicitly
u       % Find the unique characters
"       % For each of the unique characters
    G   % Grab the input again
    @=  % Determine which chars equal the current char
    f   % Find the locations of these characters
    d   % Compute the difference between the locations
    2<  % Find all index differences < 2 (indicating consecutive chars)
    v   % Vertically concatenate all stack contents
    A   % Ensure that they are all true
        % Implicit end of the for loop

Ви можете взяти дані з лапками (дозволено за замовчуванням) та видалити j. Крім того, я думаю, ви можете переміститися vAв циклі і зняти]
Луїс Мендо

@LuisMendo Дякую! Я заплутався з введенням Y&всередину, але це не спрацювало, тому що fd2<може бути порожнім. Переміщення vAвсередині працює чудово, хоча! Також я дуже хотів би, щоб у нас була конюшня, uniqueяка не забирала тонни байтів.
Suever

Тепер стабільний унікальний займає трохи менше, використовуючи число замість попередньо визначеного рядка. Однак я можу додати скорочену версію в майбутньому. Або просто зробити uстабільним за замовчуванням (ви завжди можете включати Sпісля цього два байти). Як ти гадаєш?
Луїс Мендо

3

Haskell, 44 байти

import Data.List 
((==)<*>nub).map head.group

Приклад використання: ((==)<*>nub).map head.group $ "44999911"->True .

Неточна версія:

f x = q == nub q                -- True if q equals q with duplicates removed
  where
  q = map head $ group x        -- group identical digits and take the first
                                -- e.g. "44999911" -> ["44","9999","11"] -> "491"
                                -- e.g  "3443311" -> ["3","44","33","11"] -> "3431"

3

J, 8 байт

-:]/:i.~

Перевірте його з J.js .

Як це працює

-:]/:i.~  Monadic verb. Argument: y (list of digits)

     i.~  Find the index in y of each d in y.
  ]/:     Sort y by the indices.
-:        Match; compare the reordering with the original y.

1
:] :i :-1
CalculatorFeline

11
Не впевнений, чи жарт чи пропозиція про гольф…
Денніс

3

Пітон, 56 55 байт

a=lambda s:~(s[0]in s.lstrip(s[0]))&a(s[1:])if s else 1

Помилка в Python 3.4.1 ( int not subscriptable)
КалькуляторFeline

Збережено додатковий байт з ~(що буквально еквівалентно 1-):a=lambda s:~(s[0]in s.lstrip(s[0]))&a(s[1:])if s else 1
CalculatorFeline

3

C #, 119 байт

bool m(String s){for(int i=0;i<9;i++){if(new Regex(i.ToString()+"+").Matches(s).Count>1){return false;}}return true;}

Безумовно

bool m(String s) {
    for(int i=0;i<9;i++) {
        if(new Regex(i.ToString() + "+").Matches(s).Count > 1) {
            return false;
        }
    }

    return true;
}

1
Ласкаво просимо до PPCG! Замість видалення публікації та створення нової публікації з фіксованою версією ви також можете відредагувати стару публікацію, а потім відновити її. (Не потрібно робити цього зараз, коли вже все-таки є дві посади, але просто так, щоб ви знали в майбутньому.)
Мартін Ендер

Моє ліжко. Коли я вперше мав намір взяти участь у цьому кодексі Golf, я неправильно прочитав ціль і не мав багато часу, щоб прийняти інше рішення (і, знаючи себе, я б не намагався виправити попереднє розміщене рішення). Але потім мені сказали, що я маю ще трохи вільного часу і спробували опублікувати "правильне рішення". Навіть не думав робити те, що ти сказав. Наступного разу я маю це на увазі!
auhmaan

Зовсім ніяких проблем, я сподіваюся, що ви добре провести час у громаді. :)
Мартін Ендер

2

Джулія, 35 байт

s->issorted(s,by=x->findfirst(s,x))

З будь-якої причини sortне бере струну, але issortedробить ...


... Чи рядки не є незмінними масивами в Джулії, як Python? Це зробило б мене справді сумно.
кіт

1
Так, рядки незмінні. Це, мабуть, тому issortedпрацює, але sortні.
Денніс

1
Не існує методу сортування для рядків, але він би не працював, якби вони були оброблені так само, як одновимірні масиви, оскільки вони сортуються, виконуючи на місці своєрідну копію, і, як ви сказали, струни незмінні. Перевірити сортований порядок це не проблема, тому що він реалізований як простий цикл над ітерабельним, що добре для рядків. Просто якісь дрібниці. ¯ \ _ (ツ) _ / ¯
Олексій А.

@AlexA. Так дуже багато , як Python насправді; Різниця полягає в тому, що вбудований Python sortedспочатку перетворює свій ітерабельний аргумент у список, що змінюється - тому sorted(string)повертає список рядків
cat

2

Фактор, 22 байти

[ dup natural-sort = ]

Робить те, що написано на жерсті. Як функція анонімної миші, ви повинні callце зробити або зробити це : word ;.


4
мене лякає, коли кішка вводить мишу в гру
downrep_nation

@downrep_nation: P
кіт

2

Луа, 107 94 85 байт

13 байт збережено завдяки @LeakyNun

Принаймні, це б'є Java: D. Луа смокче маніпулювати струнами, але я думаю, що це досить добре :).

Він бере свій вклад як аргумент командного рядка, а виводить 1для правдивих випадків і falseдля хибних. Тепер виводить, використовуючи свій вихідний код. Вийдіть з коду 0 для трити, а 1 - для помилки

o=os.exit;(...):gsub("(.)(.+)%1",function(a,b)if 0<#b:gsub(a,"")then o(1)end end)o(0)

Безумовно

Будьте обережні, є дві магічні змінні, які називаються ..., перша містить аргумент програми, друга - локальна анонімній функції та містить її параметри

o=os.exit;               -- ; mandatory, else it would exit instantly
(...):gsub("(.)(.+)%1",  -- iterate over each group of the form x.*x and apply an anonymous
  function(a,b)          -- function that takes the captured group as parameters
  if 0<#b:gsub(a,"")     -- if the captured group (.+) contain other character than
  then                   -- the one captured by (.)
    o(1)                 -- exit with falsy
  end
end)
o(0)                     -- exit with truthy, reached only when the string is okay

Якщо це дозволено, ви можете замінити os.exit()на i=#0...
Leaky Nun

1

JavaScript ES6, 71 69 байт

h=y=>y.match(/(.)\1*/g);x=>h((u=h(x)).sort().join``).length==u.length

Або, рівнозначно:

x=>((u=x.match(r=/(.)\1*/g)).sort().join``).match(r).length==u.length
x=>(h=y=>y.match(/(.)\1*/g))((u=h(x)).sort().join``).length==u.length

Гольф в процесі.

Перевірка тестових випадків

var truthy = `3
51
44999911
123456789
222222222222222222222`.split `
`;
var falsey = `818
8884443334
4545
554553
1234567891`.split `
`;

var Q = x => ((u = x.match(r = /(.)\1*/g)).sort().join ``).match(r).length == u.length;
truthy.concat(falsey).forEach(e => {
  t = document.createTextNode(`${e} => ${Q(e)}`);
  o.appendChild(t);
  o.appendChild(document.createElement("br"));
});
* {
  font-family: Consolas, monospace;
}
<div id=o></div>


1

C # 111 байт

bool f(string s){for(int i=0;i<s.Length-1;i++)if(s[i]!=s[i+1]&&s.LastIndexOf(s[i])!=i)return 1==2;return true;}

стара стратегія 131 байт

bool s(string i){var f=Regex.Matches(i,@"([0-9])\1{0,}").Cast<Match>().Select(m=>m.Value[0]);return f.Distinct().SequenceEqual(f);}

Перший гольф, я думаю, я зробив нормально


1

C, 74 73 71 байт

Поголив один три байти завдяки @xsot!

a[99],c,m;main(d){for(;~c;m|=c^d&&a[d=c]++)c=getchar();putchar(48+!m);}

a[99]Я люблю автовівіляцію Перла! О, зачекайте ...
кіт

Я думаю, що це працює:a[99],c,m;main(d){for(;~c;m|=a[d=c]+=c!=d)c=getchar();putchar(48+1/m);}
xsot

@xsot - Дякуємо, що поголили один байт, замінивши !--mна 1/m. О a[d=c]+=c!=d, я спробував це з gcc, і він не працював на моєму комп’ютері через порядок оцінки. Ми повинні знайти компілятор, який буде грати.
mIllIbyte

О, я просто перевірив це на ideone, і він працював чудово. Як щодо цього:a[99],c,m;main(d){for(;~c;m|=c^d&&a[d=c]++)c=getchar();putchar(48+!m);}
xsot

1

Хаскелл, 37 байт

f l=(==)=<<scanl1 min$(<$>l).(==)<$>l

Використовується той самий підхід, що і у відповіді MATL Луїса Мендо : створюється вектор для кожного запису, індекси якого дорівнюють йому, і перевіряє, чи результат сортується у порядку зменшення.

(<$>l).(==)<$>l- скорочена версія [map(==a)l|a<-l]. Функція, (<$>l).(==)яка бере aна себе map(==a)l, відображається на l.

scanl1 minприймає найменші найменші елементи l, які дорівнюють оригіналу лише за умови lзворотного сортування. (==)=<<перевіряє, чи список справді інваріантний в рамках цієї операції.


Інша рекурсивна стратегія дала 40 байт:

f(a:b:t)=f(b:t)>(elem a t&&a/=b)
f _=1>0

Це перевіряє кожен суфікс, щоб перевірити, чи не з’являється його перший елемент у решті, виправдовуючи випадки, коли перші два елементи рівні як частина суміжного блоку.


1

Ракетка, 53 байти

Тупий, простий варіант.

(λ(s)(let([s(string->list s)])(eq?(sort s char<?)s)))

Безголівки:

(define (lame-all-together s)
  (let ([s (string->list s)])
    (eq? (sort s char<?) s)))

Ракетка, 86 байт

Ось версія, що реалізує коментар @ xnor щодо більш ефективних способів зробити це.

(λ(s)(let([s(string->list(regexp-replace#px"(.)\\1+"s"\\1"))])(eq?(sort s char<?)s)))

Безголівки:

(define (all-together s)
    (let ([s (string->list (regexp-replace #px"(.)\\1+" s "\\1"))])
      (eq? (sort s char<?) s )))

Гаразд, це може просто перенести вагу обчислень з sortфункції на regexp-replace, але це було цікавим рішенням. В основному він спочатку видаляє запуски дублікатів символів ( див. Тут ), а потім перевіряє, чи решта виконаних завдань довжиною-1 впорядковано.



1

Мова Вольфрама (Mathematica) , 18 байт

Gather@#==Split@#&

Спробуйте в Інтернеті!

Gatherзбирає список у підсписи однакових елементів і Splitрозбиває список на підсписи послідовних однакових елементів. Вони дають однаковий результат тоді і лише тоді, коли кожне значення відображається лише в одному суміжному блоці.



0

Japt , 9 байт

ò¦ mÌ
eUâ

Спробуй це


Пояснення

          :Implicit input of string U             :e.g., "8884443334"
ò¦        :Split on inequality                    :["888","444","333","4"]
   mÌ     :Map and return the last digit of each  :["8","4","3","4"]
\n        :Assign to U
  Uâ      :Remove duplicates                      :["8","4","3"]
e         :Test for equality with U               :false
          :Implicit output of result

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