숙제 시간! 문자열에서 가장 낮은 짝수 자리 찾기


12

Stack Overflow의 또 다른 멋진 질문은 도전 으로 바뀌 었습니다 !

다음과 같은 프로그램을 작성하십시오.

  1. 문자열 을 사용자 입력 ( 파이프 인 또는 명령 행 인수가 아님) 으로 승인합니다 . 입력의 데이터 유형은 문자열이어야합니다. 입력시 언어가 자동으로 사라지는 경우 문자열로 캐스트되어야합니다.
  2. 제 최저라도의 (기초하여 0 또는 1) 인덱스 찾아 자리 .
  3. 두 개의 정수 , 인덱스 및 가장 낮은 짝수를 인쇄 합니다.
  4. 숫자 가 없으면 인덱스로 -1을 반환하면 두 번째 숫자는 무엇이든 될 수 있습니다.
  5. 0 의 목적으로 도 짝수는 아닙니다 .

왼쪽의 문자열에 오른쪽의 값이 주어지면 테스트 예제가 표시됩니다.

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

승자 : 문자 수가 가장 적은 프로그램입니다. 보너스 나 페널티가 없습니다.

편집 : (표준 stdin) 사용자 입력 부분을 망쳤습니다. 기본적으로 파이핑 데이터가 없으며 명령 줄 인수가 없습니다. 프로그램 자체 내에서 일종의 사용자 프롬프트를 제공해야합니다.


4
가장 낮은 짝수의 정수가 두 자리이면? 좋아, 농담이었다.
Dr. belisarius

5
stdin의 문제점은 무엇입니까?
John Dvorak

1
@JanDvorak 임의의 규칙 때문에 그 이유가 있습니다.

7
왜 제로의 한계가 고르지 않습니까? 다소 이상해 보인다.
Iszi

3
입력 요구 사항은 실제로 이해가되지 않습니다. 대부분의 시스템에서 입력은 프로그램의 프롬프트 여부에 관계없이 stdin에서 발생합니다. 입력이 파이프로 연결되어 있는지 여부는 프로그램이 제어하지 않습니다. -사용자가 대화 형 프로그램을 만들도록하려면 입력 및 출력 (포맷 포함) 및 필요한 상호 작용에 대해 정확하게 알고 있어야합니다.
MtnViewMark

답변:


6

골프 스크립트, 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에게 감사드립니다 ?.

나는 이번에 스펙 해석에 매우 대담했다. 즉:

  • 스펙은 정수가 출력되는 순서를 요구하지 않습니다. 다른 @ peter의 제안 :x?x을 사용하여 수정하십시오 (임시 변수가 마음에 들지 않습니다.
  • 스펙에는 두 정수 사이에 구분자가 필요하지 않습니다. 찾은 자릿수는 항상 한 자릿수이므로 중요하지 않습니다. 그렇다면 추가 n@(스왑도 수행), n\그렇지 않거나 ]`출력 형식을으로 지정하십시오 ["8" -1].

그들은 임의의 요구 사항, 미친하지 요구 사항입니다 : P

또한, 스펙은 먼저 색인이 필요하지만, 그렇지 않은지 알 수있을 정도로 GolfScript를 충분히 읽을 수 없습니다.

@LegoStormtroopr은 순서를 언급하는 스펙의 유일한 요점은 # 4입니다. "짝수가없는 경우 인덱스로 -1을 리턴하면 두 번째 숫자는 무엇이든 될 수 있습니다." # 3은 순서를 지정하지 않습니다. "구분자가없는"대담함은 어떻습니까?
존 드보락

오 스냅, 당신은 올바른 선생님입니다! 출력 할 두 숫자를 언급했지만 순서는 언급하지 않았습니다. 나는 정정되었다!

당신은 대체 할 수 .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:의 인덱스 반환 z다음을 z.
  • : 그렇지 않은 경우 :
    • ¯1,0: 반품 (-1, 0)

1
와우, 나는 (... 아직하지 J 솔루션,하지만) 비트 APL을했습니다
존 드보락

설명? APL은 너무 자기 설명이다 ...;)
german_guy

3

파이썬 3,69

여기 에서 아이디어를 결합 합니다 .

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

나는 목록 대신 문자열을 사용하고 결과적으로 (이제 제거 된)`따옴표를 생략하는 것을 좋아합니다.
SimonT

@boothby 나는 파이썬 3을 사용하고 있음을 알지 못했을 것 같습니다. 파이썬 3에서 input () 사용자 입력으로 문자열을 허용합니다.
Wasi

