Waktu pekerjaan rumah! Temukan saya digit genap terendah dalam sebuah string

12

Pertanyaan brilian lain dari Stack Overflow berubah menjadi tantangan !

Tulis sebuah program yang:

  1. Menerima string sebagai input pengguna (tidak disalurkan atau argumen baris perintah). Tipe data dari input harus berupa string, jika bahasa melakukan eval otomatis pada input, itu harus dilemparkan ke string.
  2. Menemukan indeks (berdasarkan 0 atau 1) dari angka genap terendah pertama .
  3. Mencetak 2 bilangan bulat , indeks dan digit genap terendah .
  4. Jika tidak ada digit genap , kembalikan -1 sebagai indeks, angka kedua dapat berupa apa saja.
  5. Untuk keperluan ini nol bahkan tidak .

Contoh uji, diberi string di output kiri nilai-nilai di kanan:

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

Pemenang: adalah program dengan jumlah karakter terendah. Tidak ada bonus, tidak ada penalti.

sunting: (tentang stdin) Saya mengacaukan pada bagian input pengguna, pada dasarnya tidak ada data perpipaan, dan tidak ada argumen baris perintah. Anda harus memberikan prompt pengguna semacam dalam program itu sendiri.

Komunitas
sumber
4
Bagaimana jika bilangan bulat genap terendah memiliki dua digit? Oke, ini lelucon.
Dr. belisarius
5
Apa yang salah dengan stdin?
John Dvorak
1
@JanDvorak Karena aturan yang sewenang-wenang, itu sebabnya.
7
Mengapa batasan nol tidak genap? Itu agak aneh.
Iszi
3
Persyaratan input Anda benar-benar tidak masuk akal: Untuk sebagian besar sistem, input berasal dari stdin, baik yang diminta oleh program atau tidak. Apakah input disalurkan atau tidak tidak di bawah kendali program. - Jika tujuan Anda adalah membuat pengguna membuat program interaktif, maka Anda harus tepat tentang input dan output (termasuk pemformatan), dan interaksi yang diperlukan.
MtnViewMark

Jawaban:

6

Golfscript, 26 (28) karakter

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

Contoh:

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

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

tes langsung: http://golfscript.apphb.com/?c=Oyc1Mzc3MScKLicyNDYnJjgrJDE8LjA9QD8%3D

Penjelasan:

  • '#{gets}'adalah jalan keluar menuju ruby ​​untuk memenuhi persyaratan I / O; STDIN diasumsikan kosong
  • . klon input
  • '246'&8+menemukan digit mana yang ada dalam input, kecuali 8selalu dipertahankan
  • $1< mengurutkan daftar, lalu mengambil digit pertama, tetapi menyimpannya sebagai string
  • .@\?memesan tumpukan {digit, input, digit}, lalu menemukan digit di input; terima kasih @peterTaylor karena telah memperhatikan tanda tangan [array, array] saya ?.

