Aidez-moi à faire ma lessive

21

Aidez-moi! ma lumières complètement automatisées de Darks Separator V3001.01 sont tombées en panne! :(

Des lignes directrices


Tâche

Écrivez un programme qui prendra une entrée d'un tableau (ou une liste dans certaines langues) de n'importe quelle quantité de chaînes qui sont soit la lettre L ou la lettre D (représentant des lumières ou des ténèbres) et produira un tableau qui contient deux tableaux, un avec tous les L et un avec tous les D.


Règles

  • C'est le golf de code, donc la réponse la plus courte en octets l'emporte
  • L'entrée ne contiendra que des majuscules
  • Il doit y avoir le même nombre de L dans la sortie que dans l'entrée, il en va de même pour les D
  • L'entrée ne peut avoir qu'un seul élément (ou peut-être même zéro élément)
  • Si l'un ou les deux tableaux de sortie ne contiennent aucun élément, affichez une liste vide (dans certaines langues, cela peut signifier que vous devez générer une chaîne)
  • Le premier tableau doit toujours être le tableau des L

Exemple de sortie:

["L","D","L","D","D"] -> [["L","L"],["D","D","D"]]

["L","L","L"] -> [["L","L","L"],[]]

["D","D"] -> [[],["D","D"]]

[] -> [[],[]]

Amorris
la source
3
Pouvons-nous entrer / sortir comme une chaîne? Par exemple: "LDLDD" -> "LL DDD"ou quelque chose comme ça?
Camarade SparklePony
3
Ou sortie peut-être sous la forme d'une liste des deux chaînes, par exemple "" LDLDD "-> [" LL "," DDD "]
Camarade SparklePony
J'aimerais aussi une réponse, car ma réponse en dépend
Skidsdev
Que diriez-vous d'une sortie mixte? Comme dans un tableau contenant une chaîne et un tableau de chaînes? par exemple ["L","L",["D","D","D"]].
Shaggy
Non, la sortie doit être un tableau / liste. @ComradeSparklePony
Amorris

Réponses:

12

APL, 8 octets

'DL'~⍨¨⊂

Explication:

  • : entrée fermée
  • ~⍨¨: sans chacun
  • 'DL': «D» et «L»

Exemples:

      ('DL'~⍨¨⊂) 'LDLDD'
┌──┬───┐
│LL│DDD│
└──┴───┘
      ('DL'~⍨¨⊂) 'LLL'
┌───┬┐
│LLL││
└───┴┘
      ('DL'~⍨¨⊂) 'DD'
┌┬──┐
││DD│
└┴──┘
      ('DL'~⍨¨⊂) ''
┌┬┐
│││
└┴┘
marinus
la source
Pourquoi est-ce 'DL'mais pas 'LD'?
Leaky Nun
@LeakyNun: explication ajoutée. Cela fonctionne en supprimant le mauvais caractère plutôt qu'en sélectionnant le bon.
marinus
1
'LD'∩⍨¨⊂ou ⍞∘∩¨'LD'peut être plus facile à expliquer.
Adám
4

PHP, 46 octets

La liste donnée supposée est: $arr = ['L','L','D','D','L','D','D','D','D','L'];

foreach($arr as $b){$a[$b][]=$b;};print_r($a);

ScottMcGready
la source
3
En tant que règle d'E / S par défaut, vous ne pouvez pas supposer que l'entrée est stockée dans une variable
Keyu Gan
@KeyuGan argh! Assez juste
ScottMcGready
2
Use peut utiliser à la $argvplace de $arret s'attendre à ce que le script soit exécuté à partir de la ligne de commande en tant que php -f golf.php L L D D L D D D D L- mais là encore, vous devez faire le tour de $ argv [0] qui est le nom du fichier
Ezenhis
1
de cette façon, les solutions les plus courtes sont for(;$b=$argv[++$i];)$a[$b][]=$b;print_r($a);ou<?foreach($_GET as$b)$a[$b][]=$b;print_r($a);
Jörg Hülsermann
Ma première tentative de golf après des années et je suis toujours un amateur total! Merci pour les commentaires (et les votes positifs) bien que tout le monde :)!
ScottMcGready
3

Mathematica, 27 octets