@SimonT`(백틱)은 따옴표가 아닙니다. 파이썬 2 에서는 repr () 에 대해 더 이상 사용되지 않습니다.하지만 파이썬 3에서는 더 이상 사용할 수 없습니다. 따라서 파이썬 3에서``를 사용하려면 4 문자를 더 쓰는 repr (무언가)를 작성해야합니다. 그래서 내가 그것을 제거하는 이유;)
Wasi

@Wasi 그래, 내 실수.
boothby

@ 와시, 네 감사합니다. 나는 그것을 알고 있었고 "지금 제거되었다"는 말은 실제로 언어의 일부로서 제거되었다는 것을 의미했습니다. 건배.
SimonT

3

루비, 60 자

x=gets.chars.sort.find{|c|c=~/[2468]/};p x ?$_.index(x):-1,x
  • $_에 의해 읽힌 마지막 입력을 포함합니다 gets.
  • pinspect인수를 호출 하고 결과를 인쇄합니다.

3

펄 - - 94 - 53 개 문자 (48)

index()의 제로 기반 접근법 대신 pos에 하나를 사용 하고 시작합니다. CPAN이 없습니다. 이것을 실행하면 perl -nE입력을 기다릴 것입니다 STDIN.

첫 번째 match ( //) 연산은 $_입력에서 기본값 ( )에 대해 작동하며 주어진 짝수 sort와 일치하고 일치하는 값을 배열에 저장 한 다음 "scalar list"에 저장합니다 ($m). 스칼라 문맥에서 정렬 된 배열의 목록 값은 하나의 항목 길이이므로 숫자에서 가장 일치하는 짝수로 구성됩니다.

가장 낮은 짝수의 짝수 자릿수를 분리 한 다음 $m두 번째 일치 연산 을 사용 $m하여 원래 문자열에서 처음으로 나타나는 값을 찾습니다. 우리는 여전히 여기에서 기본값을 사용하고 $_있으며 $min 의 내용 $1( 두 번째 진술 의 ()주변 이유)에 대한 일치를 저장합니다 $m. 그 후, pos그리고 say나머지를 (더 적은 문자보다 index하고 print).

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"

내 초기 시도에서 나는 서두르고 오류를 일으켰다. 나는 단지 파이썬과 루비를 이길 원했다.

승자과 멋진 솔루션에 대한 다른 참가자들에게 축하 - 특히에 perl6:-) "사용할 수있는이 방법의 수 Perl6 적응 .comb(Masak으로는 Freenode에 제안 et.al. ).

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

파이썬 / 루비를 구타하는 데 너무 집중하여 짝수가 없어도 작동하지 않는 라이너 하나를 게시했습니다 $SHELL. "win"에 대한 내 역사 에서 위의 이전 버전을 열심히 사용했습니다 . 이 작업 버전은 엄청나게 길고 창피합니다. 나에게 올바르게 봉사 : 부끄러움을 피하기 위해 나중에 단축됩니다 :-(
G. Cito

이전 해킹 :if(/[2468]/){for$i(2,4,6,8){if(index($_,$i)>-1){say$i,",",index($_,$i)+1;last}}}else{say"0,-1"}
G. Cito

2
양호하지만 추가 골프를위한 공간이 남아 있습니다 ($m)=sort/[2468]/g;/$m/g;say$&?pos.",$&":"-1,0"(47 + 1 바이트, AFAIK -n는 추가 바이트).
Heiko Oberdiek

NB. pos오프셋을 반환합니다. 따라서 실제로 예제에서 1 기반 인덱스를 반환합니다.
draegtun

@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입니다.

당신이 여기있는 동안 의견과 irc에 대한 나의 입장을 고치는 데 도움을 준 G. Cito 를 올리십시오. :)


1
불행하게도이 먼저 인쇄도 수 (2468) 발견되지 가장 낮은 :( NB는. 또한에 문제가 $/.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 문자 버전으로 업데이트했는데 작동하는 것 같습니다. 숫자의 모든 짝수 자릿수를 정렬하면 정렬에서 (현재) 첫 번째 숫자를 사용하여 일치시킬 수 있으며 가장 낮은 숫자와 첫 번째 숫자를 사용해야합니다. 내가 맞아?
G. Cito

@ G.Cito보기 좋으며 이미 답을 +1했습니다. 나는 몇 글자를 면도하는 방법을 볼 수 있지만 Heiko가 내가 제안하려고했던 것보다 훨씬 잘 된 것을 본다!
draegtun

@draegtun 오, 이봐, 나는 그 문제를 완전히 이해하지 못했다. :( 정말 감사합니다! 최대한 빨리 업데이트하겠습니다
Mouq

@mouq 다음은 내가 게시 한 perl5 예제와 동일한 접근법을 사용하는 접근법 my $n; $_="333992";$n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/"입니다. 나는 .comb약 20 분 전에 배웠고 이미 좋아합니다 :-)
G. Cito

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

파이썬 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

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

파워 쉘, 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=... ){...} 그렇지 $i않은 경우 조건이 적용됩니다.0
  • "$i,$_";break 인덱스와 숫자를 출력하고 실행을 중지
  • "-1,0" 그렇지 않으면 출력 -1,0

적절한 인덱스가 출력되지 않습니다. PowerShell에서 질문에 제공된 테스트 사례에서와 같이 인덱스는 0에서 시작합니다.
Iszi

1
규칙 # 2는 인덱스가 0 또는 1을 기반으로 할 수 있다고 말합니다.
Danko Durbić

오. 그것을 발견하지 못했습니다. 어느 쪽이든, 여기에 5 자 길이의 0 기반 변형이 있습니다. $s=read-host;(2,4,6,8)|%{if(($i=$s.indexof("$_"))-gt-1){"$i,$_";break}};'-1,0'
Iszi

또한 괄호 2,4,6,8가 불필요하다고 확신합니다 .
Iszi

if 조건을 다음과 같이 변경하면 0부터 시작하는 변형을 2 자 더 길게 만들 수 있습니다.if(1+($i=$s.indexof("$_")))
Danko Durbić

2

C ++ 11, 173 (2 줄 바꿈 문자 포함)

압축 버전은 다음과 같습니다.

#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 (2 줄 바꿈 문자 포함)

압축 버전은 다음과 같습니다.

#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

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

하스켈, 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

원본의 변경
에 따라 제거 된 오류 quelch 코멘트 아스 커에서.

암호:

"$([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} 0을 무효화합니다.

|sort 나머지 개체를 정렬하며 기본 순서는 오름차순입니다.

|select -f 1 첫 번째 객체를 선택합니다. 이제 가장 낮은 짝수 자리가됩니다.

,$x위의 코드는 가장 낮은 짝수의 인덱스를 출력합니다. 쉼표를 추가 한 다음 숫자 자체를 출력합니다.

노트:

이것은 아마도 규칙 # 4를 약간 확장하고있을 것입니다. 짝수 자리가 없으면 출력에 두 번째 숫자가 포함되지 않습니다.

또한 입력에 숫자가 아닌 요소가 포함되어 있으면 종료되지 않는 오류가 발생합니다. 스크립트는 계속 실행되고 적절한 출력을 제공하지만 실행 $ErrorActionPreference하기 'SilentlyContinue'전에 설정 을 원할 수 있습니다 .


@ DankoDurbić 이제 당신이 저를 격파 시켰으니, 왜 내가 $s.IndexOf여기를 사용할 수 없었는지 알아 내 시겠습니까? 그것이 말했지만, 그 객체에 대해 메소드가 존재하지 않았다는 오류가 발생 $s|gm했습니다. 그것은 내가 지금하고있는 시스템에서 작동하지만 오늘 일찍 그것을 시도했던 시스템에서는 작동하지 않습니다. 버전 호환성 문제입니까? 이전 시스템은 PSv2이고 전류는 PSv4입니다.
Iszi

귀하는 $s이다 string[],하고 $s.indexof있기 때문에 일을하지 않습니다 ...[System.String[]] doesn't contain a method named 'indexOf'(내가 PS 2.0을 실행하는거야) 합리적인 보인다. $s|gmSystem.String아닌의 멤버를 반환합니다 System.String[]. 왜 그런지 잘 모르겠습니다.
Danko Durbić

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의 동적 설정을 악용하는 냄새가 약간 있습니다. Option Explicit OffImport 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 스트림이므로 사용자에게 입력하라는 메시지가 표시됩니다. 기본 쉘 명령을 사용하여 입력을 행으로 분할하고 번호를 지정하고 (잘 알려지지 않은 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 (줄 바꾸기 문자)이며 그렇지 않으면 컴파일되지 않습니다.
구두

오. 221 만 감지했습니다. 변경하겠습니다.

0

자바 스크립트 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)

Julia는 실제로 골프를위한 입력을 얻는 더 짧은 방법이 필요합니다. 의 정의 f와 한 번의 호출을 세었습니다 f. 하나의 기반 인덱싱은 답변이 예제와 다른 이유입니다.


0

자바 스크립트-53 자

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

프롬프트에서 입력을 읽고 콘솔에서 가장 낮은 짝수 문자 (구분 기호없이)를 해당 문자의 첫 번째 색인으로 출력합니다. 0이 아닌 짝수 문자가 없으면를 출력 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

자바 스크립트, 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

자바 스크립트 / 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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.