Ev ödevi zamanı! Bana bir dizedeki en düşük çift haneyi bul


12

Stack Overflow'un bir başka parlak sorusu mücadelesine dönüştü !

Aşağıdakileri yapan bir program yazın:

  1. Bir dizeyi kullanıcı girdisi olarak kabul eder ( kanalsız veya komut satırı bağımsız değişkeni). Girişin veri türü bir dize olmalıdır; dil girişte otomatik olarak geliştirirse, bir dizeye dönüştürülmelidir.
  2. İlk en düşük çift basamağın dizinini (0 veya 1 tabanlı) bulur .
  3. 2 tamsayı , dizin ve en düşük çift basamak basar .
  4. Çift basamak yoksa, dizin olarak -1 döndürün, ikinci sayı herhangi bir şey olabilir.
  5. Bu sıfırın amacı için eşit değil .

Soldaki dize verildiğinde, sağdaki değerler verilen test örnekleri:

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

Kazanan: En düşük karakter sayısına sahip programdır. Bonus yok, ceza yok.

edit: (yaklaşık stdin) Ben kullanıcı giriş kısmında berbat, temelde hiçbir boru veri ve komut satırı argümanları. Programın içinde bir tür kullanıcı istemi sağlamalısınız.


4
En düşük çift tamsayının iki basamağı varsa ne olur? Tamam, iki şaka.
Dr. belisarius

5
Stdin ile ilgili sorun nedir?
John Dvorak

1
@JanDvorak Çünkü keyfi kurallar, bu yüzden.

7
Neden sıfır sınırlaması eşit değil? Bu oldukça garip görünüyor.
Iszi

3
Girdi gereksinimleriniz gerçekten bir anlam ifade etmiyor: Çoğu sistem için girdi, ister program ister isterse hayır olsun, stdin'den geliyor. Girişin bağlı olup olmadığı programın kontrolü altında değildir. - Amacınız kullanıcıların etkileşimli bir program oluşturmasını sağlamaksa, girdi ve çıktı (biçimlendirme dahil) ve gereken etkileşim konusunda kesin olmalısınız.
MtnViewMark

Yanıtlar:


6

Golfscript, 26 (28) karakter

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

Misal:

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

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

canlı test: http://golfscript.apphb.com/?c=Oyc1Mzc3MScKLicyNDYnJjgrJDE8LjA9QD8%3D

Açıklama:

  • '#{gets}'G / Ç gereksinimlerini karşılamak için yakuttan bir kaçış; STDIN'in boş olduğu varsayılır
  • . girişi klonlar
  • '246'&8+girişte hangi basamakların var olduğunu bulur, ancak 8her zaman korunur
  • $1< listeyi sıralar, ardından ilk basamağı alır, ancak dize olarak tutar
  • .@\?{digit, input, digit} yığınını sıralar, ardından girdi içindeki basamağı bulur; @peterTaylor bana [dizi, dizi] imzasını fark ettiğiniz için teşekkürler ?.

Bu kez spec yorumuyla çok cesur oldum; yani:

  • Spesifikasyon, tamsayıların hangi sırayla çıktığını zorunlu kılmaz; :x?xDüzeltmek için diğer @ peter önerisini kullanın (Geçici değişkenleri sevmiyorum.
  • Spesifikasyon, iki tamsayı arasında herhangi bir sınırlayıcı gerektirmez; bulunan rakam her zaman tek bir rakam olduğundan, bu önemli değildir. Varsa n@, n\( değiştirmeyi de gerçekleştirir), (yapmayan) veya ]`(çıktıyı biçimlendiren ) ekleyin ["8" -1].

Onlar çılgın gereksinimleri değil, onlar keyfi gereksinimleri: P

Ayrıca, spec dizinin ilk olmasını gerektirir, ancak eğer bilmediğini söylemek için yeterince GolfScript okuyamıyorum

@LegoStormtroopr, siparişten bahseden spesifikasyonun tek noktası # 4'tür: "Çift basamak yoksa, dizin olarak -1 döndürün, ikinci sayı herhangi bir şey olabilir". # 3 siparişi belirtmiyor; "sınırlayıcı yok" cesaretine ne dersiniz?
John Dvorak

Ah snap, haklısın efendim! Çıktı için iki sayıdan bahsettim, ama siparişten değil. Ben düzeltilmiş duruyorum!

Sen yerini alabilir .0=@?ile .@\?veya :x?xbir karakteri kaydetmek ve sipariş üzerine şüphe önlemek için. 8Bir yedek olarak güzel kullanımı .
Peter Taylor

5

APL (37)

(Varsayılan olarak 1 tabanlı, ancak itaat eder ⎕IO)

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

Açıklama:

  • : kullanıcı girişini oku
  • m←⍵/⍨⍵∊'2468': olmayan tüm karakterleri kaldırın 2468, depolayın m.
  • ×⍴m: var mı bak
  • :: Öyleyse:
    • z←⌊/⍎¨m: içindeki her karakteri değerlendirin m, en düşük sayıyı bulun ve depolayın z.
    • z,⍨⍵⍳⍕z: Dizinini döndürür ziçinde izledi z.
  • : Değilse:
    • ¯1,0: dönüş (-1, 0)

1
Vay be, APL'yi yendim (J çözümü ile değil, ama yine de ...)
John Dvorak

Açıklama? APL çok kendi kendini açıklıyor ...;)
german_guy

3

Python 3, 69

fikir birleştirerek burada .

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

Bir liste yerine bir dize kullanımını ve (şimdi kaldırıldı) `tırnakların sonuçlanan ihmalini seviyorum.
SimonT