Saya sudah sangat berani dengan interpretasi khusus kali ini; yaitu:

  • Spesifikasi ini tidak mengamanatkan agar urutan bilangan bulat adalah output; Gunakan saran @ peter lainnya :x?xuntuk memperbaikinya (saya tidak suka variabel sementara.
  • Spesifikasi tidak memerlukan pembatas antara kedua bilangan bulat; karena digit yang ditemukan selalu satu digit, ini tidak masalah. Jika ya, tambahkan n@(yang juga melakukan swap), n\(yang tidak), atau ]`(yang memformat output sebagai ["8" -1]).
John Dvorak
sumber
Mereka bukan persyaratan gila, mereka persyaratan sewenang-wenang: P
Juga, spek membutuhkan indeks untuk menjadi yang pertama, tetapi saya tidak bisa membaca GolfScript dengan cukup baik untuk mengetahui apakah Anda tidak
@LegoStormtroopr satu-satunya titik dari spesifikasi yang menyebutkan urutannya adalah # 4: "Jika tidak ada digit genap, kembalikan -1 sebagai indeks, angka kedua dapat berupa apa saja". # 3 tidak menentukan urutan; bagaimana dengan keberanian "tanpa pembatas"?
John Dvorak
Oh snap, Anda benar Pak! Saya menyebutkan dua angka ke output, tetapi tidak urutannya. Saya berdiri dikoreksi!
Anda dapat mengganti .0=@?dengan .@\?atau :x?xuntuk menyimpan satu karakter dan menghindari keraguan atas pesanan. Penggunaan yang bagus 8sebagai fallback.
Peter Taylor
5

APL (37)

(Berbasis 1 secara default, tetapi patuh ⎕IO)

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

Penjelasan:

  • : baca input pengguna
  • m←⍵/⍨⍵∊'2468': hapus semua karakter yang bukan 2468, simpan di m.
  • ×⍴m: lihat apakah ada
  • :: Jika begitu:
    • z←⌊/⍎¨m: evaluasi setiap karakter dalam m, cari angka terendah dan simpan di z.
    • z,⍨⍵⍳⍕z: kembalikan indeks zmasuk , diikuti oleh z.
  • : Jika tidak:
    • ¯1,0: kembali (-1, 0)
marinus
sumber
1
Wow, saya sudah mengalahkan APL (bukan dengan solusi J, tapi masih ...)
John Dvorak
Penjelasan? APL sangat menjelaskan sendiri ...;)
german_guy
3

Python 3, 69

menggabungkan ide-ide dari sini .

s=input();print(([(s.find(x),x)for x in'2468'if x in s]+[(-1,0)])[0]) 
Wasi
sumber
Saya lebih suka menggunakan string daripada daftar, dan hasil penghilangan dari kutipan `(sekarang dihapus).
SimonT
@ bbyby Saya kira Anda tidak melihat saya menggunakan python 3. Dalam python 3 input () Menerima string sebagai input pengguna.
Wasi
@SimonT `(backticks) bukan hanya kutipan. Ini adalah alias usang untuk repr () di python 2. Tapi itu tidak lagi tersedia di Python 3. Jadi, jika saya ingin menggunakan `` pada sesuatu di python 3, saya harus menulis repr (sesuatu) yang harganya 4 chars lebih. Itulah sebabnya saya menyingkirkannya;)
Wasi
@ Ya betul, kesalahan saya.
Stanby
@Wasi, ya terima kasih. Saya menyadari hal itu dan dengan "sekarang dihapus" sebenarnya saya maksudkan dihapus sebagai bagian dari bahasa sama sekali. Bersulang.
SimonT
3

Ruby, 60 karakter

x=gets.chars.sort.find{|c|c=~/[2468]/};p x ?$_.index(x):-1,x
  • $_berisi input terakhir yang dibaca oleh gets.
  • pmeminta inspectargumen dan mencetak hasilnya.
sayap kanan
sumber
3

perl - - 94 - 53 karakter (atau 48)

Alih-alih index()pendekatan berbasis nol kami menggunakan posdan mulai pada satu; tidak ada CPAN. Jalankan ini dengan perl -nEdan akan menunggu input (yang juga dapat menerima dari STDIN).

Operasi pertandingan pertama ( //) bekerja pada nilai default ( $_) dari input, cocok dengan angka genap yang diberikan, sortmemasukkan pertandingan ke dalam array, dan kemudian menyimpannya dalam "daftar skalar" ($m). Dalam konteks skalar, nilai daftar array yang disortir adalah satu item panjang dan dengan demikian terdiri dari digit genap yang paling cocok dalam angka.

Setelah mengisolasi angka yang cocok dengan angka terendah, kami kemudian gunakan $muntuk operasi pertandingan kedua yang akan menemukan kemunculan pertama dari nilai $mdalam string asli. Kami masih menggunakan nilai default di sini $_dan kita menyelamatkan pertandingan melawan isi $mdi $1(alasan untuk ()sekitar $mdalam pernyataan kedua). Setelah itu, posdan saylakukan sisanya (dan dalam karakter lebih sedikit dari indexdan print).

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

Jika output order atau koma tidak penting maka mungkin untuk membuat 5 karakter ini lebih pendek:

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

Dalam upaya saya sebelumnya, saya bergegas dan membuat kesalahan - saya hanya ingin mengalahkan python dan ruby ​​(tetapi gagal) ... huh.

Selamat kepada pemenang dan peserta lain atas solusi keren mereka - terutama untuk perl6:-) Kemungkinan adaptasi Perl6 dari pendekatan ini dapat digunakan " .comb(disarankan pada freenode oleh Masak et.al. ).

$_=get;my $n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/"
G. Cito
sumber
Sangat fokus pada pemukulan python / ruby ​​sehingga saya memposting satu liner yang tidak berfungsi ketika tidak ada angka genap: bersemangat menggunakan versi sebelumnya di atas dari $SHELLsejarah saya untuk "menang". Versi yang berfungsi ini sangat panjang dan memalukan. Layani saya dengan benar: akan dipersingkat nanti untuk menghindari rasa malu :-(
G. Cito
retas lama: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
Bagus, tetapi masih ada ruang untuk bermain golf lebih lanjut: ($m)=sort/[2468]/g;/$m/g;say$&?pos.",$&":"-1,0"(47 +1 byte, AFAIK -nmembutuhkan byte tambahan).
Heiko Oberdiek
NB. posmengembalikan offset. Jadi sebenarnya ini mengembalikan indeks berbasis 1 dalam contoh Anda.
draegtun
@draegtun oopsi :-) terima kasih. @ Heiko benar bahwa: switch harus dihitung jika tidak perl, -Makan menang setiap kali ;-)
G. Cito
3

Perl 6, 37 55 60 karakter

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

EDIT: Saya salah paham pertanyaan pertama kali. Pembaruan ini harus benar. Ia menemukan angka terendah 2,4,6, atau 8 yang berisi input, dan kemudian melakukan pencocokan regex terhadap input dengan angka terendah itu. $/.frommendapat posisi pertandingan dan ',', $/.Intkoma plus pertandingan itu sendiri, atau 0 jika teksnya tidak cocok.

Saat Anda di sini, lanjutkan upvote G. Cito , yang membantu saya memperbaiki entri saya di komentar dan di irc :)

Mouq
sumber
1
Sayangnya ini mencetak angka genap pertama (2468) yang ditemukan dan bukan yang terendah :( NB. Juga ada masalah $/.fromketika tidak ada yang ditemukan (ini mungkin bug dalam versi Rakudo saya yang lama). Berikut adalah variasi dari solusi Anda yang berfungsi ( untuk saya!) Masuk my$x=get;for 2,4,6,8 ->$n{if $x~~/$n/ {say $/.from,",$/";exit}};say "-1 0"; dengan 75 karakter tetapi saya yakin solusi perl6 yang lebih singkat dapat dibuat.
draegtun
@draegtun ... Saya membuat kesalahan serupa dengan upaya perl5 saya kemarin (lihat di bawah). Perbaikan saya menambahkan 70 karakter! Baru saja memperbaruinya dengan versi char ~ 50 - yang sepertinya berfungsi. Saya pikir jika Anda mengurutkan semua angka genap dalam angka, maka Anda dapat melakukan kecocokan dengan menggunakan digit pertama (sekarang) dalam pengurutan dan pastikan Anda memiliki yang terendah dan yang pertama. Apakah saya benar?
G. Cito
@ G.Cito Terlihat bagus untuk saya dan sudah memberi +1 jawaban Anda. Aku bisa melihat cara untuk mencukur beberapa karakter tapi aku melihat Heiko telah selesai bahkan lebih baik daripada apa yang akan aku sarankan!
draegtun
@draegtun Oh, ya ampun, saya benar-benar salah paham pertanyaannya kemudian :( Terima kasih banyak! Saya akan memperbarui ASAP ini
Mouq
@mouq Berikut ini adalah pendekatan yang menggunakan pendekatan yang sama seperti contoh perl5 saya diposting di bawah ini: my $n; $_="333992";$n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/". Saya belajar sekitar .comb20 menit yang lalu dan saya sudah menyukainya :-)
G. Cito
2

J, 44 karakter

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

menampilkan karakter terakhir dari input jika tidak ditemukan digit genap

Contoh:

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

Penjelasan:

  • echo ... i=.1!:1]1adalah input / output. Jauh lebih lama dari yang kuinginkan. Input disimpan ijuga.
  • '2468'i.~ menemukan kemunculan pertama setiap digit genap dalam input, mengembalikan panjang input jika digit tersebut tidak dapat ditemukan
  • (#~(#i)&>)berbunyi "pilih dengan panjang input lebih besar dari ini"; dengan kata lain, pilih indeks yang menunjuk ke input. Jauh lebih lama dari yang kuinginkan.
  • _1,~menambahkan -1 ke belakang. Garis bawah adalah cara J untuk mewakili nilai negatif.
  • {. memilih elemen pertama
  • (;{&i)menggabungkannya dengan karakter input pada posisi itu dalam dua kotak; karena kita menggabungkan angka dengan karakter, gabungan non-tinju ( ,) tidak akan berhasil. Jika tampilan tanpa kotak diinginkan, indeks perlu diformat ( ":) terlebih dahulu dengan biaya dua karakter.
John Dvorak
sumber
2

Python 2.7 - 76

Jawaban referensi yang saya harapkan akan dikalahkan. Tetapi untuk memulai orang:

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

sumber
3
Anda dapat mengurangi karakter dengan mengubah indexke find; Anda juga dapat mengubah [2,4,6,8]ke 2,4,6,8(dengan ruang di depan).
Justin
4
Lebih pendek:print[(s.find(`e`),e)for e in 2,4,6,8if`e`in s+'8'][0]
grc
4
Saya pikir Anda melanggar aturan Anda sendiri ... Sejak kapan raw_input tidak 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])

Contoh (dalam R, indeks dimulai pada 1):

_4_502
6  2

_3_501
-1 0 

583746
5  4
Sven Hohenstein
sumber
2

Powershell, 76 73 71

$s=read-host;2,4,6,8|%{if($i=$s.indexof("$_")+1){"$i,$_";break}};"-1,0"
  • $s=read-host menyimpan input pengguna ke $s
  • 2,4,6,8|%{...} menjalankan apa yang ada di dalam {}untuk digit 2,4,6, dan 8
  • $i=$s.indexof("$_")+1 set $ike indeks berbasis 1 digit di $satau 0jika digit tidak ditemukan
  • if( $i=... ){...} kondisi akan benar ketika $itidak0
  • "$i,$_";break menampilkan indeks dan digit, dan menghentikan eksekusi
  • "-1,0" jika tidak, output -1,0
Danko Durbić
sumber
Ini tidak menampilkan indeks yang tepat. Di PowerShell, seperti dalam kasus uji yang diberikan untuk pertanyaan, indeks dimulai dari nol.
Iszi
1
Peraturan # 2 mengatakan indeks bisa berbasis 0 atau 1.
Danko Durbić
Oh Tidak menemukan itu. Either way, inilah varian berbasis nol yang hanya 5 karakter lebih panjang. $s=read-host;(2,4,6,8)|%{if(($i=$s.indexof("$_"))-gt-1){"$i,$_";break}};'-1,0'
Iszi
Juga, saya cukup yakin tanda kurung di sekitar 2,4,6,8tidak perlu.
Iszi
Varian berbasis nol dapat dibuat 2 karakter lebih lama, jika Anda mengubah kondisi if ke:if(1+($i=$s.indexof("$_")))
Danko Durbić
2

C ++ 11, 173 (termasuk dua karakter baris baru)

Ini versi terkompresi:

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

Ini versi yang bisa dibaca:

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

Ini versi yang lebih lama:

C ++ 11, 175 (termasuk dua karakter baris baru)

Ini versi terkompresi:

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

Ini versi yang bisa dibaca:

#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";
}
Sepatu
sumber
Coba #define o std::cout<<. Saya pikir ini memangkas kode Anda dengan 1 karakter.
@ user2509848, tidak, ini sebenarnya 2 karakter lebih lama. Tapi terima kasih pula :)
Sepatu
k==c?std::cout<<(...),throw 0:0;- operator bersyarat dapat menggantikan if, ketika semua yang Anda butuhkan adalah ekspresi. throwadalah ekspresi dan juga satu karakter lebih pendek dari return.
MSalters
1

C, 80 karakter

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

C # - 124

Saya agak terlambat ke pesta

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");}
jzm
sumber
0

Haskell, 79 karakter

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

Ini berjalan sedikit cepat dan longgar dengan format output:

& 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')
MtnViewMark
sumber
0

PowerShell: 145 103

Perubahan dari
quelch error Dihapus asli per komentar dari penanya.

Kode:

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

Panduan:

"... "Segala sesuatu dalam tanda kutip akan dimasukkan dalam output.

$(... )Segala sesuatu di antara tanda kurung akan diperlakukan sebagai perintah, dan output dari kode itu akan dimasukkan sebagai ganti dari perintah itu sendiri.

[array]::IndexOf(... )Ini digunakan untuk mendapatkan indeks elemen dengan array. Parameter pertamanya adalah objek array yang akan dicari. Parameter kedua adalah objek yang akan ditemukan. Ini hanya menampilkan indeks elemen pencocokan pertama. Saya mencoba menggunakan IndexOfmetode langsung terhadap $s(misalnya:, $s.IndexOf($x)tetapi ini gagal karena beberapa alasan saya belum tahu - itu mengklaim metode tidak ada pada objek itu.

(... )Ekspresi dalam kurung akan menjadi parameter pertama untuk IndexOf.

$s= $ s akan menjadi variabel untuk menyimpan input pengguna.

(read-host)-split'' Mendapat input pengguna, dan membaginya menjadi array karakter.`

