Thời gian làm bài tập! Tìm cho tôi chữ số chẵn thấp nhất trong một chuỗi


12

Một câu hỏi tuyệt vời khác từ Stack Overflow đã biến thành một thử thách !

Viết một chương trình:

  1. Chấp nhận một chuỗi làm đầu vào của người dùng (không được dẫn vào hoặc một đối số dòng lệnh). Kiểu dữ liệu của đầu vào phải là một chuỗi, nếu ngôn ngữ tự động tránh khỏi đầu vào, nó phải được truyền thành một chuỗi.
  2. Tìm chỉ số (0 hoặc 1 dựa) của chữ số chẵn thấp nhất đầu tiên .
  3. In 2 số nguyên , chỉ số và chữ số chẵn thấp nhất .
  4. Nếu không có chữ số chẵn , trả về -1 làm chỉ số, số thứ hai có thể là bất cứ thứ gì.
  5. Đối với các mục đích của số 0 này thậm chí không .

Ví dụ thử nghiệm, đưa ra chuỗi bên trái đầu ra các giá trị bên phải:

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

Người chiến thắng: là chương trình có số lượng nhân vật thấp nhất. Không có tiền thưởng, không có hình phạt.

chỉnh sửa: (về stdin) Tôi đã vặn vào phần đầu vào của người dùng, về cơ bản không có dữ liệu đường ống và không có đối số dòng lệnh. Bạn phải cung cấp một dấu nhắc người dùng của một số loại trong chính chương trình.


4
Nếu số nguyên chẵn thấp nhất có hai chữ số thì sao? Ok, twas một trò đùa.
Tiến sĩ belisarius

5
Có chuyện gì với stdin vậy?
John Dvorak

1
@JanDvorak Vì quy tắc tùy tiện, đó là lý do.

7
Tại sao giới hạn của số 0 không được chẵn? Điều đó có vẻ khá kỳ lạ.
Iszi

3
Yêu cầu đầu vào của bạn thực sự không có ý nghĩa: Đối với hầu hết các hệ thống, đầu vào đến từ stdin, cho dù được nhắc bởi chương trình hay không. Việc đầu vào có được dẫn vào hay không không thuộc quyền kiểm soát của chương trình. - Nếu mục đích của bạn là để người dùng tạo một chương trình tương tác, thì bạn nên chính xác về đầu vào và đầu ra (bao gồm cả định dạng) và yêu cầu tương tác.
MtnViewMark

Câu trả lời:


6

Golfscript, 26 (28) ký tự

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

Thí dụ:

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

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

kiểm tra trực tiếp: http://golfscript.apphb.com/?c=Oyc1Mzc3MScKLicyNDYnJjgrJDE8LjA9QD8%3D

Giải trình:

  • '#{gets}'là một lối thoát cho ruby ​​để đáp ứng các yêu cầu I / O; STDIN được coi là trống
  • . nhân bản đầu vào
  • '246'&8+ tìm thấy các chữ số chẵn có trong đầu vào, ngoại trừ 8 luôn được giữ lại
  • $1< sắp xếp danh sách, sau đó lấy chữ số đầu tiên, nhưng giữ nó dưới dạng một chuỗi
  • .@\?sắp xếp ngăn xếp {chữ số, đầu vào, chữ số}, sau đó tìm chữ số trong đầu vào; cảm ơn @peterTaylor đã nhận thấy tôi về chữ ký [mảng, mảng] của ?.

