CodeGolf-忽略噪音#1


15

使用说明

Barry 并不是一个很好的后端开发人员,负责一个小型API,该API应该为您提供有关在客户商店中进行购买的信息。但是,他做得不好,您的老板告诉您在客户端进行修复。理想情况下,你应该接受逗号分隔值,如927,2,45,90对应于像item_iditem_amountunit_pricetotal

在第一个难题中,我们只关心item_iditem_amount但是我们需要其他领域来介绍问题。巴里有时把事情混在一起,并返回噪声输出的一部分,他也得到了顺序不对,返回noisenoiseunit_pricetotalitem_iditem_amount

你的任务

无论Barry是否正确返回它们,您都需要在地图(或类似结构)中存储对,item_iditem_amount在换行中以尽可能少的字符数打印每个元素。(存储不是强制性的,我们只关心输出)

样本输入(混合的正确格式和混乱格式)

103,2,50,100
106,1,900,900
459,40,150,300,67,2
4,20,30,6000

换句话说,输入将是&a,b,x,xx,x,x,x,a,b我们在乎的地方。您需要提供代码,假设我们在csv的所有行中都有一个名为(或任何其他名称)的变量。abG

样品输出

103,2
106,1
67,2 //This one was messy
4,20

公差

答案有一定的容忍度。格式相似但遵循正确值的答案也将被接受。格式,如[a,b](a,b)或者{a,b}是有效的,但是a,b是优选的。

尽管第一个难题的解决方法既简单又快速,但它的接受程度参差不齐,但我也觉得有些人也喜欢它。所以我现在要继续做高尔夫


输入将始终采用格式,x,x,x,x并且x,x,x,x,x,x在哪里x表示数字?
Spikatrix

是的,输入将遵循这两种格式之一,请澄清一下
JuanCortés2015年

我们是否需要提交程序或功能或其他东西?另外,所有输入都可以从哪里获取?
Spikatrix

3
快速高尔夫本质上是一个难度标签。共识似乎是我们不想要这些标签,因此我现在要删除该标签。如果您希望重新评估难度标签,请为此发布元信息。但这将是一项巨大的重新标记工作,我认为应该以协调的方式进行,而不是单个用户为此创建任意新的标签。
马丁·恩德

2
@CoolGuy没有这样的事情。您不应该用C击败Pyth(因为您永远也不会)。高兴的是击败了相同语言或类似冗长语言的其他提交。如果已经有50字节的C提交,我可以理解不发布(尽管即使如此,如果方法不同且有趣,我也可以发布)。但是由于没有,请发布您的答案。你是相当接近的JavaScript和Python,所以它绝对不是过长的C.
马丁安德

Answers:


8

Pyth,10个字节

FNG<.<N4 2

在线尝试:Pyth编译器/执行器

