Tous ensemble maintenant

24

Étant donné une liste de chiffres 1 à 9, indiquez si chaque chiffre est regroupé en un seul bloc contigu. En d'autres termes, aucun deux du même chiffre n'est séparé par des chiffres différents. C'est OK si un chiffre n'apparaît pas du tout. Le moins d'octets gagne.

Entrée: liste non vide de chiffres de 1 à 9. Il peut s'agir d'un nombre décimal, d'une chaîne, d'une liste ou d'une séquence similaire.

Sortie: une valeur Truthy cohérente si tous les chiffres sont regroupés dans des blocs contigus, et une valeur Falsey cohérente s'ils ne le sont pas.

Vrais cas:

3
51
44999911
123456789
222222222222222222222

Faux cas:

818
8884443334
4545
554553
1234567891

xnor
la source
2
Une liste de chaînes singleton serait-elle un format d'entrée acceptable?
Dennis
Oui, les singletons vont bien.
xnor
Quelqu'un peut-il me dire quel serait l'algorithme le plus efficace pour ce problème? Ou y a-t-il un problème plus général que cela relève et que je puisse rechercher?
@ amt528 Vous pouvez le faire en temps linéaire en itérant sur chaque chiffre et en vérifiant qu'il n'y en a pas après le premier.
xnor
Pourriez-vous donner un exemple de la façon dont il est mis en œuvre?

Réponses:

18

Python 3, 38 34 33 octets

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

Cela attend une liste de chiffres ou de chaînes singleton comme argument. Testez-le sur Ideone .

Merci à @xsot d'avoir joué au golf sur 4 octets!

Merci à @immibis d'avoir joué au golf sur 1 octet!

Dennis
la source
Si vous êtes autorisé à accepter une liste de chaînes à la place, vous pouvez la raccourcir àlambda s:s==sorted(s,key=`s`.find)
xsot
Ah, j'ai essayé de prendre une liste, mais je n'ai pas pensé à utiliser des backticks ... Je vais demander au PO.
Dennis
Suis-je en train de manquer quelque chose - pourquoi ne pouvez-vous pas simplement l'utiliser s.find?
user253751
@immibis sdoit être une liste de chaînes singleton (ou je devrais lancer spour lister pour la comparaison), et list.findn'est pas défini ...
Dennis
@Dennis s.indexalors? Semble fonctionner pour moi.
user253751
14

JavaScript (ES6), 27 octets

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

Utilise l'anticipation négative pour rechercher deux chiffres non contigus. S'il existe au moins deux de ces chiffres, ils peuvent être choisis de sorte que le premier chiffre précède un autre chiffre.

Neil
la source
1
Ou, utilisez simplement un regex XD. Ça marche aussi.
Conor O'Brien
1
ahem Retina ahem
John Dvorak
13

05AB1E , 4 octets

Code:

Ô¹ÙQ

Explication:

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

Utilise CP-1252 encodage .

Essayez-le en ligne!

Adnan
la source
2
Vous ... venez de battre la gelée ... Je n'ai jamais pensé que c'était possible ...
Bálint
11

Gelée , 5 octets

ĠIFPỊ

Essayez-le en ligne!

Comment ça marche

Ġ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
la source
Vous dites cinq octets? De quel type d'encodage s'agit-il?
John Dvorak
4
Jelly a sa propre page de codes , qui code chacun des 256 caractères qu'elle comprend comme un seul octet.
Dennis
9

Pyth, 6 5 octets

1 octets grâce à FryAmTheEggman

SIxLQ

Inspiré par la solution Python ici .

Suite de tests

Explication:

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
la source
3
SIxLQsemble fonctionner.
FryAmTheEggman
C'est génial.
Maltysen
1
La seconde Qne semble pas être analysée correctement, elle échange l'ordre des arguments ou quelque chose pour que vous obteniez tous les 0s et cela donne toujours la vérité. Voici une suite de tests.
FryAmTheEggman
8

R, 66 48 46 43 43 octets

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