|?{$_}Memfilter elemen array ekstra kosong yang dihasilkan oleh -split''.

,(... )Ekspresi dalam kurung akan menjadi parameter kedua untuk IndexOf.

$x= $ s akan menjadi variabel untuk menyimpan digit genap terendah dari input pengguna.

$s|?{$_%2-eq0} Mencabut angka genap dari $ s.

|?{$_-gt0} Batalkan nol.

|sort Urutkan objek yang tersisa, urutan default naik.

|select -f 1 Pilihan objek pertama, yang sekarang akan menjadi digit genap terendah.

,$xKode di atas akan menampilkan indeks angka genap terendah kami. Ini menambahkan koma, dan kemudian menampilkan digit itu sendiri.

Catatan:

Ini mungkin sedikit meregangkan aturan # 4. Jika tidak ada digit genap, output tidak akan menyertakan angka kedua.

Juga, ini akan menimbulkan beberapa kesalahan non-terminasi jika input menyertakan elemen non-numerik. Script masih akan berjalan dan memberikan output yang tepat, tetapi Anda mungkin ingin set $ErrorActionPreferenceuntuk 'SilentlyContinue'sebelum menjalankannya.

Iszi
sumber
@ DankoDurbić Sekarang setelah Anda berhasil mengalahkan saya, maukah Anda membantu saya mencari tahu mengapa saya tidak bisa menggunakan di $s.IndexOfsini? Itu memberi saya kesalahan mengatakan metode itu tidak ada untuk objek itu, meskipun $s|gmmengatakan itu. Ini bekerja pada sistem yang saya gunakan sekarang, tetapi bukan yang saya coba lakukan sebelumnya hari ini. Apakah ini masalah kompatibilitas versi? Sistem sebelumnya adalah PSv2, saat ini adalah PSv4.
Iszi
Anda $sadalah string[], dan $s.indexoftidak bekerja karena ...[System.String[]] doesn't contain a method named 'indexOf', yang tampaknya masuk akal (Aku berlari PS 2.0). $s|gmmengembalikan anggota System.String, bukan System.String[]. Saya tidak yakin mengapa itu terjadi.
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