Tôi đã rất táo bạo với cách giải thích thông số kỹ thuật lần này; cụ thể là:

  • Thông số kỹ thuật không bắt buộc theo thứ tự các số nguyên là đầu ra; Sử dụng đề xuất của @ peter khác :x?xđể khắc phục (Tôi không thích các biến tạm thời.
  • Thông số kỹ thuật không yêu cầu bất kỳ dấu phân cách giữa hai số nguyên; vì chữ số được tìm thấy luôn là một chữ số duy nhất, điều này không quan trọng lắm. Nếu có, nối thêm n@(cũng thực hiện trao đổi), n\(không thực hiện) hoặc ]`(định dạng đầu ra là ["8" -1]).

Chúng không phải là những yêu cầu điên rồ, chúng là những yêu cầu tùy ý: P

Ngoài ra, thông số kỹ thuật yêu cầu chỉ số phải là đầu tiên, nhưng tôi không thể đọc GolfScript đủ tốt để biết nếu bạn không

@LegoStormtroopr điểm duy nhất của thông số đề cập đến thứ tự là # 4: "Nếu không có chữ số chẵn, trả về -1 làm chỉ số, số thứ hai có thể là bất cứ thứ gì". # 3 không chỉ định thứ tự; Điều gì về sự táo bạo "không phân cách"?
John Dvorak

Ôi chao, bạn đúng rồi thưa ngài! Tôi đã đề cập đến hai số để đầu ra, nhưng không phải là thứ tự. Tôi đứng sửa!

Bạn có thể thay thế .0=@?bằng .@\?hoặc :x?xđể lưu một ký tự và tránh sự nghi ngờ về thứ tự. Sử dụng tốt đẹp 8như một dự phòng.
Peter Taylor

5

APL (37)

(1 dựa trên mặc định, nhưng tuân theo ⎕IO)

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

Giải trình:

  • : đọc thông tin người dùng
  • m←⍵/⍨⍵∊'2468': xóa tất cả các ký tự không có 2468, lưu trữ trongm .
  • ×⍴m: xem có gì không
  • :: Nếu vậy:
    • z←⌊/⍎¨m: đánh giá từng ký tự trong m, tìm số thấp nhất và lưu trữ trongz .
    • z,⍨⍵⍳⍕z: trả về chỉ số của zin , theo sau là z.
  • : Nếu không:
    • ¯1,0: trở về (-1, 0)

1
Ồ, tôi đã đánh bại APL (không phải với giải pháp J, nhưng vẫn ...)
John Dvorak

Giải trình? APL rất tự giải thích ...;)
German_guy

3

Trăn 3, 69

kết hợp ý tưởng từ đây .

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

Tôi thích việc sử dụng một chuỗi hơn là một danh sách và kết quả là thiếu sót của dấu ngoặc kép (hiện đã bị xóa).
SimonT

@boothby Tôi đoán bạn không nhận thấy tôi đang sử dụng python 3. Trong python 3 input () Chấp nhận một chuỗi làm đầu vào của người dùng.
Wasi

@SimonT `(backticks) không chỉ là trích dẫn. Nó là một bí danh không dùng nữa cho repr () trong python 2. Nhưng nó không còn có sẵn trong Python 3. Vì vậy, nếu tôi muốn sử dụng `` trên một cái gì đó trong python 3, tôi phải viết repr (một cái gì đó) tốn thêm 4 ký tự. Đó là lý do tại sao tôi thoát khỏi nó;)
Wasi 27/12/13

@ Vâng đúng vậy, sai lầm của tôi.
gian hàng

@Wasi, vâng cảm ơn bạn. Tôi đã nhận thức được điều đó và bằng cách "bây giờ loại bỏ" tôi thực sự có nghĩa là loại bỏ hoàn toàn như một phần của ngôn ngữ. Chúc mừng.
SimonT

3

Ruby, 60 ký tự

x=gets.chars.sort.find{|c|c=~/[2468]/};p x ?$_.index(x):-1,x
  • $_chứa đầu vào cuối cùng được đọc bởi gets.
  • pgọi inspectcác đối số và in kết quả.

3

perl - - 94 - 53 ký tự (hoặc 48)

Thay vì index()cách tiếp cận dựa trên số không, chúng tôi sử dụng posvà bắt đầu tại một; không có CPAN. Chạy cái này với perl -nEvà nó sẽ đợi đầu vào (cái mà nó cũng có thể nhận được từSTDIN ).

