Aiutami a fare il bucato


21

Aiuto! Il mio separatore completamente automatizzato Lights from Darks V3001.01 si è rotto! :(

Linee guida


Compito

Scrivi un programma che prenderà un input di un array (o un elenco in alcune lingue) di qualsiasi quantità di stringhe che sono la lettera L o la lettera D (che rappresenta luci o ombre) e genera un array che contiene due array, uno con tutte le L e una con tutte le D.


Regole

  • È il golf del codice, quindi vince la risposta più breve in byte
  • L'input conterrà solo maiuscole
  • Ci deve essere lo stesso numero di L nell'output presente nell'input, lo stesso vale per i D
  • L'input può avere solo un elemento (o forse anche zero elementi)
  • Se uno o entrambi gli array di output non contengono elementi, genera un elenco vuoto (in alcune lingue questo potrebbe significare che devi emettere una stringa)
  • Il primo array deve sempre essere l'array di L

Esempio di output:

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

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

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

[] -> [[],[]]


3
Possiamo inserire / emettere come stringa? Ad esempio: "LDLDD" -> "LL DDD"o qualcosa del genere?
Compagno SparklePony,

3
O magari come un elenco delle due stringhe, ad esempio "LDLDD" -> ["LL", "DDD"]
Compagno SparklePony,

Vorrei anche una risposta, poiché la mia risposta dipende da questo
Skidsdev l'

Che ne dici di un output misto? Come in una matrice contenente una stringa e una matrice di stringhe? ad es ["L","L",["D","D","D"]].
Shaggy,

No, l'output deve essere un array / elenco. @ComradeSparklePony
Amorris,

Risposte:


12

APL, 8 byte

'DL'~⍨¨⊂

Spiegazione:

  • : ingresso chiuso
  • ~⍨¨: senza ciascuno
  • 'DL': 'D' e 'L'

Esempi:

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

Perché è 'DL'ma no 'LD'?
Leaky Nun,

@LeakyNun: aggiunta spiegazione. Funziona rimuovendo il personaggio sbagliato invece di selezionare quello giusto.
marinus,

1
'LD'∩⍨¨⊂o ⍞∘∩¨'LD'potrebbe essere più facile da spiegare.
Adám,


5

Haskell , 28 byte

f l=[filter(==[c])l|c<-"LD"]

Provalo online!

Se l'input può essere un elenco di caratteri, è possibile rimuovere il []around c.


4

PHP, 46 byte

Si presume che l'elenco fornito sia: $arr = ['L','L','D','D','L','D','D','D','D','L'];

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


3
Come regola I / O predefinita, non puoi presumere che l'input sia memorizzato in una variabile
Keyu Gan,

@KeyuGan argh! Abbastanza giusto
ScottMc Già l'

2
Use può usare al $argvposto di $arre aspettarsi che lo script venga eseguito dalla riga di comando come php -f golf.php L L D D L D D D D L- ma poi devi ancora andare in giro per $ argv [0] che è il nome del file
Ezenhis,

1
usando in questo modo le soluzioni più brevi sono for(;$b=$argv[++$i];)$a[$b][]=$b;print_r($a);o<?foreach($_GET as$b)$a[$b][]=$b;print_r($a);
Jörg Hülsermann l'

Il mio primo tentativo di golf dopo anni in agguato e sono ancora un dilettante totale! Grazie per il feedback (e voti positivi) anche se tutti :)!
ScottMc

3

Mathematica, 27 byte

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

Funzione pura che prende un elenco di Ls D(simboli, non caratteri / stringhe) come input e restituisce un elenco di due elenchi. Per esempio,

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

ritorna {{L, L, L}, {D, D}}. Provalo online!

Gatherdi per sé è vicino a ciò che vogliamo, ma non riesce a soddisfare le specifiche in due modi: non produce elenchi vuoti se l'input è mancante Lo meno D, e non sempre ordina Ls a sinistra. Sostituire l'input #con {L,D}~Join~#risolve entrambi i problemi contemporaneamente: significa che ci sarà almeno uno Le almeno uno D, e la Ls verrà restituita per prima da quando si Lè verificato per primo. Rest/@quindi rimuove l'iniziale Le D.

