Pomóż mi zrobić pranie


21

Wsparcie! Mój całkowicie zautomatyzowany system Lights From Darks Separator V3001.01 zepsuł się! :(

Wytyczne


Zadanie

Napisz program, który pobierze tablicę (lub listę w niektórych językach) dowolnej liczby ciągów znaków, które są albo literą L, albo literą D (reprezentującą światła lub ciemności) i wypisze tablicę zawierającą dwie tablice, jedną ze wszystkimi literami L i jednym ze wszystkimi literami D.


Zasady

  • To kod golfowy, więc wygrywa najkrótsza odpowiedź w bajtach
  • Wkład zawsze będzie zawierał tylko wielkie litery
  • Na wyjściu musi być taka sama liczba L, jak na wejściu, to samo dotyczy liter D.
  • Dane wejściowe mogą zawierać tylko jeden element (a może nawet zero elementów)
  • Jeśli jedna lub obie tablice wyjściowe nie zawierają żadnych elementów, wypisz pustą listę (w niektórych językach może to oznaczać, że musisz wygenerować ciąg)
  • Zawsze miej pierwszą tablicę jako tablicę L.

Przykładowe dane wyjściowe:

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

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

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

[] -> [[],[]]


3
Czy możemy wprowadzić / wyprowadzić jako ciąg? Na przykład: "LDLDD" -> "LL DDD"czy coś takiego?
Towarzysz SparklePony,

3
Lub dane wyjściowe być może jako lista dwóch ciągów, np. „LDLDD” -> [„LL”, „DDD”]
towarzysz SparklePony

Chciałbym również odpowiedź, ponieważ moja odpowiedź zależy od tego
Skidsdev

Co powiesz na produkcję mieszaną? Jak w tablicy zawierającej jeden ciąg i jedną tablicę ciągów? np ["L","L",["D","D","D"]].
Kudłaty

Nie, wynikiem musi być tablica / lista. @ComradeSparklePony
Amorris

Odpowiedzi:


12

APL, 8 bajtów

'DL'~⍨¨⊂

Wyjaśnienie:

  • : załączone wejście
  • ~⍨¨: bez każdego
  • 'DL': „D” i „L”

Przykłady:

      ('DL'~⍨¨⊂) 'LDLDD'
┌──┬───┐
│LL│DDD│
└──┴───┘
      ('DL'~⍨¨⊂) 'LLL'
┌───┬┐
│LLL││
└───┴┘
      ('DL'~⍨¨⊂) 'DD'
┌┬──┐
││DD│
└┴──┘
      ('DL'~⍨¨⊂) ''
┌┬┐
│││
└┴┘

Dlaczego tak jest, 'DL'ale nie 'LD'?
Leaky Nun

@LeakyNun: dodano wyjaśnienie. Działa poprzez usunięcie niewłaściwego znaku zamiast wybierania właściwego.
marinus,

1
'LD'∩⍨¨⊂lub ⍞∘∩¨'LD'może być łatwiejsze do wyjaśnienia.
Adám



4

PHP, 46 bajtów

Zakładana podana lista to: $arr = ['L','L','D','D','L','D','D','D','D','L'];

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


3
Jako domyślna reguła We / Wy nie można zakładać, że dane wejściowe są przechowywane w jednej zmiennej
Keyu Gan

@KeyuGan argh! W
porządku

2
Use może używać $argvzamiast $arri oczekiwać, że skrypt będzie uruchamiany z wiersza poleceń, ponieważ php -f golf.php L L D D L D D D D L- ale znowu musisz przejść do $ argv [0], która jest nazwą pliku
Ezenhis

1
za pomocą tego sposobu rozwiązania są najkrótsze for(;$b=$argv[++$i];)$a[$b][]=$b;print_r($a);lub<?foreach($_GET as$b)$a[$b][]=$b;print_r($a);
Jörg Hülsermann

Moja pierwsza próba gry w golfa po latach czaiła się i nadal jestem totalnym amatorem! Dziękujemy za opinie (i więcej głosów) choć wszyscy :)!
ScottMcGready

3

Mathematica, 27 bajtów

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

Czysta funkcja przyjmuje listę Ls i Ds (symbole, a nie znaki / ciągi) jako dane wejściowe i zwraca listę dwóch list. Na przykład,

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

zwraca {{L, L, L}, {D, D}}. Wypróbuj online!

Gathersam w sobie jest blisko tego, co chcemy, ale nie spełnia specyfikację na dwa sposoby: nie produkują pustych list, jeśli wejście brakuje Ls lub DS, i to nie zawsze porządek Ly na lewo. Wymiana wkład #z {L,D}~Join~#rozwiązuje problemy obu naraz, oznacza, że występuje co najmniej jeden Li co najmniej jeden D, a Ly zostaną zwrócone pierwsze Ponieważ Lwystąpił pierwszy. Rest/@następnie usuwa początkowe LiD .

(Próbowałem rozwiązania przy użyciu Count, ale z powodu problemów z curry, nie wydawało się to być krótsze: ±q_:=#~Table~Count[q,#]&/@{L,D}ma 31 bajtów.)


Link TIO (matematyka)?
Leaky Nun

1
Co powiesz Cases@@@{{#,L},{#,D}}&na 22 bajty?
Nie ma drzewa

Świetny pomysł, nie drzewo! Powinieneś opublikować tę odpowiedź - będę głosować :)
Greg Martin




2

PHP7, 52 45 bajtów

-7 bajtów dzięki @ Jörg Hülsermann

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

Użyj z CLI jako php -r a.php L L L D D L D

Skrypt przechodzi przez dostarczone argumenty i dołącza je do tablicy na podstawie jej wartości.


1
45 bajtów z -ropcją użycia zamiast -fusuwać <?phpi upuszczać spację poas
Jörg Hülsermann

2

Common Lisp, 66 65 bajtów

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

Wypróbuj online!

Jeśli zamiast ciągów znaków używamy symboli, jest to o wiele krótsze:

Common Lisp, 42 41 40 bajtów

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

Wypróbuj online!

(f '(D D L L D L D)) ; => ((L L L) (D D D D)) 

2

Racket, 48 bytes

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

Just apply this anonymous function to, e.g., '(L D L D D L)


2

Mathematica, 22 18 bytes

4 bytes saved by the genius of CalculatorFeline!

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

Try it online, or at the Wolfram sandbox!

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]}&.


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.


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

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.


"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"]))


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

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.


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.


@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.


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

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

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.






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"]

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.