Hoạt động so khớp đầu tiên ( //) hoạt động trên giá trị mặc định ( $_) từ đầu vào, khớp với các số chẵn đã cho, đưa sortcác kết quả khớp vào một mảng và sau đó lưu trữ chúng trong "danh sách vô hướng"($m) . Trong ngữ cảnh vô hướng, giá trị danh sách của mảng được sắp xếp là một mục dài và do đó bao gồm chữ số chẵn thấp nhất khớp với số.

Khi đã tách được chữ số trùng khớp thấp nhất, sau đó chúng tôi sử dụng $mcho thao tác khớp thứ hai sẽ tìm thấy sự xuất hiện đầu tiên của giá trị $mtrong chuỗi gốc. Chúng tôi vẫn đang sử dụng giá trị mặc định ở đây $_và chúng tôi đang lưu kết quả khớp với nội dung $mtrong $1(lý do cho ()xung quanh $mtrong câu lệnh thứ hai). Sau đó, possaylàm phần còn lại (và có ít ký tự hơn indexprint).

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

Nếu thứ tự đầu ra hoặc dấu phẩy không quan trọng thì có thể rút ngắn 5 ký tự này:

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

Trong nỗ lực trước đó của tôi, tôi đã vội vã và mắc lỗi - tôi chỉ muốn đánh bại trăn và hồng ngọc (nhưng không thành công) ... thở dài.

Xin chúc mừng người chiến thắng và những người tham gia khác về các giải pháp tuyệt vời của họ - đặc biệt là perl6:-) Có thể sử dụng phương pháp thích ứng Perl6 của phương pháp này " .comb(được đề xuất trên freenode bởi Masak et.al. ).

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

Đã quá tập trung vào việc đánh bại trăn / ruby ​​đến nỗi tôi đã đăng một lớp lót không hoạt động khi không có số chẵn: háo hức sử dụng phiên bản trước đó từ $SHELLlịch sử của tôi để "giành chiến thắng". Phiên bản làm việc này dài vô lý và lúng túng. Phục vụ tôi đúng: sẽ rút ngắn sau để tránh sự xấu hổ :-(
G. Cito

hack cũ: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
Tốt, nhưng còn lại chỗ để chơi gôn: ($m)=sort/[2468]/g;/$m/g;say$&?pos.",$&":"-1,0"(47 + 1 byte, AFAIK -ntốn thêm một byte).
Heiko Oberdiek

Lưu ý postrả về phần bù. Vì vậy, trong thực tế, nó trả về chỉ số dựa trên 1 trong ví dụ của bạn.
Drainegtun

@draegtun oopsie :-) cảm ơn. @Heiko đúng là: công tắc nên tính cách khác perl's -Msẽ giành chiến thắng mỗi khi ;-)
G. Cito

3

Perl 6, 37 55 60 ký tự

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

EDIT: Tôi đã hiểu nhầm câu hỏi lần đầu tiên. Bản cập nhật này phải chính xác. Nó tìm thấy số 2,4,6 hoặc 8 thấp nhất mà đầu vào chứa, và sau đó thực hiện một biểu thức chính quy khớp với đầu vào có số thấp nhất đó. $/.fromcó được vị trí của trận đấu và',', $/.Int là dấu phẩy cộng với chính trận đấu hoặc 0 nếu văn bản không khớp.

Trong khi bạn ở đây, hãy truy cập G. Cito , người đã giúp tôi sửa bài viết của tôi trong phần bình luận và trên irc :)


