Teraz wszyscy razem

24

Biorąc pod uwagę listę cyfr od 1 do 9, wypisz, czy każda cyfra jest zgrupowana jako pojedynczy ciągły blok. Innymi słowy, żadne dwie z tej samej cyfry nie są oddzielone różnymi cyframi. Jest OK, jeśli cyfra w ogóle się nie pojawia. Wygrywa najmniej bajtów.

Dane wejściowe: niepusta lista cyfr od 1 do 9. Może to być liczba dziesiętna, ciąg znaków, lista lub podobna sekwencja.

Dane wyjściowe: spójna wartość Prawda, jeśli wszystkie cyfry są pogrupowane w ciągłe bloki, i spójna wartość Falsey, jeśli nie są.

Prawdziwe przypadki:

3
51
44999911
123456789
222222222222222222222

Fałszywe przypadki:

818
8884443334
4545
554553
1234567891

xnor
źródło
2
Czy lista ciągów singletonów byłaby akceptowalnym formatem wejściowym?
Dennis
Tak, singletony są w porządku.
xnor
Czy ktoś może mi powiedzieć, jaki byłby najbardziej wydajny algorytm dla tego problemu? Czy może istnieje bardziej ogólny problem, z którym można się pogodzić?
@ amt528 Możesz to zrobić w czasie liniowym, iterując każdą cyfrę i sprawdzając, czy nie ma serii po pierwszej.
xnor
Czy możesz podać przykład jego wdrożenia?

Odpowiedzi:

18

Python 3, 38 34 33 bajtów

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

To oczekuje listy cyfr lub ciągów singletonów jako argumentu. Przetestuj na Ideone .

Dzięki @xsot za grę w golfa z 4 bajtów!

Dzięki @immibis za grę w golfa na 1 bajcie!

Dennis
źródło
Jeśli zamiast tego możesz zaakceptować listę ciągów, możesz ją skrócić dolambda s:s==sorted(s,key=`s`.find)
xsot 12.04.2016
Ach, próbowałem sporządzić listę, ale nie myślałem o użyciu backticks ... Zapytam OP.
Dennis
Czy coś mi brakuje - dlaczego nie możesz tego użyć s.find?
user253751
@immibis smusi być listą ciągów singletonowych (lub musiałbym przerzucić sna listę w celu porównania) i list.findnie jest zdefiniowany ...
Dennis
@Dennis s.index? Wydaje się dla mnie pracować.
user253751 12.04.16
14

JavaScript (ES6), 27 bajtów

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

Używa negatywnego spojrzenia przed siebie, aby wyszukać dwie niesąsiadujące cyfry. Jeśli istnieją co najmniej dwie takie cyfry, można je wybrać tak, aby pierwsza cyfra poprzedza inną cyfrę.

Neil
źródło
1
Lub po prostu użyj wyrażenia regularnego XD. To też działa.
Conor O'Brien
1
ahem Retina ahem
John Dvorak
13

05AB1E , 4 bajty

Kod:

Ô¹ÙQ

Wyjaśnienie:

Ô     # 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.

Wykorzystuje kodowanie CP-1252 .

Wypróbuj online!

Adnan
źródło
2
Ty ... właśnie pobiłeś galaretkę ... Nigdy nie myślałem, że to możliwe ...
Bálint
11

Galaretka , 5 bajtów

ĠIFPỊ

Wypróbuj online!

Jak to działa

Ġ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.
Dennis
źródło
Pięć bajtów, które mówisz? Co to za kodowanie?
John Dvorak,
4
Jelly ma własną stronę kodową , która koduje każdy z 256 znaków, które rozumie jako pojedynczy bajt.
Dennis
9

Pyth, 6 5 bajtów

1 bajt dzięki FryAmTheEggman

SIxLQ

Zainspirowany tutaj rozwiązaniem Python .

Zestaw testowy

Wyjaśnienie:

SIxLQ
  xLQ   Map each element in the input to its index in the input. Input is implicit.
SI      Check whether this list is sorted.
isaacg
źródło
3
SIxLQwydaje się działać.
FryAmTheEggman
To jest genialne.
Maltysen
1
Drugi Qnie wydaje się poprawnie przeanalizowany, zamienia kolejność argumentów lub coś, więc dostajesz wszystkie 0s i zawsze daje to prawdę. Oto pakiet testowy.
FryAmTheEggman
8