Bau sedikit karena itu mengeksploitasi pengaturan dinamis VB. Opsi Tidak Aktif dan Impor Sistem.Console .

Adam Speight
sumber
0

VB.net (193c) menggunakan LINQ

Yang ini terutama memanfaatkan permintaan 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
Adam Speight
sumber
0

Golf-Basic 84, 91 karakter

:L1/L1_L2i`L1:fpart(L1,2)2_L1:SortA(L1)@cumSum(L1)=length(L1):Thend`-1#d`cumSum(L1):Endd`L1
  • Pastikan tidak ada 0dalam input (bahkan tidak, siapa bilang itu aneh?)
  • Dapatkan input ke L1 (Daftar 1)
  • Simpul mencari modulus 2 untuk setiap nilai
  • Sortir L1 dari terkecil ke tertinggi
  • Tampilkan indeks (baik -1 atau jumlah kumulatif) dan angka terkecil
Timtech
sumber
0

Bourne shell (sh), 88 karakter

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

Saya pikir saya akan melakukan hal pemrosesan string untuk bersenang-senang. Secara teknis ini dibaca dari stdin, tetapi jika Anda menjalankannya secara interaktif itu akan meminta pengguna untuk input karena keyboard adalah aliran stdin default. Gunakan perintah shell dasar untuk membagi input pada baris, beri nomor (menggunakan nlutilitas yang tidak dikenal ), filter keluar baris yang sesuai dengan kriteria, urutkan dan output yang terendah digit. Mencetak 88 -1jika tidak ditemukan digit genap.

