作业时间!在字符串中找到我的最低偶数


12

来自Stack Overflow的另一个精彩问题变成了挑战!

编写一个程序,该程序:

  1. 接受字符串作为用户输入(不通过管道输入或使用命令行参数)。输入的数据类型必须为字符串,如果该语言对输入进行自动评估,则必须将其强制转换为字符串。
  2. 发现的第一个最低的偶的索引(0或1型)
  3. 打印2个整数,即索引和最低的偶数
  4. 如果没有连,返回-1为指标,第二个数字可以是任何东西。
  5. 出于这个目的,零甚至不是

测试示例,给定左侧的字符串,右侧输出值:

25376  -->  0,2
523726 -->  1,2
583746 -->  4,4
53771  --> -1,0
_4___2 -->  5,2

优胜者:是字符数最少的程序。没有奖金,没有罚款。

编辑:(关于stdin)我搞砸了用户输入部分,基本上没有管道数据,也没有命令行参数。您必须在程序本身内提供某种用户提示。


4
如果最低的偶数整数有两位数字怎么办?好,开个玩笑。
belisarius博士2013年

5
stdin怎么了?
John Dvorak

1
@JanDvorak因为任意规则,所以。

7
为什么零的限制不是均匀的?这似乎很奇怪。
Iszi 2013年

3
您的输入要求确实没有任何意义:对于大多数系统,输入来自stdin,无论是程序提示还是否。输入是否通过管道传输不受程序控制。-如果您的目的是让用户创建一个交互式程序,那么您应该对输入和输出(包括格式设置)以及所需的交互有一定的了解。
MtnViewMark

Answers:


6

Golfscript,26(28)个字符

'#{gets}'.'246'&8+$1<.@\?

例:

;'583746'
.'246'&8+$1<.@\?
#44

;'53771'
.'246'&8+$1<.@\?
#8-1

实时测试:http//golfscript.apphb.com/?c = Oyc1Mzc3MScKLicyNDYnJjgrJDE8LjA9QD8%3D

说明:

  • '#{gets}'逃脱红宝石以满足I / O要求;假定STDIN为空
  • . 克隆输入
  • '246'&8+查找输入中存在哪些偶数数字,但8始终保留
  • $1< 对列表进行排序,然后采用第一个数字,但将其保留为字符串
  • .@\?对堆栈{digit,input,digit}进行排序,然后在输入中找到数字;感谢@peterTaylor通知我的[array,array]签名?

这次,我对规范的解释非常大胆;即:

  • 规范没有规定整数的输出顺序。使用其他@peter的建议:x?x来解决(我不喜欢临时变量。
  • 规范在两个整数之间不需要任何定界符;由于找到的数字始终是一个数字,因此无关紧要。如果是这样,请追加n@(也执行交换),n\(不执行)或]`(将输出格式化为["8" -1])。

它们不是疯狂的要求,它们是任意的要求:P

另外,规范要求索引必须是第一位,但我无法充分理解GolfScript来告诉您是否

@LegoStormtroopr规范中提到顺序的唯一要点是#4:“如果没有偶数,则返回-1作为索引,第二个数字可以是任何数字”。#3没有指定顺序;那么“无分隔符”的大胆呢?
John Dvorak

噢,你是正确的先生!我提到要输出的两个数字,但没有顺序。我纠正了!

您可以.0=@?.@\?或替换:x?x以保存一个字符,并避免对命令的疑问。很好地8用作备用。
彼得·泰勒

5

APL(37)

(默认为1,但遵循⎕IO

{×⍴m←⍵/⍨⍵∊'2468':z,⍨⍵⍳⍕z←⌊/⍎¨m⋄¯1,0}⍞

说明:

  • :读取用户输入
  • m←⍵/⍨⍵∊'2468':删除所有不是的字符2468,存储在中m
  • ×⍴m:看看是否有
  • :: 如果是这样:
    • z←⌊/⍎¨m:评估中的每个字符m,找到最低的字符并存储在中z
    • z,⍨⍵⍳⍕z:返回zin 的索引,后跟z
  • : 如果不:
    • ¯1,0:返回 (-1, 0)

1
哇,我打败了APL(不是用J解决方案,而是……)
John Dvorak

说明?APL真是不言而喻...;)
german_guy 2014年

3

Python 3,69

结合这里的想法。

s=input();print(([(s.find(x),x)for x in'2468'if x in s]+[(-1,0)])[0]) 

我喜欢使用字符串而不是列表,并且忽略了(现在已删除)`引号。
SimonT