R, 66 48 46 43 38 bajtów

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

Jest to funkcja, która przyjmuje dane wejściowe jako wektor cyfr i zwraca wartość logiczną. Aby go wywołać, przypisz go do zmiennej.

Nie najkrótszy, ale pomyślałem, że to zabawne podejście. Uruchamiamy kodowanie długości danych wejściowych i wyodrębnianie wartości. Jeśli lista wartości zawiera duplikaty, zwróć FALSE, w przeciwnym razie zwróć TRUE.

Sprawdź wszystkie przypadki testowe online

Zaoszczędź 20 bajtów dzięki MickyT, 3 dzięki Albertowi Masclansowi i 5 dzięki mnel!

Alex A.
źródło
7

MATL , 8 bajtów

t!=tXSP=

Dane wyjściowe to tablica zawierająca tylko jedne dla prawdy lub tablica zawierająca co najmniej jedno zero dla falsey.

Wypróbuj online!

Wyjaśnienie

Rozważ dane wejściowe 22331, które spełniają warunek. Testowanie, czy każdy znak jest równy, daje tablicę 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

Ostateczny wynik powinien być prawdziwy, jeśli rzędy tej tablicy (uważane za atomowe) są w porządku (leksykograficznym) malejącym . Dla porównania dane wejściowe 22321dają tablicę

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

w których wiersze nie są sortowane.

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
Luis Mendo
źródło
5

Siatkówka , 17 bajtów

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

Wypróbuj online! (Nieznacznie zmodyfikowany, aby uruchomić wszystkie przypadki testowe jednocześnie).

Pierwszy regex pasuje do cyfr, które oddzielone od pozostałych cyfr, więc dostać 0do prawidłowych wejść i nigdzie pomiędzy 1i 9za nieprawidłowe wejść (z powodu chciwości z The .+, nie możemy dostać więcej niż n-1mecze dla nróżnych cyfr).

Aby odwrócić prawdziwość wyniku, zliczamy liczbę 0s, która jest 1dla poprawnych danych wejściowych i0 nieprawidłowych .

