Jetzt alle zusammen

24

Bei einer gegebenen Liste der Ziffern 1 bis 9 wird ausgegeben, ob jede Ziffer zu einem einzigen zusammenhängenden Block zusammengefasst ist. Mit anderen Worten, keine zwei gleichen Ziffern werden durch verschiedene Ziffern getrennt. Es ist in Ordnung, wenn eine Ziffer überhaupt nicht angezeigt wird. Wenigste Bytes gewinnt.

Eingang: Eine nicht leere Liste mit den Ziffern 1 bis 9. Dies kann eine Dezimalzahl, eine Zeichenfolge, eine Liste oder eine ähnliche Folge sein.

Ausgabe: Ein konsistenter Wahrheitswert , wenn alle Ziffern in zusammenhängenden Blöcken gruppiert sind, und ein konsistenter Falsey- Wert, wenn dies nicht der Fall ist .

Wahre Fälle:

3
51
44999911
123456789
222222222222222222222

Falsche Fälle:

818
8884443334
4545
554553
1234567891

xnor
quelle
2
Wäre eine Liste von Singleton-Zeichenfolgen ein akzeptables Eingabeformat?
Dennis
Ja, Singletons sind in Ordnung.
XNOR
Kann mir jemand sagen, was der effizienteste Algorithmus für dieses Problem wäre? Oder gibt es ein allgemeineres Problem, das darunter fällt, dass ich nachschlagen kann?
@ amt528 Sie können dies in linearer Zeit tun, indem Sie jede Ziffer durchlaufen und sicherstellen, dass es keine Läufe nach der ersten gibt.
Xnor
Können Sie ein Beispiel für die Implementierung geben?

Antworten:

18

Python 3, 38 34 33 Bytes

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

Dies erwartet eine Liste von Ziffern oder Singleton-Strings als Argument. Teste es auf Ideone .

Vielen Dank an @xsot für das Golfen mit 4 Bytes!

Vielen Dank an @immibis für das Golfen ab 1 Byte!

Dennis
quelle
Wenn Sie stattdessen eine Liste von Zeichenfolgen akzeptieren dürfen, können Sie diese auflambda s:s==sorted(s,key=`s`.find)
xsot
Ah, ich habe versucht, eine Liste zu erstellen, aber ich habe nicht daran gedacht, Backticks zu verwenden ... Ich werde das OP fragen.
Dennis
Vermisse ich etwas - warum kannst du es nicht einfach benutzen s.find?
user253751
@immibis smuss eine Liste von Singleton-Strings sein (oder ich muss sie sfür den Vergleich auflisten ) und list.findist nicht definiert ...
Dennis
@ Tennis s.indexdann? Scheint für mich zu arbeiten.
user253751
14

JavaScript (ES6), 27 Byte

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

Verwendet den negativen Lookahead, um nach zwei nicht zusammenhängenden Ziffern zu suchen. Wenn mindestens zwei solcher Ziffern vorhanden sind, können sie so gewählt werden, dass die erste Ziffer einer anderen Ziffer vorangeht.

Neil
quelle
1
Oder verwenden Sie einfach einen Regex XD. Das funktioniert auch
Conor O'Brien
1
ahem Retina ahem
John Dvorak
13

05AB1E , 4 Bytes

Code:

Ô¹ÙQ

Erläuterung:

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

Verwendet CP-1252- Codierung.

Probieren Sie es online!

Adnan
quelle
2
Sie ... schlagen nur Gelee ... Ich hätte nie gedacht, dass dies möglich ist ...
Bálint
11

Gelee , 5 Bytes

ĠIFPỊ

Probieren Sie es online!

Wie es funktioniert

Ġ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
quelle
Fünf Bytes, sagst du? Was ist das für eine Codierung?
John Dvorak
4
Jelly hat eine eigene Codepage , die jedes der 256 Zeichen, die es versteht, als einzelnes Byte codiert.
Dennis
9

Pyth, 6 5 Bytes

1 Byte dank FryAmTheEggman

SIxLQ

Inspiriert von der Python-Lösung hier .

Testsuite

Erläuterung:

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
quelle
3
SIxLQscheint zu funktionieren.
FryAmTheEggman
Das ist Genie.
Maltysen
1
Die Sekunde Qscheint nicht richtig analysiert zu werden, sie tauscht die Argumentreihenfolge oder so etwas aus, sodass Sie alle 0s erhalten und es immer wahr ist. Hier ist eine Testsuite.
FryAmTheEggman
8

R 66 48 46 43 38 Bytes

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