@boothby我想您没有注意到我正在使用python3。在python 3中input()接受字符串作为用户输入。
Wasi

@SimonT`(反引号)不只是引号。它是python 2中repr()的不推荐使用的别名,但是在Python 3中不再可用。因此,如果我想在python 3中的某些东西上使用``,我必须编写repr(something),它要花4个字符。那就是为什么我摆脱它;)
Wasi

@Wasi是的,的确是我的错误。
2013年

@Wasi,是的,谢谢。我意识到了这一点,通过“现在删除”,我实际上意味着完全删除了该语言。干杯。
SimonT

3

Ruby,60个字符

x=gets.chars.sort.find{|c|c=~/[2468]/};p x ?$_.index(x):-1,x
  • $_包含读取的最后一个输入gets
  • p调用inspect参数并打印结果。

3

perl的- - 94 - 53个字符(或48)

index()我们使用的不是从零开始的方法,而是pos从一个开始。没有CPAN。使用运行此命令,perl -nE它将等待输入(也可以从输入STDIN)。

第一个match(//)操作对$_输入的默认值()进行操作,将其与给定的偶数sort进行匹配,将匹配项放入数组中,然后将其存储在“标量列表”中($m)。在标量上下文中,已排序数组的列表值是一个长项,因此由数字中最低的匹配偶数数字组成。

隔离出最低的偶数匹配数字后,我们将$m进行第二次匹配操作,该操作将找到$m原始字符串中值的首次出现。我们仍然在这里使用默认值$_,我们对保存的内容,比赛$m$1(为理由()围绕$m在第二条语句)。在那之后,possay做休息(和更少的字符比indexprint)。

perl -nE'($m)=sort/[2468]/g;/($m)/g;$1?say pos.",$1":say"-1,0"'
33467
3,4

如果输出顺序或逗号无关紧要,则可以使这5个字符缩短:

($m)=sort/[2468]/g;/($m)/g;$1?say$1.pos:say"-10"

在我较早的尝试中,我匆匆忙忙犯了一个错误-我只是想击败python和ruby(但失败了)……叹了口气。

祝贺获胜者和其他参与者出色的解决方案-尤其是perl6:-)可能对Perl6进行这种方法的改编可以使用“ .comb(由Masak 等人在freenode上建议)。

$_=get;my $n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/"

我非常专心于击败python / ruby​​,以至于我发布了一个在没有偶数的情况下无法正常工作的衬板:急切地使用我$SHELL历史上较早的版本来获得胜利。这个工作版本冗长而令人尴尬。为我服务:稍后将缩短以免感到羞耻:-(
G. Cito 2014年

较老的骇客:if(/[2468]/){for$i(2,4,6,8){if(index($_,$i)>-1){say$i,",",index($_,$i)+1;last}}}else{say"0,-1"}
G. Cito 2014年

2
很好,但仍有打高尔夫球的空间:($m)=sort/[2468]/g;/$m/g;say$&?pos.",$&":"-1,0"(47 + 1字节,AFAIK会-n增加一个字节)。
Heiko Oberdiek

注意 pos返回偏移量。因此,实际上,它在您的示例中返回了从1开始的索引。
draegtun 2014年

@draegtun oopsie :-)谢谢。@Heiko真的:交换机应该算否则perl-M会赢得每;-)时间
G. CITO

3

Perl 6,37 55 60个字符

$_=get;say m/<{~.comb(/<[2468]>/).min}>/.from//-1,',',$/.Int

编辑:我第一次误解了这个问题。此更新应该是正确的。它找到输入包含的最低2、4、6或8,然后对具有最低编号的输入进行正则表达式匹配。$/.from获取匹配项的位置,并且',', $/.Int是逗号加上匹配项本身;如果文本不匹配,则为0。

当您在这里时,请投票给G. Cito,他帮助我在评论和irc上修复了我的输入内容:)


1
不幸的是,它会打印出找到的第一个偶数(2468),而不是最低的:(注意。此外$/.from,什么也没发现是有问题的(这可能是我的旧版Rakudo中的错误)。这是您的解决方案的一种变体( !对我来说)my$x=get;for 2,4,6,8 ->$n{if $x~~/$n/ {say $/.from,",$/";exit}};say "-1 0"; 排在75个字符,但我敢肯定,更短的perl6解决方案可。
draegtun

@draegtun ...昨天我在perl5尝试中犯了类似的错误(见下文)。我的修复程序增加了70个字符!刚刚将其更新为〜50 char版本-似乎可以正常工作。我认为,如果您对数字中的所有偶数数字进行排序,则可以使用排序中的(现在)第一个数字进行匹配,并确保您拥有最低的和第一个数字。我对吗?
G. Cito 2014年

@ G.Cito对我来说很好,已经为您的答案+1。我可以看到可以减少一些字符的方法,但是我发现Heiko的工作比我建议的要好!
draegtun 2014年

@draegtun哦,老天,我完全误解了这个问题:(非常感谢!我将尽快更新此信息
Mouq 2014年

@mouq这是一种使用与我在下面发布的perl5示例相同的方法的方法my $n; $_="333992";$n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/"。我.comb大约20分钟前了解到了,我已经喜欢它了:-)
G. Cito 2014年

2

J,44个字符

echo(;{&i){._1,~(#~(#i)&>)'2468'i.~i=.1!:1]1

如果找不到偶数位,则输出输入的最后一个字符

例:

   echo(;{&i){._1,~(#~(#i)&>)'2468'i.~i=.1!:1]1
523726
+-+-+
|1|2|
+-+-+
   echo(;{&i){._1,~(#~(#i)&>)'2468'i.~i=.1!:1]1
53771
+--+-+
|_1|1|
+--+-+

说明:

  • echo ... i=.1!:1]1是输入/输出。比我想要的更长的时间。输入也隐藏起来i
  • '2468'i.~ 查找输入中每个偶数数字的第一个出现位置,如果找不到该数字,则返回输入长度
  • (#~(#i)&>)读取“选择时输入长度大于此长度”;换句话说,选择那些指向输入的索引。比我想要的更长的时间。
  • _1,~将-1附加到后面。下划线是J表示负值的方式。
  • {. 选择第一个元素
  • (;{&i)在两个框中将其与该位置的输入字符连接起来;由于我们将数字与字符连接在一起,因此非装箱连接(,)不会起作用。如果需要拆箱显示,则首先需要对索引进行格式化(":),但要花费两个字符。

2

Python 2.7-76

我完全希望能得到参考答案。但是要开始工作:

s=raw_input()
print[(s.index(`e`),e)for e in[2,4,6,8]if`e`in s][:1]or(-1,0)

3
您可以通过更改index为来剃除角色find;您还可以更改[2,4,6,8]2,4,6,8(前面有空格)。
贾斯汀

4
简短说明:print[(s.find(`e`),e)for e in 2,4,6,8if`e`in s+'8'][0]
grc

4
我认为您违反了自己的规则...从什么时候开始raw_input不是stdin?
Cruncher 2013年

1
print[(s.index(c),c)for c in'2468'if c in s][0]or(-1,0)
Eric

2

R,104

y=as.integer(strsplit(scan(,""),"")[[1]]);z=which(!y%%2&y);a=z[which.min(y[z])];cat(a,"-1 0"[!sum(a)],y[a])

示例(在R中,索引从1开始):

_4_502
6  2

_3_501
-1 0 

583746
5  4

2

Powershell,76 73 71

$s=read-host;2,4,6,8|%{if($i=$s.indexof("$_")+1){"$i,$_";break}};"-1,0"
  • $s=read-host 将用户输入存储到 $s
  • 2,4,6,8|%{...} 运行{}数字2,4,6和8的内容
  • $i=$s.indexof("$_")+1 设置$i为数字的从1开始的索引,$s或者0如果找不到该数字
  • if( $i=... ){...} 当条件为真$i0
  • "$i,$_";break 输出索引和数字,并停止执行
  • "-1,0" 否则输出 -1,0

这不会输出正确的索引。在PowerShell中,就像针对该问题给出的测试用例一样,索引从零开始。
Iszi 2013年

1
规则2表示索引可以基于0或1。
DankoDurbić2013年

哦。没发现。无论哪种方式,这都是一个从零开始的变体,仅增加了5个字符。$s=read-host;(2,4,6,8)|%{if(($i=$s.indexof("$_"))-gt-1){"$i,$_";break}};'-1,0'
Iszi 2013年

另外,我敢肯定括号2,4,6,8是没有必要的。
Iszi 2013年

如果您将if条件更改为以下内容,则可以将基于零的变体加2个字符:if(1+($i=$s.indexof("$_")))
DankoDurbić2013年

2

C ++ 11、173(包括两个换行符)

这是压缩版本:

#include<iostream> 
#include<string> 
int main(){std::string s;std::cin>>s;for(char c:"2468")for(char&k:s)if(k==c){std::cout<<(&k-&s[0])<<','<<c;return 0;}std::cout<<"-1,8";}

这是可读的版本:

#include<iostream>
#include<string>
int main() {
    std::string s; // auto s = ""s; (since C++14: -3 characters)
    std::cin >> s;
    for (char c : "2468")
        for (char& k : s)
            if (k == c) {
                std::cout << (&k - &s[0]) << ',' << c;
                return 0;
            }
    std::cout << "-1,8";
}

这是旧版本:

C ++ 11、175(包括两个换行符)

这是压缩版本:

#include<iostream>
#include<string>
int main(){std::string s;std::cin>>s;for(char c:"2468"){int i=s.find(c);if(i<s.size()){std::cout<<i<<','<<c;return 0;}}std::cout<<"-1,8";}

这是可读的版本:

#include<iostream>
#include<string>
int main() {
    std::string s;
    std::cin >> s;
    for (char c : "2468") {
        int i = s.find(c);
        if (i < s.size()) {
            std::cout << i << ',' << c; 
            return 0;
        }
    }
    std::cout << "-1,8";
}

尝试#define o std::cout<<。我认为它会将您的代码修剪1个字符。

@ user2509848,不,实际上是2个字符长。不过还是要谢谢:)
鞋子

k==c?std::cout<<(...),throw 0:0;- if当您需要的只是表达式时,条件运算符可以替换。throw是一个表达形式,而且比return。短一个字符。
MSalters 2014年

1

C,80个字符

main(){char a[81],b=strcspn((gets(a),a),"2468");printf("%d,%c",a[b]?b:-1,a[b]);}

1

C#-124

我参加聚会有点晚

void Main(string[]a){var x=a[0].Where(w=>char.IsDigit(w));var y=x.Min();Console.Write(y%2==0?a[0].IndexOf(y)+","+y:"-1,0");}

0

Haskell,79个字符

s&d=filter((==d).snd)$zip[-1..]$'0':s
main=interact$show.head.("24680">>=).(&)

输出格式运行起来很快而又松散:

& echo 523726 | runhaskell 16083-LowEven.hs 
(1,'2')
& echo 583746 | runhaskell 16083-LowEven.hs 
(4,'4')
& echo 53771 | runhaskell 16083-LowEven.hs 
(-1,'0')
& echo _4___2 | runhaskell 16083-LowEven.hs 
(5,'2')
& echo 25376 | runhaskell 16083-LowEven.hs 
(0,'2')

0

PowerShell的:145 103

对原始评论者的更改已从
asker的每个注释消除。

码:

"$([array]::IndexOf(($s=(read-host)-split''|?{$_}),($x=$s|?{$_%2-eq0}|?{$_-gt0}|sort|select -f 1))),$x"

演练:

"... "引号内的所有内容都将包含在输出中。

$(... )括号之间的所有内容都将被视为命令,并且将包含该代码的输出,而不是命令本身。

[array]::IndexOf(... )这用于获取数组元素的索引。它的第一个参数是要搜索的数组对象。第二个参数是要找到的对象。这仅输出第一个匹配元素的索引。我尝试过IndexOf直接针对$s(例如:)使用一种方法$s.IndexOf($x),但是由于我尚未弄清楚的某些原因而失败-它声称该方法在该对象上不存在。

(... )括号内的表达式将是的第一个参数IndexOf

$s= $ s将是存储用户输入的变量。

(read-host)-split'' 获取用户输入,并将其拆分为字符数组。

|?{$_}过滤掉由生成的多余的空数组元素-split''

,(... )括号内的表达式将是的第二个参数IndexOf

$x= $ s将是一个变量,用于存储用户输入中的最低偶数位。

$s|?{$_%2-eq0} 从$ s中取出偶数。

|?{$_-gt0} 使零无效。

|sort 对其余对象进行排序,默认顺序为升序。

|select -f 1 选择第一个对象,该对象现在将是最低的偶数位。

,$x上面的代码将输出我们最低偶数的索引。这将添加一个逗号,然后输出数字本身。

笔记:

这也许是规则4的延伸。如果没有偶数,输出将不包括第二个数字。

同样,如果输入包含非数字元素,这将引发一些非终止错误。该脚本仍将运行并提供正确的输出,但是您可能需要在运行之前将其设置$ErrorActionPreference'SilentlyContinue'


@DankoDurbić既然您已经击败了我,您是否可以帮助我弄清楚为什么我不能$s.IndexOf在这里使用?这给了我一个错误,说该对象不存在该方法,即使$s|gm它确实存在。它可以在我现在使用的系统上运行,但是不能在今天早些时候尝试使用的系统上运行。是版本兼容性问题吗?较早的系统是PSv2,当前的系统是PSv4。
Iszi 2013年

$sstring[],并且$s.indexof因为...[System.String[]] doesn't contain a method named 'indexOf'似乎不合理而无法正常工作(我正在运行PS 2.0)。$s|gm返回的成员System.String,不是System.String[]。我不确定为什么要这么做。
DankoDurbić13年

0

vb.net(108c)

Sub Main()
t=ReadLine()                          '12c
For Each c In "2468"                  '20c  
i=t.IndexOf(c)                        '14c
If i>=0 Then Exit For                 '21c
Next                                  ' 4c
WriteLine("{0},{1}",i,If(i<0,0,t(i))) '37c
End Sub

有点气味,因为它利用了VB的动态设置。选项显式关闭导入System.Console


0

使用LINQ的VB.net(193c)

这主要是利用LINQ查询。

Dim r = From d In "2468" Group Join q In ReadLine.Select(Function(c, p) New With {.c = c, .i = p})
                              On d Equals q.c Into g = Group
                                        Skip While g.Count = 0 ' 138c
WriteLine(If(r.Any,r(0).g(0).i&","&r(0).g(0).c,"-1,0"))        '  55c

0

高尔夫基础84,91个字符

:L1/L1_L2i`L1:fpart(L1,2)2_L1:SortA(L1)@cumSum(L1)=length(L1):Thend`-1#d`cumSum(L1):Endd`L1
  • 确保0输入中没有(不是偶数,谁说它必须是奇数?)
  • 获取输入到L1(清单1)
  • 每个值的循环找到模数均为2
  • 从最小到最大对L1进行排序
  • 显示索引(-1或累计总和)和最小的数字

0

伯恩壳(sh),88个字符

(echo 88;sed 's/./\n&/g')|nl -v-1|awk '{print $2,$1}'|sed '/^[^2468]/d'|sort -n|head -n1

我以为我会做字符串处理的事情很有趣。从技术上讲,它是从stdin读取的,但如果以交互方式运行它,则它将提示用户输入,因为键盘是默认的stdin流。使用基本的shell命令来拆分行中的输入,对其进行编号(使用众所周知的nl实用程序),过滤出符合条件的行,对其进行排序,然后输出最低位数的行。88 -1如果未找到偶数位,则打印。


0

C ++-223 221 字符:

#include<iostream>
#include<string>using namespace std;
int main(){int s=9;int p=-1;string x;cout<<"Enter characters: ";cin>>x;for(int i=0;i<x.length();i++){int n=x[i]-48;if(n%2==0&n<s){s=n;p=i;}}cout<<p<<", "<<s;return 0;}

可读版本:

#include<iostream>
#include<string>
using namespace std;

int main() {
    int s = 9;
    int p= - 1;
    string x;

    cout << "Enter characters: ";
    cin >> x;

    for (int i = 0; i < x.length(); i++) {
        int n = x[i] - 48;

        if (n % 2 == 0 & n < s) {
            s = n;
            p = i;
        }
    }

    cout << p << ", " << s;

    return 0;
}

它很长,但不比Java差。


实际上是221 + 2(换行符),否则将无法编译。
Shoe 2013年

哦。Word仅检测到221,我将对其进行更改。

0

Javascript 93个字符

b=prompt();((r=b.match(/[2468]/g)||[-1]).sort(function(a,b){return a-b})[0])+","+b.indexOf(r)

获取所有事件编号,对数组进行排序并输出第一位数字。


0

Mathematica,157个字符

f = Row@{If[(x = Min@#) == Infinity, -1, Position[#, x][[1, 1]]],
      ",", x} &[IntegerDigits@ToExpression@StringReplace[#,
       {"0" -> "1", x_?DigitQ :> x, _ -> "1"}] /. _?OddQ -> Infinity] &

inputs = {"25376", "523726", "583746", "53771", "_4___2"}

f /@ inputs // Column

1,2

2,2

5,4

-1,∞

6,2


0

朱莉娅84岁

julia> f(a)=(for i=2:2:8;(k=search(a,'0'+i))==0||return(k,i);end;(-1,0))
julia> f(readline(STDIN))
583746
(5,4)
julia> f(readline(STDIN))
_4___2
(6,2)

朱莉娅确实需要一种更短的途径来获取高尔夫投入。我计算了的定义f和对的一个调用f。一种基于索引的方式就是为什么答案与示例不同。


0

JavaScript-53个字符

for(y=prompt(x=0);x<8&&(i=y.indexOf(x+=2))<0;);x+''+i

从提示符读取输入,并输出(到控制台)最低的偶数字符,然后(无定界符)输出该字符的第一个索引;如果没有非零的偶数字符,则输出8-1


0

C,110个字符

i,f,r,c,m=9;main(){while(r=getchar()>31){c=r-48;i++;if(c>=0&&~c&1&&c<m)m=c,f=i;}printf("%i,%i",m>8?-1:f-1,m);}

松开

i,f,r,c,m=9;
main(){
  while(r=getchar()>31){
    c=r-48;
    i++;
    if(c>=0&&~c&1&&c<m) m=c,f=i;
  }
  printf("%i,%i",m>8?-1:f-1,m);
}

0

Javascript,69

a=prompt(),b=[-1,9];for(i in a)if(+a[i]%2==0&&+a[i]<b[1])b=[+i,+a[i]]

读取值,遍历每个字符,如果数字表示mod 2等于0并且数字小于已存储b的值,则替换其中的值b


0

雷布尔,69岁

s: input for n 2 8 2[if f: find s n[print[index? f f/1]q]]print[-1 0]

0

红宝石55

p gets.chars.sort*''=~/[2468]/?[$_.index($&),$&]:[-1,0]

0

JavaScript / jQuery 149

打高尔夫球

$(function(){
var i=prompt(),k=-1,n=0,c,e="2468";
while(n<i.length){c=i.charAt(n);k=e.indexOf(c);if(k>=0){break;}n++;}$('#d').append(k+","+n);
});

全文

<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
</head>
<body>
<div id="d"></div>
<script type="text/javascript">
$(function(){
var i=prompt();
var k=-1;
var n=0;
var c;
var e="2468";
while(n<i.length){
c=i.charAt(n);
k=e.indexOf(c);
if(k>=0){
break;
}
n++;
}
$('#d').append(k+","+n);
});
</script>
</body>
</html>
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.