FireFly
sumber
0

C ++ - 223 221 Karakter:

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

Versi yang dapat dibaca:

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

Itu panjang, tapi tidak seburuk Jawa.


sumber
Ini sebenarnya 221 + 2 (karakter baris baru) kalau tidak itu tidak akan dikompilasi.
Sepatu
Oh Word hanya terdeteksi 221, saya akan mengubahnya.
0

Javascript 93 karakter

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

Dapatkan semua nomor acara, urutkan susunan dan cetak digit pertama.

Felipe Miosso
sumber
0

Mathematica, 157 karakter

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

Chris Degnen
sumber
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 benar-benar membutuhkan cara yang lebih singkat untuk mendapatkan input untuk bermain golf. Saya menghitung definisi fdan satu panggilan ke f. Pengindeksan satu berdasarkan adalah mengapa jawabannya berbeda dari contoh.

gggg
sumber
0

JavaScript - 53 Karakter

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

Membaca input dari prompt dan menampilkan (ke konsol) karakter genap terendah kemudian (tanpa pembatas) indeks pertama dari karakter itu; jika tidak ada karakter genap nol maka hasilnya 8-1.

MT0
sumber
0

C, 110 Karakter

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);
}
MarcDefiant
sumber
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]]

Membaca nilai, mengulangi setiap karakter, jika representasi angka mod 2 sama dengan 0 dan jumlahnya kurang dari apa yang sudah disimpan b, ganti nilai dalamb

Danny
sumber
0

Rebol, 69

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

Ruby 55

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

JavaScript / jQuery 149

Golf

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

Sumber lengkap

<!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>
bacchusbeale
sumber