Rest/@Gather[{L,D}~Join~#]&

Fonction pure prenant une liste de Ls et Ds (symboles, pas des caractères / chaînes) en entrée et renvoyant une liste de deux listes. Par exemple,

Rest/@Gather[{L,D}~Join~#]& @ {D, L, L, D, L}

retourne {{L, L, L}, {D, D}}. Essayez-le en ligne!

Gatheren soi est proche de ce que nous voulons, mais ne répond pas à la spécification de deux manières: il ne produit pas de listes vides si l'entrée manque Ls ou Ds, et il ne trie pas toujours Ls vers la gauche. Le remplacement de l'entrée #par {L,D}~Join~#résout les deux problèmes à la fois: cela signifie qu'il y aura au moins un Let au moins un D, et les Ls seront retournés en premier car un a Lété rencontré en premier. Rest/@supprime ensuite l'initiale LetD .

(J'ai essayé une solution en utilisant Count, mais en raison de problèmes de curry, elle ne semblait pas être plus courte: ±q_:=#~Table~Count[q,#]&/@{L,D}31 octets.)

Greg Martin
la source
Lien TIO (mathématiques)?
Leaky Nun
1
Et Cases@@@{{#,L},{#,D}}&pour 22 octets?
Pas un arbre le
Excellente idée, pas un arbre! Vous devriez poster cette réponse — je voterai positivement :)
Greg Martin
Terminé!
Pas un arbre
3

Haskell, 32 octets

import Data.List
partition(>"K")

Juste une fonction de bibliothèque ennuyeuse.

Essayez-le en ligne!

nimi
la source
1
Essayez sans importation: P
Amorris
2

PHP7, 52 45 octets

-7 octets grâce à @ Jörg Hülsermann

foreach($argv as$a)$$a[]=$a;print_r([$L,$D]);

Utiliser avec CLI en tant que php -r a.php L L L D D L D

Le script passe en revue les arguments fournis et les ajoute à un tableau en fonction de sa valeur.

Ezenhis
la source
1
45 octets avec l' -roption using au lieu de -fsupprimer <?phpet de supprimer l'espace après leas
Jörg Hülsermann
2

Lisp commun, 66 65 octets

(defun f(x)`(,(remove"D"x :test'equal),(remove"L"x :test'equal)))

Essayez-le en ligne!

Si, au lieu de chaînes, nous utilisons des symboles, alors c'est beaucoup plus court:

Lisp commun, 42 41 40 octets

(defun f(x)(mapcar'remove'(D L)`(,x,x)))

Essayez-le en ligne!

(f '(D D L L D L D)) ; => ((L L L) (D D D D)) 
Renzo
la source
2

Raquette , 48 octets

(compose list((curry partition)(λ(x)(eq? x'L))))

Il suffit d'appliquer cette fonction anonyme à, par exemple, '(L D L D D L)

Majora320
la source
2

Mathematica, 22 18 octets

4 octets économisés par le génie de CalculatorFeline!

Cases@@@{#|L,#|D}&

Essayez-le en ligne ou dans le bac à sable Wolfram !

Input is a list of the symbols L and D — not strings, just the letters on their own, like in Greg Martin's answer. The syntax #|L is shorthand for Alternatives[#,L], but the @@@ syntax replaces the head Alternatives with Cases, so this code is equivalent to {Cases[#,L],Cases[#,D]}&.

Not a tree
la source
1
{#,x} can be #|x for -4 bytes.
CalculatorFeline
@CalculatorFeline, wow, that trick is amazing! Thank you!
Not a tree
1
@@ and @@@ work with any head, not just List. If | doesn't work, you can still save in some cases with &&, ||, or **.
CalculatorFeline
You can also use . and arithmetic operators.
CalculatorFeline
Also, precedence abuse has more savings for you (with an output format change): #.L|#.D
CalculatorFeline
2

Java 8, 105 bytes

import java.util.stream.*;a->Stream.of(a).collect(Collectors.groupingBy("D"::equals)).values().toArray();

Tips welcome.


New to PPCG, do I have to include import java.util.*;import java.util.stream.*; in the byte count?


Non-competing, it doesn't create empty lists with an empty input. Thanks to Nevay for saving some bytes.

Justin
la source
2
Imports do have to be counted, or you can fully-qualify your class names if that is shorter.
1
You can use Stream#of instead of Arrays#stream to reduce the imports to java.util.stream.* and "D"::equals instead of k->k.equals("D"). Besides that the code doesn't meet the requirements as it does not output an empty list if no L/D is present (test-cases 2-4).
Nevay
Welcome to PPCG! Unfortunately, invalid answers cannot be marked as non-competing. You're welcome to modify this answer to make it valid, but for now, it should be deleted. (You should probably delete it yourself; if a mod deletes it, you can't undelete it yourself once you have a working solution.)
Esolanging Fruit
2

Prolog (SWI), 42, 37 bytes

l('L').
w(L,D,W):-partition(l,W,L,D).

Try it online!

Given that W is a list of washing, w/3 will unify L and D into lists of Lights and Darks respectively, by partitioning the washing against a predicate which succeeds if an item is a Light.

[Edit: golfed -5 thanks to Fatalize]

TessellatingHeckler
la source
1
l('L'). is 5 bytes shorter than l(X):-X='L'.
Fatalize
@Fatalize - thanks! Edited in.
TessellatingHeckler
2

Japt, 13 12 10 bytes

2Æf¥"LD"gX

Test it (-Q flag for visualisation purposes only)


Explanation

Implicit input of array U.

Generate the array [0,1] and pass each element through a function, with X being the current element.

Filter U by checking for equality...

"LD"gX

...with the character in string LD at index X.

Shaggy
la source
"Hmm, removing the ¥ should work..." [["L","L","D","D"],[]] "Nope, not going there :)" - me 2017
ETHproductions
@ETHproductions: Ha-ha! Yeah, I tried so many ways to try to get it to work without the ¥.
Shaggy
1

Javascript (ES6), 37 bytes

This is based on a (now deleted) Javascript (ES6) answer.

a=>[(b=c=>a.filter(d=>c==d))`L`,b`D`]

Ungolfed version:

function(array) {
  function filter(character){
    return array.filter(function(d) {
      return character == d;
    });
  }
  return [filter("L"), filter("D")];
}

Example code snippet:

f=

a=>[(b=c=>a.filter(d=>c==d))`L`,b`D`]

console.log(f(["L", "D", "L", "D", "D"]))

Herman L
la source
1

C#, 61 bytes

using System.Linq;a=>new[]{a.Where(c=>c<69),a.Where(c=>c>68)}

Full/Formatted Version:

using System;
using System.Linq;

class P
{
    static void Main()
    {
        Func<char[], System.Collections.Generic.IEnumerable<char>[]> f =
            a => new[] { a.Where(c => c < 69), a.Where(c => c > 68) };

        Console.WriteLine(string.Join(", ", f(new[]{ 'L', 'D', 'L', 'D', 'D' }).SelectMany(a => a.Select(c => c))));

        Console.ReadLine();
    }
}
TheLethalCoder
la source
1

F#, 37 bytes

let f s=List.partition(fun a->a="L")s

Try it online!

Takes input as a list of strings, and returns two lists, the first with elements where fun a -> a="L" is true and the other with elements that result in false.


la source
1

Jelly, 10 bytes

ẎfЀ⁾LDW€€

Try it online!

In Jelly a string is a list of 1-char Python strings, e.g. ['a', 'b', 'c']. That's why you get output such as [[['L'], ['L']], [['D'], ['D'], ['D']]], since 1-char Jelly strings behave the same.

Doesn't work as a full program, hence the ÇŒṘ at the bottom.

Erik the Outgolfer
la source
@Leo Hmm, you may be right...fixed.
Erik the Outgolfer
It seems Jelly input is different from Jelly output? Does the interpreter do string->char[] automagically?
nmjcman101
1
@nmjcman101 On strings it's different, since input is in Python format and output is in Jelly format. That's why I need the W€€ part.
Erik the Outgolfer
1

Perse, 21 bytes

part(i,fn(x){x=="L"})

I may or may not have implemented the list partition function specifically for this challenge. Takes the input as an array of strings.

faso
la source
1

Husk, 7 bytes

Mof-"DL

Try it online!

Explanation

Mof-"DL
M   "DL    For each character in ['D','L']:
 of-         keep only those strings that are not empty if that character is removed
Leo
la source
1

Java 8, 110 106 bytes

a->{String[]r={"",""};for(char c:a)r[c/69]+=c;return new char[][]{r[1].toCharArray(),r[0].toCharArray()};}

-4 bytes thanks to @Nevay.

Explanation:

Try it here.

a->{                      // Method with char-array parameter and 2D char-array return-type
  String[]r={"",""};      //  Two Strings in an array
  for(char c:a)           //  Loop over the characters of the input
    r[c/69]+=c;           //   Append either of the two String with the character
                          //   c/69 will result in 0 for 'D' and 1 for 'L'
                          //  End of loop (implicit / single-line body)
  return new char[][]{    //  Return a 2D character-array
    r[1].toCharArray(),   //   With the String for L's converted to a char-array
    r[0].toCharArray()};  //   and String D's converted to a char-array
}                         // End of method
Kevin Cruijssen
la source
1
You can store l and d in an array to remove the if-else statement. a->{String[]r={"",""};for(char c:a)r[c/69]+=c;return new char[][]{r[1].toCharArray(),r[0].toCharArray()};} (-4 bytes)
Nevay
1

Octave, 21 bytes

@(A){A(a=A>72),A(~a)}

Input is an array of characters, output is a cell array. Recycled from my answer here.

Sample execution on ideone.

beaker
la source
1

Julia, 26 bytes

g(s)=s[s.=="L"],s[s.=="D"]
Tanj
la source
0

PowerShell, 27 bytes

($args-eq'L'),($args-eq'D')

Try it online!


Edit: previously $args.where({$_-eq'L'},'sp') for 28 bytes. Could be $args.where({+"0x$_"},'sp') for 27 if not for the rule that L's must come first.

TessellatingHeckler
la source
0

CJam, 14 bytes

"LD"qf{1$e=*}`

Input is a list of characters (string), output is a list of lists of characters (list of strings).

Try it online!

Explanation:

"LD"  e# Push the string "LD"                  | "LD"
q     e# Push the input                        | "LD" "LDLLDLDDL"
f{    e# Foreach char in "LD", push input and: | ['L "LDLLDLDDL"
  1$  e#   Copy from 1 back                    | ['L "LDLLDLDDL" 'L
  e=  e#   Count occurences                    | ['L 5
  *   e#   Repeat character                    | ["LLLLL"
}     e# End                                   | ["LLLLL" "DDDD"]
`     e# Stringify:                            | "[\"LLLLL\" \"DDDD\"]"
e# Implicit output: ["LLLLL" "DDDD"]
Esolanging Fruit
la source