1
Thật không may, điều này in số chẵn đầu tiên (2468) được tìm thấy và không phải là thấp nhất :( NB. Ngoài ra, có một vấn đề $/.fromkhi không tìm thấy gì (đây có thể là một lỗi trong phiên bản Rakudo cũ của tôi). Đây là một biến thể của giải pháp của bạn hoạt động ( đối với tôi!) my$x=get;for 2,4,6,8 ->$n{if $x~~/$n/ {say $/.from,",$/";exit}};say "-1 0"; Xuất hiện ở 75 ký tự nhưng tôi chắc chắn có thể thực hiện giải pháp perl6 ngắn hơn.
Drainegtun

@draegtun ... Tôi đã mắc một lỗi tương tự với lần thử perl5 của tôi ngày hôm qua (xem bên dưới). Sửa chữa của tôi thêm 70 ký tự! Chỉ cần cập nhật nó với phiên bản ~ 50 char - có vẻ như hoạt động. Tôi nghĩ rằng nếu bạn sắp xếp tất cả các chữ số chẵn trong số thì bạn có thể thực hiện khớp bằng chữ số đầu tiên (bây giờ) trong sắp xếp và chắc chắn rằng bạn có số thấp nhất và số đầu tiên. Tôi có đúng không
G. Cito

@ G.Cito Có vẻ tốt với tôi và đã +1 câu trả lời của bạn. Tôi có thể thấy cách cạo sạch một vài ký tự nhưng tôi thấy Heiko đã hoàn thành tốt hơn những gì tôi sẽ đề xuất!
Drainegtun

@draegtun Oh, geez, tôi đã hoàn toàn hiểu sai câu hỏi rồi :( Cảm ơn bạn rất nhiều! Tôi sẽ cập nhật ASAP này
Mouq

@mouq Đây là một cách tiếp cận sử dụng cách tiếp cận tương tự như ví dụ perl5 mà tôi đã đăng dưới đây : my $n; $_="333992";$n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/". Tôi đã học được khoảng .comb20 phút trước và tôi đã thích nó :-)
G. Cito

2

J, 44 ký tự

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

xuất ký tự cuối cùng của đầu vào nếu không tìm thấy chữ số chẵn

Thí dụ:

   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|
+--+-+

Giải trình:

  • echo ... i=.1!:1]1là đầu vào / đầu ra. Cách lâu hơn tôi muốn nó. Đầu vào cũng được cất vào i.
  • '2468'i.~ tìm thấy sự xuất hiện đầu tiên của mỗi chữ số chẵn trong đầu vào, trả về độ dài đầu vào nếu không thể tìm thấy chữ số
  • (#~(#i)&>)đọc "chọn theo độ dài của đầu vào lớn hơn giá trị này"; nói cách khác, chọn các chỉ số đó trỏ vào đầu vào. Cách lâu hơn tôi muốn nó.
  • _1,~nối -1 vào mặt sau. Gạch dưới là cách J đại diện cho các giá trị âm.
  • {. chọn phần tử đầu tiên
  • (;{&i)nối nó với ký tự đầu vào tại vị trí đó trong hai hộp; vì chúng ta ghép một số với một nhân vật, nên ghép nối không phải quyền anh ( ,) sẽ không làm được. Nếu muốn hiển thị unboxed, chỉ mục cần được định dạng ( ":) trước tiên với chi phí là hai ký tự.

2

Con trăn 2.7 - 76

Một câu trả lời tham khảo tôi hoàn toàn mong đợi để được đánh bại. Nhưng để bắt đầu mọi người:

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

3
bạn có thể cạo sạch một nhân vật bằng cách thay đổi indexthành find; bạn cũng có thể thay đổi [2,4,6,8]thành 2,4,6,8(có không gian phía trước).
Justin

4
Ngắn gọn hơn:print[(s.find(`e`),e)for e in 2,4,6,8if`e`in s+'8'][0]
grc

4
Tôi nghĩ bạn đã phá vỡ quy tắc của riêng mình ... Từ khi nào raw_input không phải là 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])

Ví dụ (trong R, chỉ mục bắt đầu từ 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 lưu trữ đầu vào của người dùng vào $s
  • 2,4,6,8|%{...} chạy những gì bên trong {}cho các chữ số 2,4,6 và 8
  • $i=$s.indexof("$_")+1 đặt $ithành chỉ mục dựa trên 1 của một chữ số trong $shoặc 0nếu không tìm thấy chữ số
  • if( $i=... ){...} điều kiện sẽ đúng khi $ikhông0
  • "$i,$_";break xuất chỉ mục và chữ số, và dừng thực thi
  • "-1,0" mặt khác đầu ra -1,0

Điều này không xuất ra các chỉ số thích hợp. Trong PowerShell, như trong các trường hợp thử nghiệm được đưa ra cho câu hỏi, các chỉ mục bắt đầu từ 0.
Iszi

1
Quy tắc số 2 cho biết chỉ số có thể là 0 hoặc 1 dựa trên.
Danko Durbić

Oh. Không phát hiện ra điều đó. Dù bằng cách nào, đây là một biến thể dựa trên zero, chỉ dài hơn 5 ký tự. $s=read-host;(2,4,6,8)|%{if(($i=$s.indexof("$_"))-gt-1){"$i,$_";break}};'-1,0'
Iszi

Ngoài ra, tôi khá chắc chắn rằng dấu ngoặc đơn xung quanh 2,4,6,8là không cần thiết.
Iszi

Biến thể dựa trên zero có thể được tạo dài hơn 2 ký tự, nếu bạn thay đổi điều kiện if thành:if(1+($i=$s.indexof("$_")))
Danko Durbić

2

C ++ 11, 173 (bao gồm hai ký tự dòng mới)

Đây là phiên bản nén:

#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";}

Đây là phiên bản dễ đọc:

#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";
}

Đây là phiên bản cũ hơn:

C ++ 11, 175 (bao gồm hai ký tự dòng mới)

Đây là phiên bản nén:

#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";}

Đây là phiên bản dễ đọc:

#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";
}

Hãy thử #define o std::cout<<. Tôi nghĩ rằng nó cắt mã của bạn bằng 1 ký tự.

@ user2509848, không, nó thực sự dài hơn 2 ký tự. Nhưng dù sao cũng cảm ơn :)
Giày

k==c?std::cout<<(...),throw 0:0;- toán tử điều kiện có thể thay thế if, khi tất cả những gì bạn cần là biểu thức. throwlà một biểu thức và cũng là một ký tự ngắn hơn return.
MSalters

1

C, 80 ký tự

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

1

C # - 124

Tôi đến bữa tiệc muộn một chút

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 ký tự

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

Điều này chạy nhanh và lỏng lẻo với định dạng đầu ra:

& 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

Thay đổi từ
quelch ban đầu bị xóa mỗi bình luận từ người hỏi.

Mã số:

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

Hướng dẫn:

"... "Tất cả mọi thứ trong dấu ngoặc kép sẽ được bao gồm trong đầu ra.

$(... )Mọi thứ giữa dấu ngoặc đơn sẽ được coi là một lệnh và đầu ra của mã đó sẽ được đưa vào thay vì chính các lệnh.

[array]::IndexOf(... )Điều này được sử dụng để lấy chỉ mục của một phần tử với mảng. Tham số đầu tiên của nó là đối tượng mảng được tìm kiếm. Tham số thứ hai là đối tượng được tìm thấy. Điều này chỉ xuất ra chỉ mục của phần tử phù hợp đầu tiên. Tôi đã thử đơn giản bằng cách sử dụng một IndexOfphương thức trực tiếp chống lại $s(ví dụ:$s.IndexOf($x) nhưng điều này không thành công vì một số lý do tôi chưa tìm ra - nó tuyên bố phương thức này không tồn tại trên đối tượng đó.

(... )Biểu thức trong ngoặc đơn sẽ là tham số đầu tiên cho IndexOf.

$s= $ s sẽ là một biến để lưu trữ đầu vào của người dùng.

(read-host)-split'' Nhận đầu vào của người dùng và chia nó thành một mảng các ký tự.

|?{$_}Lọc ra các phần tử mảng trống bổ sung được tạo bởi -split''.

,(... )Biểu thức trong ngoặc đơn sẽ là tham số thứ hai cho IndexOf.

$x= $ s sẽ là một biến để lưu trữ chữ số chẵn thấp nhất từ ​​đầu vào của người dùng.

$s|?{$_%2-eq0} Rút ra các số chẵn từ $ s.

|?{$_-gt0} Vô hiệu bằng không.

|sort Sắp xếp các đối tượng còn lại, thứ tự mặc định là tăng dần.

|select -f 1 Chọn đối tượng đầu tiên, mà bây giờ sẽ là chữ số thấp nhất chẵn.

,$xĐoạn mã trên sẽ xuất ra chỉ số của chữ số chẵn thấp nhất của chúng tôi. Điều này thêm dấu phẩy và sau đó xuất ra chữ số.

Ghi chú:

Đây có lẽ là quy tắc kéo dài # 4 một chút. Nếu không có chữ số chẵn, đầu ra sẽ không bao gồm số thứ hai.

Ngoài ra, điều này sẽ đưa ra một số lỗi không kết thúc nếu đầu vào bao gồm các phần tử không phải là số. Tập lệnh vẫn sẽ chạy và đưa ra đầu ra thích hợp, nhưng bạn có thể muốn đặt $ErrorActionPreferencethành 'SilentlyContinue'trước khi chạy tập lệnh.


@ DankoDurbić Bây giờ bạn đã đánh bại tôi một cách rõ ràng, bạn có phiền giúp tôi tìm hiểu tại sao tôi không thể sử dụng $s.IndexOfở đây không? Nó đã cho tôi một lỗi khi nói rằng phương thức này không tồn tại cho đối tượng đó, mặc dù đã $s|gmnói rằng nó đã xảy ra. Nó hoạt động trên hệ thống mà tôi đang sử dụng, nhưng không phải là hệ thống mà tôi đã cố gắng thực hiện vào đầu ngày hôm nay. Đây có phải là một vấn đề tương thích phiên bản? Hệ thống trước đó là PSv2, hiện tại là PSv4.
Iszi

Của bạn $sstring[]$s.indexofkhông hoạt động bởi vì ...[System.String[]] doesn't contain a method named 'indexOf', điều này có vẻ hợp lý (Tôi đang chạy PS 2.0). $s|gmtrả lại thành viên của System.String, không System.String[]. Tôi không chắc tại sao nó lại như vậy.
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

Smells slightly cos it's exploiting VB's dynamic setting. Option Explicit Off and Imports System.Console.


0

VB.net (193c) using LINQ

This one is primarily utilising a LINQ query.

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

Golf-Basic 84, 91 characters

:L1/L1_L2i`L1:fpart(L1,2)2_L1:SortA(L1)@cumSum(L1)=length(L1):Thend`-1#d`cumSum(L1):Endd`L1
  • Make sure there's no 0 in the input (it's not even, who said it had to be odd?)
  • Get input into L1 (List 1)
  • Loop finding modulus of 2 for each value
  • Sort L1 from smallest to highest
  • Display the index (either -1 or the cumulative sum) and the smallest number

0

Bourne shell (sh), 88 chars

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

I thought I'd do a string-processing thing for fun. Technically it reads from stdin, but if you run it interactively it'll prompt the user for input since the keyboard is the default stdin stream. Uses basic shell commands to split up the input on lines, number them (using the ill-known nl utility), filter out lines fitting the criteria, sort them and output the lowest-digit one. Prints 88 -1 if no even digit was found.


0

C++ - 223 221 Characters:

#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;}

Readable version:

#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;
}

It is long, but not as bad as Java.


It's actually 221 + 2 (new line characters) otherwise it won't compile.
Shoe

Oh. Word only detected 221, I will change it.

0

Javascript 93 characters

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

Get all event numbers, sort the array and prints the first digit.


0

Mathematica, 157 characters

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

Julia, 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 really needs a shorter way to get input for golfing. I counted the definition of f and one call to f. One based indexing is why the answers are different from the examples.


0

JavaScript - 53 Characters

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

Reads input from prompt and outputs (to the console) the lowest even character then (without a delimiter) the first index of that character; if there are no non-zero even characters then it outputs 8-1.


0

C, 110 Characters

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);}

ungolfed:

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

Reads the value, iterates through each character, if the number representation mod 2 equals 0 and the number is less that what is already stored in b, replace the values in b


0

Rebol, 69

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

0

Ruby 55

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

0

JavaScript/jQuery 149

Golfed

$(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);
});

Full source

<!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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.