@boothby Sanırım python 3 kullandığımı fark etmediniz. python 3 input () 'da bir stringi kullanıcı girişi olarak kabul eder.
Wasi

@SimonT `(backticks) sadece tırnak değil. Python 2'de repr () için kullanımdan kaldırılmış bir takma ad . Ancak artık Python 3'te mevcut değil. Yani, `` python 3'teki bir şeyde `` kullanmak istiyorsam, 4 karakter daha içeren repr (bir şey) yazmak zorundayım. Bu yüzden ondan kurtuluyorum;)
Wasi

@ Evet, gerçekten benim hatam.
boothby

@Wasi, evet teşekkür ederim. Bunun farkındaydım ve "şimdi kaldırıldı" ile aslında tamamen dilin bir parçası olarak kaldırılmak istedim. Şerefe.
SimonT

3

Ruby, 60 karakter

x=gets.chars.sort.find{|c|c=~/[2468]/};p x ?$_.index(x):-1,x
  • $_tarafından okunan son girişi içerir gets.
  • pinspectargümanları çağırır ve sonuçları yazdırır.

3

Perl - - 94 - 53 karakter (veya 48),

index()Sıfır temelli yaklaşım yerine postek bir yöntemle başlıyoruz; CPAN yok. Bunu ile çalıştırın perl -nEve giriş (aynı zamanda da alabilir STDIN) bekleyecektir .

İlk match ( //) işlemi $_, girişteki varsayılan değer ( ) üzerinde çalışır , verilen çift sayılarla sorteşleşir, eşleşmeleri bir diziye ekler ve sonra bunları bir "skaler listesinde" saklar ($m). Skaler bağlamda, sıralanan dizinin liste değeri bir öğe uzunluğundadır ve bu nedenle sayıdaki en düşük eşleşen çift rakamdan oluşur.

Eşleşen en düşük rakamı izole ettikten sonra , orijinal dizedeki $mdeğerin ilk oluşumunu bulan ikinci bir eşleşme işlemi için kullanırız $m. Biz hala burada varsayılan değeri kullanıyor $_ve biz içeriğine karşı maç tasarruf edilmektedir $miçinde $1(sebebi (), etrafımızda $mikinci ifadesinde). Bundan sonra, posve saygerisini (ve daha az karakterden daha indexve print).

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

Çıktı sırası veya virgüllerin önemi yoksa, bu 5 karakteri daha kısa yapmak mümkündür:

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

Daha önceki girişimimde koştum ve bir hata yaptım - sadece python ve ruby'i dövmek istedim (ama başarısız oldu) ... iç çekti.

perl6Kazananları ve diğer katılımcıları harika çözümlerinden dolayı tebrik ediyoruz - özellikle :-) Bu yaklaşımın olası bir Perl6 uyarlaması kullanılabilir " .comb(Masak ve ark . Tarafından önerilen freenode üzerinde ).

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

Python / ruby ​​dövmeye o kadar odaklanmıştım ki, çift sayı mevcut olmadığında işe yaramayan bir astar yayınladım: hevesle $SHELL"kazanmak" için tarihimin eski bir sürümünü kullanarak . Bu çalışma versiyonu gülünç derecede uzun ve utanç vericidir. Bana doğru hizmet veriyor: utançtan kaçınmak için daha sonra kısaltacak :-(
G. Cito

büyük kesmek: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
İyi, ama daha fazla golf için oda kaldı: ($m)=sort/[2468]/g;/$m/g;say$&?pos.",$&":"-1,0"(47 + 1 bayt, AFAIK -nek bir bayt maliyeti).
Heiko Oberdiek

NB. posofseti döndürür. Yani aslında örneğinizde 1 tabanlı dizin döndürüyor.
draegtun

@draegtun oopsie :-) teşekkürler. @Heiko bu doğru: anahtarları aksi saymalısın perls' -Mher zaman ;-) kazanacaktı
G. Cito

3

Perl 6, 37 55 60 karakter

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

EDIT: Soruyu ilk kez yanlış anladım. Bu güncelleme doğru olmalıdır. Girdinin içerdiği en düşük 2,4,6 veya 8 sayısını bulur ve daha sonra bu en düşük sayıya sahip girişle bir normal ifade eşleşir. $/.fromeşleşmenin konumunu alır ve ',', $/.Intvirgül artı eşleşmenin kendisidir veya metin eşleşmediğinde 0 olur.

Buradayken , yorumlardaki ve irc'deki girişimi düzeltmeme yardımcı olan G. Cito'yu oylayın .


1
Ne yazık ki bu ilk çift sayısı (2468) bulundu ve en düşük değil :( Not: Ayrıca $/.fromhiçbir şey bulunamadığı ile ilgili bir sorun var (bu belki Rakudo'nun eski sürümünde bir hata). İşte çözümünüzün bir varyasyonu ( benim için!) my$x=get;for 2,4,6,8 ->$n{if $x~~/$n/ {say $/.from,",$/";exit}};say "-1 0"; 75 karakter geliyor ama eminim daha kısa bir perl6 çözümü yapılabilir.
draegtun

@draegtun ... Dün perl5 girişimimde benzer bir hata yaptım (aşağıya bakınız). Düzeltmem 70 karakter ekledi! Sadece ~ 50 char sürümü ile güncellendi - ki bu işe yarıyor gibi görünüyor. Sanırım sayıdaki tüm çift basamakları sıralarsanız, sıralamadaki (şimdi) ilk haneyi kullanarak bir eşleştirme yapabilir ve en düşük ve ilkine sahip olduğunuzdan emin olabilirsiniz. Haklı mıyım?
G. Cito

@ G.Cito Bana iyi geliyor ve cevabınızı + 1'lediniz. Birkaç karakterden kurtulmanın yolunu görebiliyorum ama Heiko'nun önereceğimden daha iyi yapıldığını görüyorum!
draegtun

@draegtun Oh, Tanrım, o zaman soruyu tamamen yanlış anladım :( Çok teşekkür ederim! Bu
ASAP'ı

@mouq İşte bir yaklaşım aşağıda yayınlanmıştır perl5 örnek olarak aynı yaklaşımı kullanan biri: my $n; $_="333992";$n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/". .combYaklaşık 20 dakika önce öğrendim ve zaten beğendim :-)
G. Cito

2

J, 44 karakter

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

çift ​​sayı bulunmazsa girişin son karakterini verir

Misal:

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

Açıklama:

  • echo ... i=.1!:1]1giriş / çıkış. İstediğimden çok daha uzun. Girdi de içine saklanır i.
  • '2468'i.~ girişteki her çift basamağın ilk oluşumunu bulur ve basamak bulunamazsa giriş uzunluğunu döndürür
  • (#~(#i)&>)"giriş uzunluğunun bundan daha büyük olmasına göre seçin"; diğer bir deyişle, girdiyi işaret eden dizinleri seçin. İstediğimden çok daha uzun.
  • _1,~arkaya -1 ekler. Alt çizgi, J'nin negatif değerleri temsil etme yoludur.
  • {. ilk elemanı seçer
  • (;{&i)iki kutuda o konumdaki giriş karakteri ile birleştirir; bir sayıyı bir karakterle birleştirdiğimiz için, boks olmayan birleştirme ( ,) işe yaramaz. Kutusuz görüntü isteniyorsa, dizinin ":önce iki karakterle biçimlendirilmesi ( ) gerekir .

2

Python 2.7-76

Tamamen dövülmeyi beklediğim bir referans cevap. Ancak insanları başlatmak için:

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

3
Eğer değiştirerek bir karakter kapalı tıraş edebilirsiniz indexetmek find; Ayrıca değiştirebilir [2,4,6,8]için 2,4,6,8(ön boşluk).
Justin

4
Kısa:print[(s.find(`e`),e)for e in 2,4,6,8if`e`in s+'8'][0]
grc

4
Sanırım kendi kuralını çiğnedin ... Ne zamandan beri raw_input stdin değil?
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])

Örnekler (R'de, dizin 1'den başlar):

_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 kullanıcı girişini $s
  • 2,4,6,8|%{...} içeride ne varsa {}2,4,6 ve 8 basamakları
  • $i=$s.indexof("$_")+1veya $iiçindeki bir basamağın 1 tabanlı dizinine ayarlar$s0 eğer haneli bulunamazsa
  • if( $i=... ){...} durum doğru $iolmadığında doğru olacaktır0
  • "$i,$_";break dizini ve basamağı çıktılar ve yürütmeyi durdurur
  • "-1,0" aksi takdirde çıktılar -1,0

Bu, uygun dizini vermez. PowerShell'de, soru için verilen test örneklerinde olduğu gibi, dizinler sıfırdan başlar.
Iszi

1
Kural # 2, indeksin 0 veya 1 tabanlı olabileceğini söylüyor.
Danko Durbić

Ah. Bunu farketmedim. Her iki durumda da, sadece 5 karakter uzunluğunda sıfır tabanlı bir varyant. $s=read-host;(2,4,6,8)|%{if(($i=$s.indexof("$_"))-gt-1){"$i,$_";break}};'-1,0'
Iszi

Ayrıca, eminim ki parantez 2,4,6,8gereksiz.
Iszi

if(1+($i=$s.indexof("$_")))
İf

2

C ++ 11, 173 (iki yeni satır karakteri dahil)

Sıkıştırılmış sürüm:

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

İşte okunabilir sürüm:

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

İşte daha eski bir sürüm:

C ++ 11, 175 (iki yeni satır karakteri dahil)

Sıkıştırılmış sürüm:

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

İşte okunabilir sürüm:

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

Deneyin #define o std::cout<<. Bence kodunuzu 1 karakter keser.

@ user2509848, hayır, aslında 2 karakter daha uzun. Ama yine de teşekkürler :)
Ayakkabı

k==c?std::cout<<(...),throw 0:0;- şartlı operatör, ifihtiyacınız olan tek şey ifadeler olduğunda değiştirilebilir . throwbir ifade ve ayrıca bir karakterden daha kısa 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]);}

1

C # - 124

Partiye biraz geç kaldım

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 karakter

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

Bu, çıktı biçimlendirmesiyle biraz hızlı ve gevşek çalışır:

& 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


Askerden gelen yorum başına orijinal Kaldırılan hata işareti .

Kod:

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

İzlenecek yol:

"... "Tırnak içindeki her şey çıktıya dahil edilecektir.

$(... )Parantez arasındaki her şey bir komut olarak değerlendirilecek ve komutların kendileri yerine bu kodun çıktısı eklenecektir.

[array]::IndexOf(...) Bu, diziye sahip bir öğenin dizinini almak için kullanılır. İlk parametresi aranacak dizi nesnesidir. İkinci parametre bulunacak nesnedir. Bu yalnızca ilk eşleşen öğenin dizinini verir. Basitçe IndexOfdoğrudan karşı bir yöntem kullanarak denedim $s(örneğin:, $s.IndexOf($x)ama bu nedense henüz anlayamıyorum - bu yöntem nesnede var olmadığını iddia ediyor.

(... )Parantez içindeki ifade, ilk parametre olacaktır IndexOf.

$s= $ s kullanıcı girdisini saklamak için bir değişken olacaktır.

(read-host)-split'' Kullanıcı girdisini alır ve onu bir karakter dizisine böler.

|?{$_} Tarafından oluşturulan ekstra boş dizi öğelerini filtreler -split'' .

,(... )Parantez içindeki ifade,IndexOf .

$x= $ s, kullanıcı girişinden en düşük çift rakamı saklamak için bir değişken olacaktır.

$s|?{$_%2-eq0} Çift sayıları $ s değerinden çıkarır.

|?{$_-gt0} Sıfır değerini geçersiz kılar.

|sort Kalan nesneleri sıralar, varsayılan düzen artar.

|select -f 1 Şimdiye kadar en düşük çift basamak olacak ilk nesneyi seçer.

,$xYukarıdaki kod, en düşük çift rakamımızın dizinini verir. Bu, virgül ekler ve ardından basamağın kendisini verir.

Notlar:

Bu belki de kural # 4'ü biraz uzatmaktır. Çift basamak yoksa çıktı ikinci bir sayı içermez.

Ayrıca, girdi sayısal olmayan öğeler içeriyorsa, bu bazı sonlandırıcı olmayan hatalar atar. Yazısı hala çalıştırmak ve uygun çıkış vermek, ancak sette isteyebilirsiniz olacak $ErrorActionPreferencekadar 'SilentlyContinue'çalıştırmadan önce.


@ DankoDurbić Şimdi beni iyi bir şekilde yendiğine göre, neden $s.IndexOfburada kullanamadığımı anlamama yardım eder misin ? Bana $s|gmsöylese bile, bu nesne için yöntemin var olmadığını söyleyen bir hata veriyordu . Şu an bulunduğum sistemde çalışıyor, ama bugün daha önce yapmaya çalıştığım sistemde değil. Bir sürüm uyumluluğu sorunu mu? Daha önceki sistem PSv2, akım PSv4'tür.
Iszi

Sizin $solduğu string[]ve $s.indexofçünkü işini yapmaz ...[System.String[]] doesn't contain a method named 'indexOf'(Ben PS 2.0 çalıştırıyorum) makul görünüyor ki,. $s|gmüyelerini döndürür System.String, değil System.String[]. Bunu neden yaptığından emin değilim.
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'nin dinamik ortamından faydalandığı için biraz kokuyor. Seçenek Açık Kapalı ve İthalat System.Console .


0

LINQ kullanan VB.net (193c)

Bu öncelikle bir LINQ sorgusu kullanıyor.

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 karakter

:L1/L1_L2i`L1:fpart(L1,2)2_L1:SortA(L1)@cumSum(L1)=length(L1):Thend`-1#d`cumSum(L1):Endd`L1
  • 0Girişte hayır olmadığından emin olun (çift değil, garip olması gerektiğini kim söyledi?)
  • L1'e giriş yapın (Liste 1)
  • Her değer için döngü bulma modülü 2
  • L1'i en küçükten en yükseğe doğru sırala
  • Dizini (-1 veya kümülatif toplam) ve en küçük sayıyı görüntüleme

0

Bourne kabuğu (sh), 88 karakter

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

Eğlenmek için dize işleme bir şey yapacağımı düşündüm. Teknik olarak stdin'den okur, ancak etkileşimli olarak çalıştırırsanız, klavye varsayılan stdin akışı olduğundan kullanıcıdan giriş yapmasını ister. Girişi satırlara ayırmak, numaralandırmak (bilinmeyen nlyardımcı programı kullanarak ), ölçütlere uyan satırları filtrelemek, sıralamak ve en düşük basamaklı çıktıyı çıkarmak için temel kabuk komutlarını kullanır . 88 -1Çift rakam bulunmazsa yazdırır .


0

C ++ - 223 221 Karakterler:

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

Okunabilir sürüm:

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

Uzun ama Java kadar kötü değil.


Aslında 221 + 2 (yeni satır karakterleri) aksi takdirde derlenmeyecektir.
Ayakkabı

Ah. Word sadece 221 tespit etti, ben değiştireceğim.

0

Javascript 93 karakter

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

Tüm olay numaralarını alın, diziyi sıralayın ve ilk basamağı yazdırın.


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


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'nın golf oynamak için gerçekten daha kısa bir yol bulması gerekiyor. Tanımı fve bir çağrıyı saydım f. Bir temel indeksleme, cevapların neden örneklerden farklı olduğudur.


0

JavaScript - 53 Karakter

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

İstemden girişi okur ve (konsola) en düşük çift karakteri (sınırlayıcı olmadan) bu karakterin ilk dizininden çıkarır; sıfırdan farklı çift karakterler yoksa çıktı alır 8-1.


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

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

Değeri okur sayı gösterimi 2 0 eşittir mod ise, her karakter arasında dolaşır ve numara zaten saklanan ne az olmasıdır b, değerleri değiştirmekb


0

Asi, 69

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

0

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

Tam kaynak

<!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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.