(Ho provato una soluzione utilizzando Count, ma a causa di problemi di curry, non sembrava essere più breve: ±q_:=#~Table~Count[q,#]&/@{L,D}è di 31 byte.)


Collegamento TIO (matematica)?
Leaky Nun,

1
Che ne dici Cases@@@{{#,L},{#,D}}&di 22 byte?
Non un albero l'

Ottima idea, non un albero! Dovresti postare quella risposta: voterò :)
Greg Martin,




2

PHP7, 52 45 byte

-7 byte grazie a @ Jörg Hülsermann

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

Utilizzare con CLI come php -r a.php L L L D D L D

Lo script passa attraverso gli argomenti forniti e li aggiunge a un array in base al suo valore.


1
45 byte con l'utilizzo -rdell'opzione invece di -frimuovere <?phpe rilasciare lo spazio dopo ilas
Jörg Hülsermann

2

Lisp comune, 66 65 byte

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

Provalo online!

Se, invece delle stringhe, utilizziamo i simboli, allora è molto più breve:

Lisp comune, 42 41 40 byte

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

Provalo online!

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

2

Racchetta , 48 byte

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

Basta applicare questa funzione anonima, ad esempio, '(L D L D D L)


2

Mathematica, 22 18 byte

4 byte salvati dal genio di CalculatorFeline!

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

Provalo online o nella sandbox Wolfram !

L'input è un elenco dei simboli Le D- non delle stringhe, ma solo delle lettere, come nella risposta di Greg Martin . La sintassi #|Lè una scorciatoia per Alternatives[#,L], ma la @@@sintassi sostituisce la testa Alternativescon Cases, quindi questo codice è equivalente a {Cases[#,L],Cases[#,D]}&.


1
{#,x}può essere #|xper -4 byte.
CalcolatriceFeline

@CalculatorFeline, wow, quel trucco è incredibile! Grazie!
Non un albero il

1
@@e @@@lavorare con qualsiasi capo, non solo List. Se |non funziona, è ancora possibile risparmiare in alcuni casi con &&, ||o **.
CalcolatriceFeline

Puoi anche usare .operatori aritmetici.
CalcolatriceFeline

Inoltre, l'abuso di precedenza ha più risparmi per te (con una modifica del formato di output):#.L|#.D
CalculatorFeline

2

Java 8, 105 byte

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

Suggerimenti benvenuti.


Nuovo in PPCG, devo includere import java.util.*;import java.util.stream.*;nel conteggio byte?


Non competitiva, non crea liste vuote con un input vuoto. Grazie a Nevay per aver salvato alcuni byte.


2
Le importazioni devono essere conteggiate, oppure puoi qualificare completamente i nomi delle tue classi se sono più brevi.

1
È possibile utilizzare Stream#ofinvece di Arrays#streamridurre le importazioni java.util.stream.*e "D"::equals, invece di k->k.equals("D"). Inoltre, il codice non soddisfa i requisiti in quanto non genera un elenco vuoto se non è presente L/ D(casi di test 2-4).
Nevay,

Benvenuti in PPCG! Sfortunatamente, le risposte non valide non possono essere contrassegnate come non concorrenti. Puoi modificare questa risposta per renderla valida, ma per ora dovrebbe essere eliminata. (Probabilmente dovresti eliminarlo da solo; se una mod lo elimina, non puoi ripristinarlo da solo una volta che hai una soluzione funzionante.)
Esolanging Fruit


2

Japt , 13 12 10 byte

2Æf¥"LD"gX

Test ( -Qflag solo a scopo di visualizzazione)


Spiegazione

Input implicito di array U.

Generare l'array [0,1]e passare ciascun elemento attraverso una funzione, con Xl'elemento corrente.

Filtra Ucontrollando l'uguaglianza ...

"LD"gX

... con il carattere in stringa LDnell'indice X.


"Hmm, la rimozione del ¥dovrebbe funzionare ..." [["L","L","D","D"],[]]"No, non andare lì :)" - me 2017
ETHproductions

@ETHproductions: Ah-ah! Sì, ho provato tanti modi per provare a farlo funzionare senza ¥.
Shaggy,



1

Javascript (ES6), 37 byte

Questo si basa su una risposta Javascript (ES6) (ora eliminata).

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

Versione non golfata:

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

Esempio di frammento di codice:

f=

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

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


1

C #, 61 byte

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

Versione completa / formattata:

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 byte

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

Provalo online!

Prende l'input come un elenco di stringhe e restituisce due elenchi, il primo con elementi dove fun a -> a="L"è vero e l'altro con elementi che risultano falsi.


1

Gelatina , 10 byte

ẎfЀ⁾LDW€€

Provalo online!

In Jelly una stringa è un elenco di stringhe Python a 1 carattere, ad es ['a', 'b', 'c']. Ecco perché ottieni un output come[[['L'], ['L']], [['D'], ['D'], ['D']]] , poiché le stringhe Jelly a 1 carattere si comportano allo stesso modo.

Non funziona come un programma completo, quindi ÇŒṘin fondo.


@ Leo Hmm, potresti avere ragione ... risolto.
Erik the Outgolfer,

Sembra che l'ingresso Jelly sia diverso dall'output Jelly? L'interprete fa string->char[]automagicamente?
nmjcman101,

1
@ nmjcman101 Sulle stringhe è diverso, poiché l'input è in formato Python e l'output è in formato Jelly. Ecco perché ho bisogno della W€€parte.
Erik the Outgolfer,

1

Perse , 21 byte

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

Potrei o meno aver implementato la funzione di partizione elenco specificatamente per questa sfida. Prende l'input come una matrice di stringhe.


1

Buccia , 7 byte

Mof-"DL

Provalo online!

Spiegazione

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 byte

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

-4 byte grazie a @Nevay .

Spiegazione:

Provalo qui.

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.



1

Julia, 26 bytes

g(s)=s[s.=="L"],s[s.=="D"]



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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.