Dies ist eine Funktion, die die Eingabe als Vektor von Ziffern akzeptiert und einen Booleschen Wert zurückgibt. Um es aufzurufen, weisen Sie es einer Variablen zu.

Nicht die kürzeste, aber ich dachte, es wäre ein lustiger Ansatz. Wir führen eine Längencodierung der Eingabe durch und extrahieren die Werte. Wenn die Werteliste Duplikate enthält, kehren Sie zurück FALSE, andernfalls zurück TRUE.

Überprüfen Sie alle Testfälle online

Dank MickyT 20 Bytes gespart, dank Albert Masclans 3 und dank mnel 5!

Alex A.
quelle
7

MATL , 8 Bytes

t!=tXSP=

Die Ausgabe ist ein Array, das nur Einsen für die Wahrheit enthält, oder ein Array, das mindestens eine Null für die Falschheit enthält.

Probieren Sie es online!

Erläuterung

Betrachten Sie die Eingabe 22331, die die Bedingung erfüllt. Das Testen, ob jedes Zeichen gleich ist, ergibt das 2D-Array

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

Das Endergebnis sollte wahr sein, wenn die Zeilen dieses Arrays (als atomar betrachtet) in absteigender (lexikografischer) Reihenfolge vorliegen . Zum Vergleich 22321liefert die Eingabe das Array

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

in denen die Zeilen nicht sortiert sind.

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
quelle
5

Retina , 17 Bytes

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

Probieren Sie es online! (Leicht modifiziert, um alle Testfälle gleichzeitig auszuführen.)

Die ersten Regex -Übereinstimmungen Ziffern , die sich von anderen Stellen getrennt, so dass wir eine bekommen 0für gültige Eingaben und irgendwo zwischen 1und 9für ungültige Eingaben (aufgrund der Gefräßigkeit der das .+können wir nicht mehr als bekommen n-1Treffer für nverschiedene Stellen).

Um die Richtigkeit des Ergebnisses umzukehren, wird die Anzahl von 0s gezählt, die 1für gültige Eingaben und 0für ungültige Eingaben gilt .

