Допоможіть мені вмитися


21

Довідка! Мій повністю автоматизований світло від Darks Separator V3001.01 зламався! :(

Керівні принципи


Завдання

Напишіть програму, яка візьме введення масиву (або списку на деяких мовах) будь-якої кількості рядків, що є або буквою L, або буквою D (представляє світло або темноту) і виведе масив, що містить два масиви, один з усіма L, і один з усіма D.


Правила

  • Це код гольфу, тому найкоротша відповідь у байтах виграє
  • Вхідні дані містять лише великі літери
  • На виході має бути така ж кількість L, як і на вході, те саме стосується і D
  • Вхід може мати лише один елемент (а може навіть і нульовий елемент)
  • Якщо в одному або обох вихідних масивах немає елементів, виведіть порожній список (у деяких мовах це може означати, що вам потрібно вивести рядок)
  • Завжди першим масивом буде масив L

Приклад виводу:

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

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

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

[] -> [[],[]]


3
Чи можемо ми ввести / вивести як рядок? Наприклад: "LDLDD" -> "LL DDD"чи щось подібне?
Товариш SparklePony

3
Або вивести, можливо, як список двох рядків, наприклад, "" LDLDD "-> [" LL "," DDD "]
Товариш SparklePony

Також хотів би відповіді, оскільки моя відповідь залежить від цього
Skidsdev

Як щодо змішаного виходу? Як у масиві, що містить один рядок і один масив рядків? наприклад, ["L","L",["D","D","D"]].
Shaggy

Ні, вихід повинен бути масивом / списком. @ComradeSparklePony
Amorris

Відповіді:


12

APL, 8 байт

'DL'~⍨¨⊂

Пояснення:

  • : вкладений вхід
  • ~⍨¨: без кожного
  • 'DL': 'D' і 'L'

Приклади:

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

Чому це так, 'DL'але ні 'LD'?
Leaky Nun

@LeakyNun: додано пояснення. Він працює, видаляючи неправильний символ, а не вибираючи правильний.
marinus

1
'LD'∩⍨¨⊂або ⍞∘∩¨'LD'може бути простіше пояснити.
Адам



4

PHP, 46 байт

Передбачається даний список: $arr = ['L','L','D','D','L','D','D','D','D','L'];

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


3
Як правило вводу / виводу за замовчуванням, ви не можете припустити, що вхід зберігається в одній змінній
Keyu Gan

@KeyuGan argh! Досить справедливо
ScottMcGready

2
Використовувати можна, $argvа не $arrі очікувати, що сценарій буде запускатися з командного рядка як php -f golf.php L L D D L D D D D L- але тоді вам знову доведеться обійти $ argv [0], яке ім'я файлу
Ezenhis

1
таким способом є найкоротші рішення for(;$b=$argv[++$i];)$a[$b][]=$b;print_r($a);або<?foreach($_GET as$b)$a[$b][]=$b;print_r($a);
Йорг Хюльсерманн

Моя перша спроба гольфу після багатьох років ховається, і я все ще є тотальним любителем! Дякуємо за відгуки (і голоси), хоча всі :)!
ScottMcGready

3

Математика, 27 байт

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

Чиста функція, приймаючи список Ls і Ds (символи, а не символи / рядки) як вхідні та повертаючи список з двох списків. Наприклад,

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

повертає {{L, L, L}, {D, D}}. Спробуйте в Інтернеті!

Gatherсам по собі близький до того, що ми хочемо, але не відповідає специфікації двома способами: він не створює порожніх списків, якщо для введення відсутня Ls або Ds, і він не завжди сортує Ls зліва. Заміна вхід #з {L,D}~Join~#вирішує обидві проблеми відразу: це означає , що буде принаймні один , Lі щонайменше один D, а Lз повернуть перший так як Lбула виявлена в першу чергу. Rest/@потім видаляє початковий Lі D.