Martin Ender
źródło
Zrobiłem krótszy, ale jest na tyle blisko twojego, że powinien to być komentarz. Użyj AntiGrep zamiast Dopasuj, a następnie usuń ostatni wiersz: A`(.)(?!\1).+\1dla 15 bajtów. Działa również dla wielu wejść. Prawda jest wkładem, fałsz jest niczym. Nie gra się po prostu w Martina w jego własnym języku. :)
mbomb007 22.04.16
@ mbomb007 Wydaje mi się, że rzeczywiście to rozważyłem, ale niestety wyzwanie wymaga stałej wartości prawdy (i fałszu), więc drukowanie danych wejściowych jako prawdy jest niedozwolone.
Martin Ender
5

Java, 161 156 bajtów

Ponieważ Java ...

Bezwstydnie kradnie zapożyczanie wyrażenia regularnego z tej odpowiedzi ponieważ zacząłem próbować robić to za pomocą tablic i manipulacji matematycznych, ale stało się to strasznie skomplikowane, a wyrażenie regularne jest tak samo dobrym narzędziem jak ten problem.

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

Nie golfowany:

import java.util.regex.*;

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

Przedstawiony jak rozsądna osoba 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());
    }
}
JamesENL
źródło
3
like a sensible Java personTo znaczy, że nigdy nie używam Javy.
kot
Inne rozwiązania zapewniają tylko funkcję, dzięki czemu byłaby o wiele krótsza. Coś w stylus->s.match("(.)(?!\\1).*\\1")
Andreas,
2
Ale wtedy nie mogliśmy rozkoszować się gadatliwością odpowiedzi.
JamesENL
4

Rubinowy, 23 bajty

Funkcja anonimowa. Akceptuje ciąg. Strate Regex.

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

Podział 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

!~oznacza, jeśli w ciągu nie ma żadnych dopasowań wyrażenia regularnego, return truei return return false.

Wartość tuszu
źródło
4

Mathematica, 26 bajtów

0<##&@@Sort[#&@@@Split@#]&
feersum
źródło
4

MATL, 13 11 bajtów

u"G@=fd2<vA

Dzięki Luis Mendo za uratowanie dwóch bajtów!

Wypróbuj online!

Wyjaśnienie

        % 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
Suever
źródło
Możesz pobrać dane wejściowe z cudzysłowami (domyślnie dozwolone) i usunąć j. Myślę też, że możesz poruszać się vAw pętli i usuwać]
Luis Mendo,
@LuisMendo Thanks! Pomyślałem o włożeniu do Y&środka, ale to nie działało, ponieważ fd2<może być puste. vAJednak poruszanie się w środku działa świetnie! Naprawdę chciałbym mieć stajnię, uniquektóra nie zajmowałaby ton bajtów.
Suever,
Teraz stabilny unikalny zajmuje trochę mniej, używając liczby zamiast predefiniowanego ciągu. Mogę jednak dodać krótszą wersję w przyszłości. Lub po prostu uustabilizuj domyślnie (zawsze możesz dołączyć Spóźniej dwa bajty). Co myślisz?
Luis Mendo,
3

Haskell, 44 bajty

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

Przykład użycia: ((==)<*>nub).map head.group $ "44999911"->True .

Wersja bez point-point:

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"
nimi
źródło
3

J, 8 bajtów

-:]/:i.~

Przetestuj to z J.JS .

Jak to działa

-:]/: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.
Dennis
źródło
1
:] :i :-1
CalculatorFeline
11
Nie jestem pewien, czy żart lub sugestia gry w golfa ...
Dennis,
3

Python, 56 55 bajtów

a=lambda s:~(s[0]in s.lstrip(s[0]))&a(s[1:])if s else 1
orlp
źródło
Nie działa w Pythonie 3.4.1 ( int not subscriptable)
CalculatorFeline
Zapisano dodatkowy bajt z ~(który dosłownie jest równoważny 1-):a=lambda s:~(s[0]in s.lstrip(s[0]))&a(s[1:])if s else 1
CalculatorFeline
3

C #, 119 bajtów

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

Bez golfa

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

    return true;
}
auhmaan
źródło
1
Witamy w PPCG! Zamiast usuwać post i tworzyć nowy post ze stałą wersją, możesz również edytować swój stary post, a następnie cofnąć jego usunięcie. (Nie trzeba już tego robić, skoro i tak są już dwa posty, ale żebyś wiedział w przyszłości.)
Martin Ender 14.04.16
Mój błąd. Kiedy po raz pierwszy zamierzałem wziąć udział w Code Golf, źle odczytałem cel i nie miałem dużo czasu na zrobienie innego rozwiązania (i znając siebie, nie będę próbował poprawiać poprzednio opublikowanego rozwiązania). Ale potem powiedziano mi, że mam trochę więcej wolnego czasu i próbowałem opublikować „prawidłowe rozwiązanie”. Nawet nie pomyślałem, robiąc to, co powiedziałeś. Następnym razem będę o tym pamiętać!
auhmaan
Nie ma problemu, mam nadzieję, że będziesz się dobrze bawić w społeczności. :)
Martin Ender
2

Julia, 35 bajtów

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

Z jakiegokolwiek powodu sortnie bierze sznurka, ale issorted...

Dennis
źródło
... Czy ciągi znaków nie są niezmiennymi tablicami w Julii jak Python? Bardzo by mnie to zasmuciło.
kot
1
Tak, ciągi są niezmienne. Prawdopodobnie dlatego issorteddziała, ale sortnie działa.
Dennis
1
Nie zdefiniowano metody sortowania ciągów, ale nie działałoby, gdyby były przetwarzane w taki sam sposób, jak tablice jednowymiarowe, ponieważ są one sortowane przez wykonanie kopii w miejscu i, jak powiedzieliście, ciągi są niezmienne. Nie jest to jednak problem sprawdzania uporządkowanej kolejności, ponieważ jest zaimplementowany jako prosta pętla nad iterowalnym, co jest dobre dla łańcuchów. Tylko trochę ciekawostek. ¯ \ _ (ツ) _ / ¯
Alex A.,
@AlexA. Tak bardzo jak Python; różnica polega na tym, że wbudowane w Pythona sortednajpierw przekształca swój iterowalny argument w listę zmienną - dlatego sorted(string)zwraca listę ciągów
cat
2

Współczynnik, 22 bajty

[ dup natural-sort = ]

Robi to, co jest napisane na puszce. Jako funkcję anonimową powinieneś callto zrobić lub zrobić to : word ;.

kot
źródło
4
przeraża mnie, gdy kot wprowadza mysz do gry
downrep_nation
@downrep_nation: P
cat
2

Lua, 107 94 85 bajtów

13 bajtów zapisanych dzięki @LeakyNun

Przynajmniej bije Java: D. Lua ssie manipulowanie ciągami, ale myślę, że to wystarczy :).

Bierze swoje dane wejściowe jako argument wiersza poleceń, a dane wyjściowe 1dla prawdziwych przypadków i falsedla fałszywych. Teraz wyświetla dane wyjściowe za pomocą kodu wyjścia. Wyjdź z kodu 0 dla prawdy i 1 dla fałszu

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

Bez golfa

Uwaga, wywoływane są dwie magiczne zmienne ..., pierwsza zawiera argument programu, druga jest lokalna dla funkcji anonimowej i zawiera jej parametry

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
Katenkyo
źródło
Jeśli jest to dozwolone, można wymienić os.exit()z i=#0...
nieszczelny Nun
1

JavaScript ES6, 71 69 bajtów

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

Lub równoważnie:

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

Gra w golfa w toku.

Sprawdź przypadki testowe

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>

Conor O'Brien
źródło
1

C # 111 bajtów

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

stara strategia 131 bajtów

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

pierwszy golf myślę, że zrobiłem dobrze w

downrep_nation
źródło
1

C, 74 73 71 bajtów

Ogolony jeden trzech bajtów dzięki @xsot!

a[99],c,m;main(d){for(;~c;m|=c^d&&a[d=c]++)c=getchar();putchar(48+!m);}
Mllllbyte
źródło
a[99] I love Perl's autovivification! Oh, wait...
cat
I think this works: a[99],c,m;main(d){for(;~c;m|=a[d=c]+=c!=d)c=getchar();putchar(48+1/m);}
xsot
@xsot - Thank you for shaving one byte by replacing !--m with 1/m. About a[d=c]+=c!=d, I tried it with gcc and it didn't work on my computer because of order of evaluation. We must find a compiler that will play along.
mIllIbyte
Oh, I just tested it on ideone and it worked fine. How about this: a[99],c,m;main(d){for(;~c;m|=c^d&&a[d=c]++)c=getchar();putchar(48+!m);}
xsot
1

Haskell, 37 bytes

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

Uses the same approach as Luis Mendo's MATL answer: creates a vector for each entry which indices equal it, and checks that the result is sorted in decreasing order.

(<$>l).(==)<$>l is shorter version of [map(==a)l|a<-l]. The function (<$>l).(==) that takes a to map(==a)l is mapped onto l.

scanl1 min takes the cumulative smallest elements of l, which equals the original only if l is reverse-sorted. (==)=<< checks if the list is indeed invariant under this operation.


A different recursive strategy gave 40 bytes:

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

This checks each suffix to see if its first element doesn't appear in the remainder, excusing cases where the first two elements are equal as part of a contiguous block.

xnor
źródło
1

Racket, 53 bytes

The dumb, simple version.

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

Racket, 86 bytes

Here's the version implementing @xnor's comment about more efficient ways to do this.

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

Okay, this may actually just shift the weight of computation from the sort function to regexp-replace, but it was an interesting solution. Basically, it removes runs of duplicate characters first (see here), then tests if the remaining length-1 runs are in sorted fashion.

cat
źródło
1

Perl 5, 20 bytes

19, plus 1 for -pe instead of -e.

$_=!/(.)(?!\1).+\1/
msh210
źródło
1

Wolfram Language (Mathematica), 18 bytes

Gather@#==Split@#&

Try it online!

Gather gathers a list into sublists of identical elements, and Split splits a list into sublists of consecutive identical elements. They give the same result if and only if each value appears in only one contiguous block.

Misha Lavrov
źródło
0

Japt, 9 bytes

ò¦ mÌ
eUâ

Try it


Explanation

          :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
Shaggy
źródło