Il s'agit d'une fonction qui accepte l'entrée en tant que vecteur de chiffres et renvoie un booléen. Pour l'appeler, affectez-le à une variable.

Pas le plus court mais j'ai pensé que c'était une approche amusante. Nous exécutons la longueur encoder l'entrée et extraire les valeurs. Si la liste de valeurs contient des doublons FALSE, retournez , sinon retournez TRUE.

Vérifiez tous les cas de test en ligne

Économisé 20 octets grâce à MickyT, 3 grâce à Albert Masclans et 5 grâce à mnel!

Alex A.
la source
7

MATL , 8 octets

t!=tXSP=

La sortie est un tableau contenant uniquement des valeurs pour true, ou un tableau contenant au moins un zéro pour falsey.

Essayez-le en ligne!

Explication

Considérez l'entrée 22331, qui satisfait la condition. Tester si chaque caractère est égal donne le tableau 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

Le résultat final doit être véridique si les lignes de ce tableau (considérées comme atomiques) sont en ordre décroissant (lexicographique) . Pour comparaison, l'entrée 22321donne le tableau

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

dans lequel les lignes ne sont pas triées.

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
la source
5

Rétine , 17 octets

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

Essayez-le en ligne! (Légèrement modifié pour exécuter tous les cas de test en même temps.)

La première expression régulière correspond aux chiffres qui sont séparés par d'autres chiffres, nous obtenons donc un 0pour les entrées valides et n'importe où entre 1et 9pour les entrées non valides (en raison de la cupidité du .+, nous ne pouvons pas obtenir plus de n-1correspondances pourn différents chiffres).

Pour inverser la véracité du résultat, nous comptons le nombre de 0s, qui est 1pour les entrées valides et 0pour celles invalides.