(Я спробував рішення, використовуючи Count, але через проблеми з currying воно не здалося коротшим: ±q_:=#~Table~Count[q,#]&/@{L,D}31 байт.)


TIO посилання (математика)?
Leaky Nun

1
Як щодо Cases@@@{{#,L},{#,D}}&22 байтів?
Не дерево

Чудова ідея, Не дерево! Ви повинні опублікувати цю відповідь - я піднесу пропозицію :)
Грег Мартін




2

PHP7, 52 45 байт

-7 байт завдяки @ Jörg Hülsermann

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

Використовувати з CLI як php -r a.php L L L D D L D

Сценарій проходить через надані аргументи і додає їх до масиву на основі його значення.


1
45 байт з використанням -rопції замість того, щоб -fвидалити <?phpта залишити пробіл післяas
Jörg Hülsermann,


2

Ракетка , 48 байт

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

Просто застосуйте цю анонімну функцію до, наприклад, '(L D L D D L)


2

Математика, 22 18 байт

4 байти, збережені генієм CalculatorFeline!

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

Спробуйте в Інтернеті або в пісочниці Wolfram !

Введення - це список символів Lі D- не рядки, а самі букви, як у відповіді Грега Мартіна . Синтаксис #|Lє скороченим для Alternatives[#,L], але @@@синтаксис замінює голову Alternativesна Cases, тому цей код еквівалентний {Cases[#,L],Cases[#,D]}&.


1
{#,x}може бути #|xдля -4 байт.
CalculatorFeline

@CalculatorFeline, ого, ця хитрість дивовижна! Дякую!
Не дерево

1
@@і @@@працювати з будь-якою головою, а не тільки List. Якщо |не працює, то ви можете зберегти в деяких випадках з &&, ||або **.
CalculatorFeline

Також можна використовувати .і арифметичні оператори.
CalculatorFeline

Крім того , зловживання старшинство має більше заощаджень для вас (зі зміною формату виведення):#.L|#.D
CalculatorFeline

2

Java 8, 105 байт

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

Поради вітаються.


Нове для PPCG, чи потрібно я включати import java.util.*;import java.util.stream.*;до числа байтів?


Не змагаючись, він не створює порожні списки з порожнім входом. Дякуємо Невай за збереження деяких байт.


2
Імпорт потрібно рахувати, або ви можете повністю кваліфікувати назви своїх класів, якщо це коротше.

1
Ви можете використовувати Stream#ofзамість того, Arrays#streamщоб зменшити імпорт до java.util.stream.*та "D"::equalsзамість k->k.equals("D"). Крім того, що код не відповідає вимогам, оскільки він не видає порожній список, якщо немає L/ Dнемає (тестові випадки 2-4).
Невай

Ласкаво просимо до PPCG! На жаль, недійсні відповіді не можуть бути позначені як змагальні. Ви можете змінити цю відповідь, щоб зробити її дійсною, але наразі її слід видалити. (Ви, ймовірно, повинні видалити його самостійно; якщо мод видаляє його, ви не можете його відновити самостійно, коли у вас є робоче рішення.)
Esolanging Fruit

2

Пролог (SWI) , 42 , 37 байт

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

Спробуйте в Інтернеті!

Враховуючи, що Wце список прання,w/3 об'єднається Lі перейде Dв списки Lights and Darks відповідно, розділивши прання на присудок, який вдається, якщо предмет є Light.

[Редагувати: гольф -5 завдяки Fatalize ]


1
l('L').на 5 байт коротше, ніжl(X):-X='L'.
Fatalize

@Fatalize - дякую! Відредаговано.
TessellatingHeckler

2

Japt , 13 12 10 байт

2Æf¥"LD"gX

Тестуйте його ( -Qпрапор лише для цілей візуалізації)


Пояснення

Неявне введення масиву U.

Створіть масив [0,1]і передайте кожен елемент через функцію, Xбудучи поточним елементом.

Фільтр U, перевіряючи рівність ...

"LD"gX

... з символом у рядку LDв індексі X.


"Хм, зняти ¥треба працювати ..." [["L","L","D","D"],[]]"Ні, не їду туди :)" - мені 2017
ETHproductions

@ETHproductions: Ха-ха! Так, я спробував так багато способів спробувати змусити його працювати без цього ¥.
Shaggy



1

Javascript (ES6), 37 байт

Це ґрунтується на відповіді (тепер видалено) Javascript (ES6).

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

Негольована версія:

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

Приклад фрагмента коду:

f=

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

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


1

C #, 61 байт

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

Повна / відформатована версія:

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 байт

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

Спробуйте в Інтернеті!

Приймає введення як список рядків і повертає два списки, перший з елементами, де fun a -> a="L"є істинним, а другий з елементами, які призводять до помилки.


1

Желе , 10 байт

ẎfЀ⁾LDW€€

Спробуйте в Інтернеті!

У рядку Jelly є список 1-рядкових рядків Python, напр ['a', 'b', 'c']. Ось чому ви отримуєте такий результат, як [[['L'], ['L']], [['D'], ['D'], ['D']]], оскільки 1-char струнні желейні ведуть себе так само.

Не працює як повноцінна програма, отже, ÇŒṘвнизу.


@Leo Хм, ти можеш мати рацію ... виправлено.
Ерік Аутгольфер

Здається, введення желе відрізняється від виходу желе? Чи робить перекладач string->char[]автоматично?
nmjcman101

1
@ nmjcman101 У рядках це інше, оскільки введення у форматі Python, а вихід у форматі Jelly. Тому мені потрібна W€€частина.
Ерік Аутгольфер

1

Персе , 21 байт

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

Я може або не може реалізувати функцію розбиття списку спеціально для цього завдання. Приймає вхід як масив рядків.



1

Java 8, 110 106 байт

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

-4 байти завдяки @Nevay .

Пояснення:

Спробуйте тут.

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
Ви можете зберігати l і d у масиві, щоб видалити оператор if-else. a->{String[]r={"",""};for(char c:a)r[c/69]+=c;return new char[][]{r[1].toCharArray(),r[0].toCharArray()};}(-4 байти)
Невай

1

Октава, 21 байт

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

Введення - це масив символів, вихід - масив комірок. Перероблено з моєї відповіді тут .

Виконання зразка на ideone .






0

CJam , 14 байт

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

Введення - це список символів (рядок), вихід - список списків символів (список рядків).

Спробуйте в Інтернеті!

Пояснення:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.