Помоги мне сделать мойку


21

Помогите! Мои полностью автоматизированные фары от Darks Separator V3001.01 сломались! :(

Методические рекомендации


задача

Напишите программу, которая будет принимать входные данные массива (или списка на некоторых языках) любого количества строк, которые представляют собой либо букву L, либо букву D (представляющую свет или штрихи), и выводят массив, содержащий два массива, один со всеми буквами «L» и со всеми буквами «D».


правила

  • Это код гольф, поэтому выигрывает самый короткий ответ в байтах
  • На входе будут только прописные буквы
  • На выходе должно быть одинаковое количество букв L и столько же, сколько на входе.
  • Вход может иметь только один элемент (или, может быть, даже нулевые элементы)
  • Если один или оба выходных массива не содержат элементов, выведите пустой список (в некоторых языках это может означать, что вам нужно вывести строку)
  • Всегда иметь первый массив быть массивом 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


Как насчет смешанного выхода? Как в массиве, содержащем одну строку и один массив строк? например, ["L","L",["D","D","D"]].
Лохматый

Нет, выходные данные должны быть массивом / списком. @ComradeSparklePony
Amorris

Ответы:


12

APL, 8 байт

'DL'~⍨¨⊂

Объяснение:

  • : закрытый вход
  • ~⍨¨: без каждого
  • 'DL': 'D' и 'L'

Примеры:

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

Почему это так, 'DL'а нет 'LD'?
Утренняя монахиня

@LeakyNun: добавлено объяснение. Это работает, удаляя неправильный символ, а не выбирая правильный.
Мэринус

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 аааа! Достаточно справедливо
ScottMcGready

2
Use может использовать $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

Mathematica, 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, но из-за проблем с каррингом оно не оказалось короче: ±q_:=#~Table~Count[q,#]&/@{L,D}31 байт.)


Ссылка TIO (математика)?
Утренняя монахиня

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

Mathematica, 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.*;в число байтов?


Не конкурирующий, он не создает пустые списки с пустым вводом. Спасибо Nevay за сохранение некоторых байтов.


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в списки Светов и Темных, соответственно, путем разделения стирки на предикат, который успешно выполняется, если предмет является Светом.

[Редактировать: гольф -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: Ха-ха! Да, я пробовал так много способов, чтобы заставить его работать без ¥.
Лохматый



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

Попробуйте онлайн!

Принимает input как список строк и возвращает два списка, первый с элементами, где fun a -> a="L"true, а другой с элементами, которые приводят к false.


1

Желе , 10 байт

ẎfЀ⁾LDW€€

Попробуйте онлайн!

В Jelly строка представляет собой список 1-символьных строк Python, например ['a', 'b', 'c']. Вот почему вы получаете вывод, например [[['L'], ['L']], [['D'], ['D'], ['D']]], поскольку 1-символьные строки Jelly ведут себя одинаково.

Не работает как полная программа, поэтому ÇŒṘвнизу.


@ Лео Хм, ты можешь быть прав ... исправлено.
Эрик Outgolfer

Кажется, вход желе отличается от выхода желе? Переводчик делает string->char[]автоматически?
nmjcman101

1
@ nmjcman101 В строках все по-другому, поскольку ввод осуществляется в формате Python, а вывод - в формате Jelly. Вот почему мне нужна W€€часть.
Эрик Outgolfer

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 байта)
Невай






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.