Теперь все вместе


24

Учитывая список цифр от 1 до 9, выведите, сгруппирована ли каждая цифра как один непрерывный блок. Другими словами, нет двух одинаковых цифр, разделенных разными цифрами. Это нормально, если цифра не появляется вообще. Побеждает несколько байтов.

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

Вывод: непротиворечивое значение Truthy, если все цифры сгруппированы в смежные блоки, и непротиворечивое значение Falsey, если это не так.

Истинные случаи:

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?
user253751

@immibis sдолжен быть списком одиночных строк (или я должен был бы привести его sк списку для сравнения), и list.findон не определен ...
Деннис

@ Денис s.indexтогда? Кажется, работает на меня.
user253751

14

JavaScript (ES6), 27 байт

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

Использует отрицательный прогноз для поиска двух несмежных цифр. Если существует хотя бы две такие цифры, то их можно выбрать так, чтобы первая цифра предшествовала другой цифре.


1
Или просто используйте регулярное выражение XD. Это тоже работает.
Конор О'Брайен

1
Гет Ретина Гм
Джон Дворжак

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

Это гений.
Maltysen

1
Второй Q, похоже, не анализируется должным образом, он меняет порядок аргументов или что-то в этом роде, поэтому вы получаете все 0s, и он всегда дает true. Вот тестовый набор.
FryAmTheEggman

8

R, 66 48 46 43 38 байт

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

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

Не самый короткий, но я думал, что это был забавный подход. Мы запускаем length, кодируем ввод и извлекаем значения. Если список значений содержит дубликаты, вернуть FALSE, в противном случае вернуть TRUE.

Проверьте все тестовые примеры онлайн

Благодаря MickyT сэкономлено 20 байт, 3 благодаря Albert Masclans и 5 благодаря mnel!


7

MATL , 8 байт

t!=tXSP=

Выходные данные - это массив, содержащий только единицы для истинности, или массив, содержащий хотя бы один ноль для Falsey.

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

объяснение

Рассмотрим вход 22331, который удовлетворяет условию. Проверка того, что каждый символ равен друг другу, дает двумерный массив

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 байтов. Также работает для нескольких входов. Истина - вход, ложь - ничто. Один не просто обгоняет Мартина на его родном языке. :)
mbomb007

@ mbomb007 Я думаю, что я на самом деле учел это, но, к сожалению, задача состоит в том, чтобы получить постоянное (и ложное) значение, поэтому печать входных данных как правдивых не допускается.
Мартин Эндер

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

Ungolfed:

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
Но тогда мы не могли упиваться многословностью ответа.
JamesENL


4

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

Анонимная функция. Принимает строку. Regex strat.

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

Распределение регулярных выражений

/(.)(?!\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

!~означает, что если в строке нет совпадений с регулярным выражением, return trueи иначе return 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

Python, 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)
CalculatorFeline

Сохранен дополнительный байт с ~(который буквально эквивалентен 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;}

Ungolfed

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! Вместо удаления поста и создания нового поста с фиксированной версией, вы также можете отредактировать свой старый пост и затем удалить его. (Нет необходимости делать это сейчас, так как в любом случае уже есть два сообщения, но вы должны знать об этом в будущем.)
Мартин Эндер,

Виноват. Когда я впервые намеревался участвовать в этом Code Golf, я неправильно понял цель и у меня не было много времени, чтобы найти другое решение (и, зная себя, я бы не стал пытаться исправить предыдущее опубликованное решение). Но затем мне сказали, что у меня осталось немного свободного времени, и я попытался опубликовать «правильное решение». Даже не думал делать то, что ты сказал. В следующий раз я буду иметь это в виду!
августа

Нет проблем, я надеюсь, вы хорошо проведете время в сообществе. :)
Мартин Эндер

2

Юлия, 35 байт

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

По какой-то причине sortне принимает строку, но issortedделает ...


... Строки не являются неизменяемыми массивами в Джулии, как Python? Это сделало бы меня действительно грустным.
кот

1
Да, строки неизменны. Наверное, поэтому issortedработает, но sortне работает.
Деннис

1
Для строк не определен метод сортировки, но он не будет работать, если они будут обрабатываться так же, как одномерные массивы, потому что они сортируются путем выполнения копии на месте, и, как вы сказали, Строки неизменны. Это не проблема для проверки отсортированного порядка, потому что он реализован как простой цикл над итерацией, что хорошо для строк. Просто мелочи. ¯ \ _ (ツ) _ / ¯
Алекс А.

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

2

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

[ dup natural-sort = ]

Делает то, что говорит на банке. Как анонимная функция, вы должны callсделать это или сделать это : word ;.


4
меня пугает, когда кошка вводит мышь в игру
downrep_nation

@downrep_nation: P
кошка

2

Луа, 107 94 85 байт

13 байтов сохранено благодаря @LeakyNun

По крайней мере, это лучше, чем Java. Луа сосет при манипулировании струнами, но я думаю, что это достаточно хорошо :).

Он принимает входные данные в качестве аргумента командной строки и выводит их 1для истинных и ложных случаев false. Теперь выводит используя свой код выхода. Код выхода 0 для правдивых и 1 для ложных

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

Ungolfed

Будьте внимательны, есть две магические переменные ..., первая из которых содержит аргумент программы, вторая является локальной для анонимной функции и содержит ее параметры

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

С 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]Я люблю автовификацию Perl! Ой, подождите ...
кот

Я думаю, что это работает: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, и он не работал на моем компьютере из-за порядка оценки. Мы должны найти компилятор, который будет играть вместе.
МИЛЛИБАЙТ

О, я только что проверил его на ideone, и он работал нормально. Как насчет этого:a[99],c,m;main(d){for(;~c;m|=c^d&&a[d=c]++)c=getchar();putchar(48+!m);}
xsot

1

Haskell, 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)))

Ungolfed:

(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)))

Ungolfed:

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

Ладно, это может на самом деле просто перенести вес вычислений с sortфункции на regexp-replace, но это было интересное решение. По сути, сначала он удаляет повторяющиеся символы ( см. Здесь ), а затем проверяет, отсортированы ли оставшиеся серии длины 1.



1

Wolfram Language (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.