帮我洗衣服


21

救命!我的全自动黑暗照明分离器V3001.01坏了!:(

指导方针


任务

编写一个程序,该程序将以任意数量的字符串(字母L或字母D(代表亮或暗))输入一个数组(或某些语言的列表),并输出包含两个数组的数组,一个与所有的L和一个与所有的D。


规则

  • 这是代码高尔夫,所以最短的答案以字节为单位
  • 输入只会包含大写字母
  • 输出中的L必须与输入中的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同志'17

3
或输出为两个字符串的列表,例如,““ LDLDD”-> [“ LL”,“ DDD”]
SparklePony同志17年

还要一个答案,因为我的答案取决于此
Skidsdev

混合输出怎么样?如在包含一个字符串和一个字符串数组的数组中?例如["L","L",["D","D","D"]]
毛茸茸的

否,输出必须是数组/列表。@ComradeSparklePony
Amorris '17

Answers:


12

APL,8个字节

'DL'~⍨¨⊂

说明:

  • :封闭的输入
  • ~⍨¨:没有每个
  • 'DL':'D'和'L'

例子:

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

为什么'DL',但不是'LD'
Leaky Nun

@LeakyNun:添加了解释。它通过删除错误的字符而不是选择正确的字符来工作。
马里纳斯(Marus)

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
作为默认的I / O规则,您不能假定输入存储在一个变量中
Keyu Gan'7

@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);
约尔格Hülsermann

多年潜伏后,我第一次尝试高尔夫,但我仍然是业余爱好者!感谢大家的反馈(和投票):)!
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,并且Ls将首先返回,因为L首先遇到an 。Rest/@然后删除首字母LD

(我尝试了使用的解决方案Count,但由于遇到问题,它似乎并不短:±q_:=#~Table~Count[q,#]&/@{L,D}是31个字节。)


TIO链接(数学)?
Leaky Nun

1
怎么样Cases@@@{{#,L},{#,D}}&,为22个字节?
不是一棵树

好主意,不是一棵树!您应该发布该答案-我会投票:)
Greg Martin




2

PHP7,52个 45字节

-7个字节,感谢@JörgHü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
约尔格Hülsermann

2

Common Lisp,66 65字节

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

在线尝试!

如果我们使用符号而不是字符串,那么它会短很多:

Common Lisp,42 41 40字节

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

在线尝试!

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

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沙箱上尝试

输入是符号列表,LD不是字符串,而是字母本身,就像格雷格·马丁的答案一样。语法#|L是简写Alternatives[#,L],但@@@语法替换头AlternativesCases,所以这段代码等同于{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!不幸的是,无效答案不能标记为不竞争。欢迎您修改此答案以使其有效,但目前应将其删除。(您可能应该自己删除它;如果mod删除了它,则一旦
找到可行的


2

Japt13 12 10字节

2Æf¥"LD"gX

测试它-Q仅用于可视化的标志)


说明

数组的隐式输入U

生成数组[0,1]并将每个元素X作为当前元素传递给函数。

U通过检查是否相等进行过滤...

"LD"gX

...字符串中的字符LD在index处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

在线尝试!

将输入作为字符串列表,并返回两个列表,第一个包含元素fun a -> a="L"为true的列表,另一个包含结果为false的元素。


1

果冻,10字节

ẎfЀ⁾LDW€€

在线尝试!

在Jelly中,字符串是1个字符的Python字符串的列表,例如['a', 'b', 'c']。这就是为什么要获取诸如之类的输出的原因[[['L'], ['L']], [['D'], ['D'], ['D']]],因为1字符Jelly字符串的行为相同。

不能作为完整程序运行,因此ÇŒṘ位于底部。


@Leo Hmm,您可能是正确的...已修复。
暴民埃里克(Erik the Outgolfer)'17年

似乎果冻输入与果冻输出不同?口译员会string->char[]自动执行吗?
nmjcman101

1
@ nmjcman101在字符串上有所不同,因为输入采用Python格式,而输出采用Jelly格式。这就是为什么我需要这个W€€部分。
暴民埃里克(Erik the Outgolfer)'17年

1

英仙座,21字节

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

我可能已经或尚未实现专门针对此挑战的列表分区功能。将输入作为字符串数组。


1

外壳,7个字节

Mof-"DL

在线尝试!

说明

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

爪哇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个字节)
Nevay



1

朱莉娅,26个字节

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



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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.