Martin Ender
la source
J'en ai fait un plus court, mais il est assez proche du vôtre pour qu'il soit plutôt un commentaire. Utilisez AntiGrep au lieu de Match, puis supprimez la dernière ligne: A`(.)(?!\1).+\1pour 15 octets. Fonctionne également pour plusieurs entrées. La vérité est l'entrée, la fausse n'est rien. On ne se contente pas de jouer au golf avec Martin dans sa propre langue. :)
mbomb007
@ mbomb007 Je pense que j'ai réellement considéré cela, mais malheureusement, le défi demande une valeur cohérente de vérité (et de fausse), donc l'impression de l'entrée en tant que vérité n'est pas autorisée.
Martin Ender
5

Java, 161 156 octets

Parce que Java ...

Voler sans vergogne en empruntant l'expression rationnelle à cette réponse parce que j'ai commencé à essayer de le faire avec des tableaux et des manipulations mathématiques, mais cela est devenu horriblement complexe, et l'expression régulière est un outil aussi bon que n'importe lequel pour ce problème.

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

Non golfé:

import java.util.regex.*;

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

Dispose comme une personne Java sensée:

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
la source
3
like a sensible Java personCe serait, ne jamais utiliser Java.
chat
D'autres solutions fournissent simplement une fonction, la rendraient beaucoup plus courte. Quelque chose commes->s.match("(.)(?!\\1).*\\1")
Andreas
2
Mais alors nous ne pouvions pas nous délecter de la verbosité de la réponse.
JamesENL
4

Rubis, 23 octets

Fonction anonyme. Accepte une chaîne. Regex strat.

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

Ventilation des 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

!~signifie s'il n'y a aucune correspondance de l'expression rationnelle dans la chaîne, retourne trueet retourne autrement false.

Encre de valeur
la source
4

Mathematica, 26 octets

0<##&@@Sort[#&@@@Split@#]&
feersum
la source
4

MATL, 13 11 octets

u"G@=fd2<vA

Merci à Luis Mendo d' avoir sauvé deux octets!

Essayez-le en ligne!

Explication

        % 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
la source
Vous pouvez prendre l'entrée avec des guillemets (autorisés par défaut) et supprimer j. En outre, je pense que vous pouvez vous déplacer vAdans la boucle et supprimer]
Luis Mendo
@LuisMendo Merci! J'avais gâché de mettre à l' Y&intérieur mais cela n'a pas fonctionné car fd2<peut être vide. Se déplacer à l' vAintérieur fonctionne très bien! De plus, je souhaite vraiment que nous ayons une écurie uniquequi ne prenne pas des tonnes d'octets.
Suever
Maintenant stable unique prend un peu moins, en utilisant un nombre au lieu de la chaîne prédéfinie. Je pourrai peut-être ajouter une version plus courte à l'avenir. Ou tout simplement rendre ustable par défaut (vous pouvez toujours inclure Sensuite, deux octets). Qu'est-ce que tu penses?
Luis Mendo
3

Haskell, 44 octets

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

Exemple d'utilisation: ((==)<*>nub).map head.group $ "44999911"->True .

Une version sans 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
la source
3

J, 8 octets

-:]/:i.~

Testez-le avec J.js .

Comment ça marche

-:]/: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
la source
1
:] :i :-1
CalculatorFeline
11
Je ne sais pas si une blague ou une suggestion de golf ...
Dennis
3

Python, 56 55 octets

a=lambda s:~(s[0]in s.lstrip(s[0]))&a(s[1:])if s else 1
orlp
la source
Échoue dans Python 3.4.1 ( int not subscriptable)
CalculatorFeline
Enregistré un octet supplémentaire avec ~(qui est littéralement équivalent à 1-):a=lambda s:~(s[0]in s.lstrip(s[0]))&a(s[1:])if s else 1
CalculatorFeline
3

C #, 119 octets

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

Non golfé

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
la source
1
Bienvenue chez PPCG! Au lieu de supprimer un message et d'en créer un nouveau avec la version fixe, vous pouvez également modifier votre ancien message, puis le supprimer. (Inutile de le faire maintenant qu'il y a déjà deux articles de toute façon, mais juste pour que vous le sachiez à l'avenir.)
Martin Ender
Ma faute. Quand j'ai eu l'intention de participer à ce Code Golf pour la première fois, j'ai mal lu l'objectif et je n'ai pas eu beaucoup de temps pour faire une autre solution (et en me connaissant, je n'essaierais pas de corriger la solution publiée précédemment). Mais ensuite, on m'a dit que j'avais plus de temps libre et j'ai essayé de publier la "bonne solution". Je n'ai même pas pensé à faire ce que tu as dit. La prochaine fois, j'aurai ça à l'esprit!
auhmaan
Pas de problème du tout, j'espère que vous passerez un bon moment dans la communauté. :)
Martin Ender
2

Julia, 35 octets

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

Pour une raison quelconque, sortne prend pas de chaîne, mais issorted...

Dennis
la source
... Les chaînes ne sont-elles pas des tableaux immuables en Julia comme Python? Cela me rendrait vraiment triste.
chat
1
Oui, les chaînes sont immuables. C'est probablement pourquoi ça issortedmarche, mais sortça ne marche pas.
Dennis
1
Il n'y a pas de méthode de tri définie pour les chaînes, mais cela ne fonctionnerait pas si elles étaient traitées de la même manière que les tableaux unidimensionnels, car ceux-ci sont triés en effectuant un tri sur place d'une copie, et comme vous l'avez dit, les chaînes sont immuables. Ce n'est pas un problème pour vérifier l'ordre trié, car il est implémenté comme une simple boucle sur un itérable, ce qui est bien pour les chaînes. Juste quelques anecdotes. ¯ \ _ (ツ) _ / ¯
Alex A.
@AlexA. Donc , très peu comme Python en fait; la différence est que la fonction intégrée de Python sortedtransforme d'abord son argument itérable en une liste mutable - c'est pourquoi sorted(string)renvoie une liste de chaînes
cat
2

Facteur, 22 octets

[ dup natural-sort = ]

Fait ce qu'il dit sur l'étain. En tant que fonction anonymouse, vous devriez le callfaire ou en faire un : word ;.

chat
la source
4
ça me fait peur quand un chat fait entrer une souris dans le jeu
downrep_nation
@downrep_nation: P
cat
2

Lua, 107 94 85 octets

13 octets enregistrés grâce à @LeakyNun

Au moins, il bat Java: D. Lua craint de manipuler les cordes, mais je pense que c'est assez bon :).

Il prend son entrée en tant qu'argument de ligne de commande et sort 1pour les cas véridiques et les cas falsefausses.Sort maintenant en utilisant son code de sortie. Quittez le code 0 pour la vérité et 1 pour la fausse

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

Non golfé

Attention, il y a deux variables magiques appelées ..., la première contient l'argument du programme, la seconde est locale à la fonction anonyme et contient ses paramètres

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
la source
Si cela est autorisé, vous pouvez le remplacer os.exit()par i=#0...
Leaky Nun
1

JavaScript ES6, 71 69 octets

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

Ou é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

Golf en cours.

Vérifier les cas de test

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
la source
1

C # 111 octets

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

ancienne stratégie 131 octets

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

premier golf, je pense que je l'ai fait ok

downrep_nation
la source
1

C, 74 73 71 octets

Rasé d' un octet grâce à @xsot!

a[99],c,m;main(d){for(;~c;m|=c^d&&a[d=c]++)c=getchar();putchar(48+!m);}
mIllIbyte
la source
a[99]J'adore l'autovivification de Perl! Oh, attendez ...
chat
Je pense que cela fonctionne:a[99],c,m;main(d){for(;~c;m|=a[d=c]+=c!=d)c=getchar();putchar(48+1/m);}
xsot
@xsot - Merci d'avoir rasé un octet en le remplaçant !--mpar 1/m. À propos a[d=c]+=c!=d, je l'ai essayé avec gcc et cela n'a pas fonctionné sur mon ordinateur en raison de l'ordre d'évaluation. Nous devons trouver un compilateur qui jouera.
mIllIbyte
Oh, je viens de le tester sur ideone et cela a bien fonctionné. Que diriez-vous de ceci:a[99],c,m;main(d){for(;~c;m|=c^d&&a[d=c]++)c=getchar();putchar(48+!m);}
xsot
1

Haskell, 37 octets

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

Utilise la même approche que la réponse MATL de Luis Mendo : crée un vecteur pour chaque entrée qui les indexe égal et vérifie que le résultat est trié par ordre décroissant.

(<$>l).(==)<$>lest une version plus courte de [map(==a)l|a<-l]. La fonction (<$>l).(==)qui prend aà map(==a)lest mappé sur l.

scanl1 minprend les plus petits éléments cumulatifs de l, ce qui n'est égal à l'original que s'il lest trié en sens inverse. (==)=<<vérifie si la liste est bien invariante sous cette opération.


Une stratégie récursive différente a donné 40 octets:

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

Cela vérifie chaque suffixe pour voir si son premier élément n'apparaît pas dans le reste, excusant les cas où les deux premiers éléments sont égaux dans le cadre d'un bloc contigu.

xnor
la source
1

Raquette, 53 octets

La version stupide et simple.

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

Non golfé:

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

Raquette, 86 octets

Voici la version mettant en œuvre le commentaire de @ xnor sur des moyens plus efficaces de le faire.

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

Non golfé:

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

D'accord, cela peut simplement déplacer le poids du calcul de la sortfonction vers regexp-replace, mais c'était une solution intéressante. En gros, il supprime pistes de caractères en double première ( voir ici ), puis il vérifie si la longueur-1 restantes pistes sont à la mode tri.

chat
la source
1

Perl 5, 20 octets

19, plus 1 pour -peau lieu de -e.

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

Wolfram Language (Mathematica) , 18 octets

Gather@#==Split@#&

Essayez-le en ligne!

Gatherrassemble une liste en sous-listes d'éléments identiques et Splitdivise une liste en sous-listes d'éléments identiques consécutifs. Ils donnent le même résultat si et seulement si chaque valeur apparaît dans un seul bloc contigu.

Misha Lavrov
la source
0

Japt , 9 octets

ò¦ mÌ
eUâ

Essayez-le


Explication

          :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
Hirsute
la source