Martin Ender
quelle
Ich habe eine kürzere gemacht, aber es ist nah genug an deiner, dass es stattdessen ein Kommentar sein sollte. Verwenden Sie AntiGrep anstelle von Match und entfernen Sie die letzte Zeile: A`(.)(?!\1).+\1für 15 Bytes. Funktioniert auch für mehrere Eingänge. Wahrheit ist die Eingabe, falsch ist nichts. Man spielt Martin nicht einfach in seiner eigenen Sprache aus. :)
mbomb007
@ mbomb007 Ich glaube, ich habe das tatsächlich in Betracht gezogen, aber leider wird bei der Abfrage ein konsistenter Wahrheitswert (und ein falscher Wert) angefordert, sodass das Drucken der Eingabe als Wahrheitswert nicht zulässig ist.
Martin Ender
5

Java, 161 156 Bytes

Weil Java ...

Schamlos zu stehlen , den Regex aus dieser Antwort auszuleihen, weil ich zu Beginn versucht habe, dies mit Arrays und mathematischen Manipulationen zu tun, aber es wurde schrecklich komplex, und Regex ist für dieses Problem ein ebenso gutes Werkzeug wie jedes andere.

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

Ausgelegt wie eine vernünftige Java-Person:

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
quelle
3
like a sensible Java person Das wäre, niemals Java zu benutzen.
Katze
Andere Lösungen stellen lediglich eine Funktion bereit, die es viel kürzer machen würde. So etwas wies->s.match("(.)(?!\\1).*\\1")
Andreas
2
Aber dann konnten wir nicht in der Ausführlichkeit der Antwort schwelgen.
JamesENL
4

Pyth, 7 Bytes

{IeMrz8

Test Suite .

Maltysen
quelle
4

Ruby, 23 Bytes

Anonyme Funktion. Akzeptiert eine Zeichenfolge. Regex Strat.

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

Regex-Panne

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

!~bedeutet, wenn die Zeichenfolge keine Übereinstimmungen mit dem regulären Ausdruck enthält, return trueund andernfalls return false.

Wert Tinte
quelle
4

Mathematica, 26 Bytes

0<##&@@Sort[#&@@@Split@#]&
feersum
quelle
4

MATL, 13 11 Bytes

u"G@=fd2<vA

Danke an Luis Mendo für das Speichern von zwei Bytes!

Probieren Sie es online!

Erläuterung

        % 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
quelle
Sie können die Eingabe in Anführungszeichen setzen (standardmäßig zulässig) und entfernen j. Außerdem denke ich, dass Sie sich vAinnerhalb der Schleife bewegen und entfernen können]
Luis Mendo
@ LuisMendo Danke! Ich hatte mit dem Einsetzen Y&herumgespielt, aber das hat nicht funktioniert, weil fd2<es leer sein kann. Das Bewegen von vAinnen funktioniert aber großartig! Außerdem wünschte ich mir wirklich, wir hätten einen Stall unique, der nicht Tonnen von Bytes aufnimmt.
Suever
Jetzt nimmt stable unique etwas weniger Zeit in Anspruch und verwendet statt der vordefinierten Zeichenfolge eine Zahl. Ich kann jedoch in Zukunft eine kürzere Version hinzufügen. Oder machen uSie einfach standardmäßig stabil (Sie könnten danach immer Szwei Bytes einschließen ). Was denkst du?
Luis Mendo
3

Haskell, 44 Bytes

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

Anwendungsbeispiel: ((==)<*>nub).map head.group $ "44999911"-> True.

Eine nicht pointfree Version:

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
quelle
3

J, 8 Bytes

-:]/:i.~

Testen Sie es mit J.js .

Wie es funktioniert

-:]/: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
quelle
1
:] :i :-1
CalculatorFeline
11
Nicht sicher, ob Witz oder Golf Vorschlag ...
Dennis
3

Python, 56-55 Bytes

a=lambda s:~(s[0]in s.lstrip(s[0]))&a(s[1:])if s else 1
orlp
quelle
Scheitert in Python 3.4.1 ( int not subscriptable)
CalculatorFeline
Speichert ein zusätzliches Byte mit ~(was wörtlich gleichbedeutend ist mit 1-):a=lambda s:~(s[0]in s.lstrip(s[0]))&a(s[1:])if s else 1
CalculatorFeline
3

C #, 119 Bytes

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;
}
auhmaan
quelle
1
Willkommen bei PPCG! Anstatt einen Beitrag zu löschen und einen neuen Beitrag mit der festgelegten Version zu erstellen, können Sie auch Ihren alten Beitrag bearbeiten und anschließend wiederherstellen. (Das muss jetzt nicht mehr gemacht werden, da es sowieso schon zwei Posts gibt, aber damit Sie es in Zukunft wissen.)
Martin Ender
Mein Fehler. Als ich zum ersten Mal an diesem Code Golf teilnehmen wollte, habe ich das Ziel falsch verstanden und nicht viel Zeit gehabt, um eine andere Lösung zu finden (und ich wusste, dass ich nicht versuchen würde, die zuvor veröffentlichte Lösung zu korrigieren). Aber dann wurde mir gesagt, ich hätte noch etwas Zeit und versuchte, die "richtige Lösung" zu posten. Ich habe nicht einmal daran gedacht, das zu tun, was du gesagt hast. Nächstes Mal werde ich daran denken!
Auhmaan
Kein Problem, ich hoffe du wirst eine gute Zeit in der Community haben. :)
Martin Ender
2

Julia, 35 Bytes

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

Aus welchem ​​Grund auch immer, sortnimmt keine Zeichenfolge, issortedtut aber ...

Dennis
quelle
... Sind Strings in Julia keine unveränderlichen Arrays wie Python? Das würde mich sehr traurig machen.
Katze
1
Ja, Saiten sind unveränderlich. Das ist wahrscheinlich der Grund issorted, warum es funktioniert, aber sortnicht.
Dennis
1
Für Strings ist keine Sortiermethode definiert, aber es würde nicht funktionieren, wenn sie auf die gleiche Weise wie eindimensionale Arrays verarbeitet würden, da diese sortiert werden, indem eine In-Place-Sortierung einer Kopie durchgeführt wird. Saiten sind unveränderlich. Es ist jedoch kein Problem, auf sortierte Reihenfolge zu prüfen, da es als einfache Schleife über eine iterable implementiert ist, was für Zeichenfolgen in Ordnung ist. Nur ein paar Kleinigkeiten. ¯ \ _ (ツ) _ / ¯
Alex A.
@AlexA. So sehr wie Python in der Tat; Der Unterschied besteht darin, dass Pythons eingebautes sortedArgument zuerst in eine veränderbare Liste umgewandelt wird. Aus diesem Grund wird sorted(string)eine Liste mit Zeichenfolgen zurückgegeben
cat
2

Faktor 22 Bytes

[ dup natural-sort = ]

Tut was es verspricht. Als anonyme Funktion sollten Sie calldies tun oder es zu einer machen : word ;.

Katze
quelle
4
es macht mir
angst
@downrep_nation: P
cat
2

Lua, 107 94 85 Bytes

Dank @LeakyNun 13 Bytes gespart

Zumindest schlägt es Java: D. Lua hat Spaß daran, Saiten zu manipulieren, aber ich denke, es ist gut genug :).

Es nimmt seine Eingabe als Befehlszeilenargument und gibt sie 1für wahrheitsgemäße und falsefür falsch aus. Jetzt wird mit seinem Exit-Code ausgegeben. Beenden Sie den Code 0 für "Wahr" und 1 für "Falsch"

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

Ungolfed

Seien Sie vorsichtig, es gibt zwei Magic-Variablen ..., die aufgerufen werden. Die erste enthält das Argument des Programms, die zweite ist lokal für die anonyme Funktion und enthält ihre Parameter

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
quelle
Wenn es erlaubt ist, können Sie ersetzen os.exit()mit i=#0...
Leaky Nonne
1

JavaScript ES6, 71 69 Bytes

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

Oder äquivalent:

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

Golfen im Gange.

Überprüfen Sie die Testfälle

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
quelle
1

C # 111 Bytes

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

alte Strategie 131 Bytes

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

Ich glaube, ich habe das erste Mal gut gespielt

downrep_nation
quelle
1

C 74, 73 71 Bytes

Rasiert ein Drei-Byte dank @xsot!

a[99],c,m;main(d){for(;~c;m|=c^d&&a[d=c]++)c=getchar();putchar(48+!m);}
mIllIbyte
quelle
a[99]Ich liebe Perls Autovivifizierung! Oh, warte ...
Katze
Ich denke, das funktioniert:a[99],c,m;main(d){for(;~c;m|=a[d=c]+=c!=d)c=getchar();putchar(48+1/m);}
Xsot
@xsot - Vielen Dank für das Rasieren eines Byte durch den Ersatz !--mmit 1/m. Über a[d=c]+=c!=dhabe ich versucht , es mit gcc und es nicht wegen der Reihenfolge der Auswertung auf meinem Computer nicht funktioniert. Wir müssen einen Compiler finden, der mitspielt.
MIllIbyte
Oh, ich habe es gerade auf ideone getestet und es hat gut funktioniert. Wie wäre es damit: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

Verwendet den gleichen Ansatz wie die MATL-Antwort von Luis Mendo : für jeden Eintrag einen Vektor, dessen Indizes diesem entsprechen, und überprüft, ob das Ergebnis in absteigender Reihenfolge sortiert ist.

(<$>l).(==)<$>list eine kürzere Version von [map(==a)l|a<-l]. Die Funktion , (<$>l).(==)die nimmt azu map(==a)lwird gemapptl .

scanl1 minNimmt die kumulativ kleinsten Elemente von auf l, was dem Original nur entspricht, wenn les rücksortiert ist.(==)=<<prüft, ob die Liste bei dieser Operation tatsächlich unveränderlich ist.


Eine andere rekursive Strategie ergab 40 Bytes:

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

Dadurch wird jedes Suffix überprüft, um festzustellen, ob sein erstes Element im Rest nicht erscheint. Dies entschuldigt Fälle, in denen die ersten beiden Elemente als Teil eines zusammenhängenden Blocks gleich sind.

xnor
quelle
1

Schläger, 53 Bytes

Die dumme, einfache 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)))

Schläger, 86 Bytes

Hier ist die Version, die den Kommentar von @ xnor zu effizienteren Methoden implementiert .

(λ(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, dies kann das Gewicht der Berechnung tatsächlich von der sortFunktion auf verschieben regexp-replace, aber es war eine interessante Lösung. Im Grunde ist es entfernt Läufe von doppelten Zeichen zuerst ( siehe hier ), prüft dann , ob die verbleibende Länge-1 läuft in sortierter Art und Weise ist.

Katze
quelle
1

Perl 5, 20 Bytes

19, plus 1 für -pestatt -e.

$_=!/(.)(?!\1).+\1/
msh210
quelle
1

Wolfram Language (Mathematica) , 18 Byte

Gather@#==Split@#&

Probieren Sie es online!

Gathersammelt eine Liste in Unterlisten identischer Elemente und Splitteilt sie in Unterlisten aufeinanderfolgender identischer Elemente auf. Sie liefern genau dann das gleiche Ergebnis, wenn jeder Wert nur in einem zusammenhängenden Block vorkommt.

Mischa Lawrow
quelle
0

Japt , 9 Bytes

ò¦ mÌ
eUâ

Versuch es


Erläuterung

          :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
Zottelig
quelle