(前4个字符=G.Q读取所有数据并将其存储在中G

说明

FNG              for row N in G:
    .<N4            cyclic leftshift by 4
   <     2          print the first two elements

4
美丽,我开始喜欢Pyth已经
胡安·科尔特斯

3
@JuanCortés:如果您想开始使用Pyth,可能是一个很好的资源。
Alex A.


7

Python 3,123 76 72 62字节

我是新来者,必须从某个地方开始...

 for l in G:
  d=l.rstrip().split(',');x=[0,4][len(d)>5];print(d[x:x+2])

有了xnor和DLosc的建议(62个字节):

for l in G:d=l.rstrip().split(',');print(d[4*(len(d)>5):][:2])

8
欢迎来到编程难题和Code Golf!由于这是一场代码高尔夫竞赛,因此您需要使代码尽可能短。您可以做的一件事就是减少用于缩进的空间;在Python中,一个空格就足够了。这篇文章列出了用Python打高尔夫球的技巧,可能是一个很好的参考。
Alex A.

@Alex,谢谢-我想弄清楚确切的规则是什么,我希望可以忽略一些空格,但我想不是。
monguin

不,换行符和空格都影响您的字符数。
Alex A.

实际上,在这种情况下,您甚至不需要换行和缩进。块之类的语句for可以将所有关于Python中的同一行,只要没有在体内另一个块语句。
DLosc

3
一个好的开始。你可以把在同一行的一切作为for,以避免缩进。利用布尔等于0/1的事实,[0,4][...] 可以将 条件条件缩短为4*(...)。另外,如果您将编写d[x:x+2]d[x:][:2],尽管长了一个字符,但可以避免将表达式保存为x变量。
xnor

4

Sed,32个字节

s/,/=/4
s/.*=//
s/,/:/2
s/:.*//

如果有第四个逗号,它将删除所有内容。然后,它从第二个逗号(以前可能是第六个)中删除所有内容。

我什至设法证明了自己的合理性!


有机会看到演示吗?
胡安·科尔特斯

我不确定您要从演示中得到什么-我运行了提供的测试输入并获得了所需的输出。
Toby Speight

4

Javascript,44个字节

假设输入变量G

编辑:我刚刚意识到,这看起来很像nutki的perl解决方案。

alert(G.replace(/(\d+,){4}|,\d+,\d+$/gm,''))

片段演示:

function run(){
    G = input.value;
    /* start solution */
    alert(G.replace(/(\d+,){4}|,\d+,\d+$/gm,''))
    /* end solution */
}
<textarea id="input" cols="25" rows="6">103,2,50,100
106,1,900,900
459,40,150,300,67,2
4,20,30,6000</textarea><br />
<button id="run" onclick="run();">Run</button>


4

Scala,68个字节

G.map(_.split(",")).map(x=>println((x++x).slice(4,6).mkString(",")))

- 布恩先生

Scala,46 70字节

编辑:打印结果

for{l<-G;r=l.split(",");x=(r++r).slice(4,6).mkString(",")}{println(x)}

演示版


1
通过使用map减少1个字节G.map{k=>val x=k.split(",");println((x++x).slice(4,6).mkString(","))}
2015年

1
通过删除绑定保存了另一个字节:G.map(_.split(",")).map(x=>println((x++x).slice(4,6).mkString(",")))
乌贼

3

CJam,18 15 14字节

r{',/4m<2<pr}h

CJam解释器中在线尝试。

怎么运行的

r      e# Read a whitespace separated token from STDIN.
{      e# Do-while loop:
  ',/  e#    Split at commas.
  4m<  e#    Rotate the resulting array 4 units to the left.
  2<   e#    Discard everything but the first 2 elements.
  p    e#    Print the array.
  r    e#    Read a whitespace separated token from STDIN.
}h     e# If the token is a nonempty string, repeat the loop.


3

Javascript,117 112 99 95 84 76 71字节

for(r of G.split('\n'))s=r.split(','),console.log(s[t=s[4]?4:0],s[t+1])

JS小提琴


1
请张贴小提琴或演示
JuanCortés2015年

您可以通过在循环体中替换;为来删除两个b ,,从而删除括号{}
JuanCortés2015年

@JuanCortés-谢谢,不知道。这背后的理论是什么?
RichieAHB 2015年

如果未添加大括号,则循环主体将是右括号后的第一个表达式。表达式以分号结尾。用逗号分隔表达式会使它们像一个表达式组,如果可以的话,在它们之后结束表达式
JuanCortés2015年

1
使用for of您可以节省3个字节。它可以在任何现代浏览器中使用。for(r of q=G.split('\n'))s=r.split(','),console.log(s[t=s[4]?4:0],s[t+1])
edc65

2

,12 +1 = 13字节

使用该-l标志,该标志将输出作为每行数字的空格分隔列表。*

_@[4 5]Mg^',

说明:

  • 号码列表应在中g。由于g通常是从命令行参数初始化的,因此您也可以将输入放在此处以获得相同的结果。
  • ^', 在逗号列表中拆分(每个字符串)。
  • M 将函数映射到结果中的每个元素。
  • _@[4 5]定义一个lambda函数。该函数的参数由_; 表示。@[4 5]返回其第4和第5个元素的列表。如果列表包含六个元素,则将是最后两个。如果有四个,索引将环绕,因此结果是前两个。(例如"abcd"@4 == "abcd"@0 == "a"。)
  • 现在,我们有了一个列表列表,例如[[103 2] [106 1] [67 2]],该列表会在程序末尾自动打印。该-l标志将空间上的每个子列表连接在一起,然后将所有内容连接到换行符上,因此结果如下:
C:\> pip.py -le“ _ @ [4 5] Mg ^',” 103,2,50,100 106,1,900,900 459,40,150,300,67,2
103 2
106 1
67 2

* 目前。我可能会改变这种行为,但是我仍然计划有一些做同样事情的标志。


1

Perl,37岁

@c=/(\d+,\d+)/g;$_=@c>2?$c[2]:$c[0]

35字符+2-p-l。我不确定Perl中是否有一种方法可以胜过@nutki的解决方案,但是我认为无论如何我都会发布这个想法。

运行:

cat input.txt | perl -ple'@c=/(\d+,\d+)/g;$_=@c>2?$c[2]:$c[0]'

1

bash,54岁

while IFS=, read {a..f};do echo ${e:-$a},${f:-$b};done

0

C,95个字节

f(a,b,c,d){scanf("%d,%d,%*d,%*d,%d,%d",&a,&b,&c,&d)>2?printf("%d,%d",c,d):printf("%d,%d",a,b);}

代码很简单。这是非高尔夫版本:

f(a,b,c,d){                                    //Four int variables
    scanf("%d,%d,%*d,%*d,%d,%d",&a,&b,&c,&d)>2 //Scan input
        ?                                      //If scanf returned a value > 2
        printf("%d,%d",c,d)                    //Print last two values
        :                                      //else 
        printf("%d,%d",a,b);                   //Print first two values
}

在这里测试


0

红宝石,53岁

G.each_line{|x|g=x.split',';p[g[4]||g[0],g[5]||g[1]]}

还是很好。

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.