Pertanyaan brilian lain dari Stack Overflow berubah menjadi tantangan kode-golf !
Tulis sebuah program yang:
- 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.
- Menemukan indeks (berdasarkan 0 atau 1) dari angka genap terendah pertama .
- Mencetak 2 bilangan bulat , indeks dan digit genap terendah .
- Jika tidak ada digit genap , kembalikan -1 sebagai indeks, angka kedua dapat berupa apa saja.
- 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.
Jawaban:
Golfscript, 26 (28) karakter
Contoh:
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, kecuali8
selalu 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:
:x?x
untuk memperbaikinya (saya tidak suka variabel sementara.n@
(yang juga melakukan swap),n\
(yang tidak), atau]`
(yang memformat output sebagai["8" -1]
).sumber
.0=@?
dengan.@\?
atau:x?x
untuk menyimpan satu karakter dan menghindari keraguan atas pesanan. Penggunaan yang bagus8
sebagai fallback.APL (37)
(Berbasis 1 secara default, tetapi patuh
⎕IO
)Penjelasan:
⍞
: baca input penggunam←⍵/⍨⍵∊'2468'
: hapus semua karakter yang bukan2468
, simpan dim
.×⍴m
: lihat apakah ada:
: Jika begitu:z←⌊/⍎¨m
: evaluasi setiap karakter dalamm
, cari angka terendah dan simpan diz
.z,⍨⍵⍳⍕z
: kembalikan indeksz
masuk⍵
, diikuti olehz
.⋄
: Jika tidak:¯1,0
: kembali(-1, 0)
sumber
Python 3, 69
menggabungkan ide-ide dari sini .
sumber
Ruby, 60 karakter
$_
berisi input terakhir yang dibaca olehgets
.p
memintainspect
argumen dan mencetak hasilnya.sumber
perl - -
94- 53 karakter (atau 48)Alih-alih
index()
pendekatan berbasis nol kami menggunakanpos
dan mulai pada satu; tidak ada CPAN. Jalankan ini denganperl -nE
dan akan menunggu input (yang juga dapat menerima dariSTDIN
).Operasi pertandingan pertama (
//
) bekerja pada nilai default ($_
) dari input, cocok dengan angka genap yang diberikan,sort
memasukkan 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
$m
untuk operasi pertandingan kedua yang akan menemukan kemunculan pertama dari nilai$m
dalam string asli. Kami masih menggunakan nilai default di sini$_
dan kita menyelamatkan pertandingan melawan isi$m
di$1
(alasan untuk()
sekitar$m
dalam pernyataan kedua). Setelah itu,pos
dansay
lakukan sisanya (dan dalam karakter lebih sedikit dariindex
danprint
).Jika output order atau koma tidak penting maka mungkin untuk membuat 5 karakter ini lebih pendek:
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. ).sumber
$SHELL
sejarah saya untuk "menang". Versi yang berfungsi ini sangat panjang dan memalukan. Layani saya dengan benar: akan dipersingkat nanti untuk menghindari rasa malu :-(if(/[2468]/){for$i(2,4,6,8){if(index($_,$i)>-1){say$i,",",index($_,$i)+1;last}}}else{say"0,-1"}
($m)=sort/[2468]/g;/$m/g;say$&?pos.",$&":"-1,0"
(47 +1 byte, AFAIK-n
membutuhkan byte tambahan).pos
mengembalikan offset. Jadi sebenarnya ini mengembalikan indeks berbasis 1 dalam contoh Anda.perl
,-M
akan menang setiap kali ;-)Perl 6,
375560 karakterEDIT: 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.
$/.from
mendapat posisi pertandingan dan',', $/.Int
koma 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 :)
sumber
$/.from
ketika tidak ada yang ditemukan (ini mungkin bug dalam versi Rakudo saya yang lama). Berikut adalah variasi dari solusi Anda yang berfungsi ( untuk saya!) Masukmy$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.my $n; $_="333992";$n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/"
. Saya belajar sekitar.comb
20 menit yang lalu dan saya sudah menyukainya :-)J, 44 karakter
menampilkan karakter terakhir dari input jika tidak ditemukan digit genap
Contoh:
Penjelasan:
echo ... i=.1!:1]1
adalah input / output. Jauh lebih lama dari yang kuinginkan. Input disimpani
juga.'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.sumber
Python 2.7 - 76
Jawaban referensi yang saya harapkan akan dikalahkan. Tetapi untuk memulai orang:
sumber
index
kefind
; Anda juga dapat mengubah[2,4,6,8]
ke2,4,6,8
(dengan ruang di depan).print[(s.find(`e`),e)for e in 2,4,6,8if`e`in s+'8'][0]
print[(s.index(c),c)for c in'2468'if c in s][0]or(-1,0)
R, 104
Contoh (dalam R, indeks dimulai pada 1):
sumber
Powershell,
767371$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$i
ke indeks berbasis 1 digit di$s
atau0
jika digit tidak ditemukanif( $i=... ){...}
kondisi akan benar ketika$i
tidak0
"$i,$_";break
menampilkan indeks dan digit, dan menghentikan eksekusi"-1,0"
jika tidak, output-1,0
sumber
$s=read-host;(2,4,6,8)|%{if(($i=$s.indexof("$_"))-gt-1){"$i,$_";break}};'-1,0'
2,4,6,8
tidak perlu.if(1+($i=$s.indexof("$_")))
C ++ 11, 173 (termasuk dua karakter baris baru)
Ini versi terkompresi:
Ini versi yang bisa dibaca:
Ini versi yang lebih lama:
C ++ 11, 175 (termasuk dua karakter baris baru)
Ini versi terkompresi:
Ini versi yang bisa dibaca:
sumber
#define o std::cout<<
. Saya pikir ini memangkas kode Anda dengan 1 karakter.k==c?std::cout<<(...),throw 0:0;
- operator bersyarat dapat menggantikanif
, ketika semua yang Anda butuhkan adalah ekspresi.throw
adalah ekspresi dan juga satu karakter lebih pendek darireturn
.C, 80 karakter
sumber
C # - 124
Saya agak terlambat ke pesta
sumber
Haskell, 79 karakter
Ini berjalan sedikit cepat dan longgar dengan format output:
sumber
PowerShell:
145103Kode:
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 menggunakanIndexOf
metode 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 untukIndexOf
.$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 untukIndexOf
.$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.,$x
Kode 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
$ErrorActionPreference
untuk'SilentlyContinue'
sebelum menjalankannya.sumber
$s.IndexOf
sini? Itu memberi saya kesalahan mengatakan metode itu tidak ada untuk objek itu, meskipun$s|gm
mengatakan 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.$s
adalahstring[]
, dan$s.indexof
tidak bekerja karena...[System.String[]] doesn't contain a method named 'indexOf'
, yang tampaknya masuk akal (Aku berlari PS 2.0).$s|gm
mengembalikan anggotaSystem.String
, bukanSystem.String[]
. Saya tidak yakin mengapa itu terjadi.vb.net (108c)
Bau sedikit karena itu mengeksploitasi pengaturan dinamis VB. Opsi Tidak Aktif dan Impor Sistem.Console .
sumber
VB.net (193c) menggunakan LINQ
Yang ini terutama memanfaatkan permintaan LINQ.
sumber
Golf-Basic 84, 91 karakter
0
dalam input (bahkan tidak, siapa bilang itu aneh?)sumber
Bourne shell (sh), 88 karakter
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
nl
utilitas yang tidak dikenal ), filter keluar baris yang sesuai dengan kriteria, urutkan dan output yang terendah digit. Mencetak88 -1
jika tidak ditemukan digit genap.sumber
C ++ - 223
221Karakter:Versi yang dapat dibaca:
Itu panjang, tapi tidak seburuk Jawa.
sumber
Javascript 93 karakter
Dapatkan semua nomor acara, urutkan susunan dan cetak digit pertama.
sumber
Mathematica, 157 karakter
sumber
Julia, 84
Julia benar-benar membutuhkan cara yang lebih singkat untuk mendapatkan input untuk bermain golf. Saya menghitung definisi
f
dan satu panggilan kef
. Pengindeksan satu berdasarkan adalah mengapa jawabannya berbeda dari contoh.sumber
JavaScript - 53 Karakter
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
.sumber
C, 110 Karakter
ungolfed:
sumber
Javascript, 69
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
sumber
Rebol, 69
sumber
Ruby 55
sumber
JavaScript / jQuery 149
Golf
Sumber lengkap
sumber