Czas na pracę domową! Znajdź mi najniższą parzystą cyfrę w ciągu

12

Kolejne genialne pytanie z Stack Overflow przerodziło się w wyzwanie w !

Napisz program, który:

  1. Akceptuje ciąg jako dane wejściowe użytkownika ( nieprzenikane lub argument wiersza poleceń). Typ danych wejściowych musi być ciągiem, jeśli język dokonuje auto-ewaluacji na wejściu, musi być rzutowany na ciąg.
  2. Znajduje indeks (na podstawie 0 lub 1) pierwszej najniższej parzystej cyfry .
  3. Drukuje 2 liczby całkowite , indeks i najniższą parzystą cyfrę .
  4. Jeśli nie ma cyfry parzystej , zwróć -1 jako indeks, druga liczba może być dowolna.
  5. Dla celów tego zera nie jest parzyste .

Przykłady testowe, biorąc pod uwagę ciąg po lewej stronie, wartości po prawej:

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

Zwycięzca: to program o najniższej liczbie znaków. Bez bonusów, bez kar.

edit: (o stdin) Spieprzyłem część wejściową użytkownika, w zasadzie brak danych w rurociągach i żadnych argumentów wiersza poleceń. Musisz podać monit użytkownika w swoim programie.

Społeczność
źródło
4
Co jeśli najniższa parzysta liczba całkowita ma dwie cyfry? Ok, żart.
Dr Belisarius,
5
Co jest nie tak ze stdin?
John Dvorak,
1
@JanDvorak Ponieważ arbitralne reguły, właśnie dlatego.
7
Dlaczego ograniczenie zera nie jest równe? To wydaje się dość dziwne.
Iszi,
3
Twoje wymagania wejściowe naprawdę nie mają sensu: w przypadku większości systemów dane wejściowe pochodzą ze standardowego wejścia, niezależnie od tego, czy jest monitowany przez program, czy nie. To, czy wejście jest podłączone, czy nie, nie jest kontrolowane przez program. - Jeśli Twoim celem było stworzenie interaktywnego programu przez użytkowników, powinieneś dokładnie określić dane wejściowe i wyjściowe (w tym formatowanie) oraz wymaganą interakcję.
MtnViewMark,

Odpowiedzi:

6

Golfscript, 26 (28) znaków

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

Przykład:

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

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

test na żywo: http://golfscript.apphb.com/?c=Oyc1Mzc3MScKLicyNDYnJjgrJDE8LjA9QD8%3D

Wyjaśnienie:

  • '#{gets}'jest ucieczką od rubinu, aby spełnić wymagania We / Wy; Zakłada się, że STDIN jest pusty
  • . klonuje dane wejściowe
  • '246'&8+znajduje, które nawet cyfry są obecne na wejściu, z wyjątkiem tego, że 8jest zawsze zachowywane
  • $1< sortuje listę, a następnie pobiera pierwszą cyfrę, ale zachowuje ją jako ciąg znaków
  • .@\?porządkuje stos {cyfra, wejście, cyfra}, a następnie znajduje cyfrę na wejściu; dzięki @peterTaylor za zauważenie podpisu [tablicy, tablicy] ?.

Tym razem byłem bardzo odważny w interpretacji specyfikacji; mianowicie:

  • Specyfikacja nie określa kolejności wyświetlania liczb całkowitych; Użyj sugestii drugiego @ petera, :x?xaby to naprawić (nie lubię zmiennych tymczasowych.
  • Specyfikacja nie wymaga separatora między dwiema liczbami całkowitymi; ponieważ znaleziona cyfra jest zawsze pojedynczą cyfrą, nie ma to większego znaczenia. Jeśli tak, dołącz n@(który również wykonuje zamianę), n\(który nie wykonuje) lub ]`(który formatuje dane wyjściowe jako ["8" -1]).
John Dvorak
źródło
Nie są to szalone wymagania, są to arbitralne wymagania: P
Ponadto specyfikacja wymaga, aby indeks był pierwszy, ale nie mogę odczytać GolfScript wystarczająco dobrze, aby stwierdzić, czy nie
@LegoStormtroopr jedynym punktem specyfikacji, który wspomina o kolejności jest nr 4: „Jeśli nie ma parzystej cyfry, zwróć -1 jako indeks, druga liczba może być dowolna”. # 3 nie określa kolejności; co z odwagą „bez ogranicznika”?
John Dvorak,
O rany, pan ma rację! Wspomniałem o dwóch liczbach do wydrukowania, ale nie o kolejności. Poprawiono mnie!
Można wymienić .0=@?z .@\?lub :x?xzapisać jedną postać i uniknięcia wątpliwości co do kolejności. Ładne wykorzystanie 8jako awaryjne.
Peter Taylor,
5

APL (37)

(Domyślnie oparty na 1, ale przestrzega ⎕IO)

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

Wyjaśnienie:

  • : czytaj dane wprowadzone przez użytkownika
  • m←⍵/⍨⍵∊'2468': usuń wszystkie znaki, które nie są 2468, zapisz w m.
  • ×⍴m: sprawdź, czy są
  • :: Jeśli tak:
    • z←⌊/⍎¨m: oceń każdy znak m, znajdź najniższą liczbę i zapisz z.
    • z,⍨⍵⍳⍕z: zwraca indeks zin , a następnie z.
  • : Jeśli nie:
    • ¯1,0: powrót (-1, 0)
marinus
źródło
1
Wow, pokonałem APL (nie z rozwiązaniem J, ale nadal ...)
John Dvorak
Wyjaśnienie? APL jest tak samo wyjaśniający ...;)
german_guy
3

Python 3, 69

łącząc pomysły stąd .

s=input();print(([(s.find(x),x)for x in'2468'if x in s]+[(-1,0)])[0]) 
Czy byłem
źródło
Lubię używać łańcucha zamiast listy i wynikającego z niego pominięcia (teraz usuniętych) cudzysłowów.
SimonT
@boothby Chyba nie zauważyłeś, że używam Pythona 3. W python 3 input () Akceptuje ciąg jako dane wejściowe użytkownika.
Wasi
@ SimonT `(backticks) to nie tylko cytaty. Jest to przestarzały alias repr () w Pythonie 2. Ale nie jest już dostępny w Pythonie 3. Więc jeśli chcę użyć `` na czymś w Pythonie 3, muszę napisać repr (coś), który kosztuje 4 dodatkowe znaki. Dlatego się go pozbyłem;)
Wasi
@ Wasi tak, rzeczywiście mój błąd.
stoisko
@Wasi, tak, dziękuję. Byłem tego świadomy i przez „teraz usunięte” miałem na myśli usunięcie jako część języka całkowicie. Twoje zdrowie.
SimonT
3

Ruby, 60 znaków

x=gets.chars.sort.find{|c|c=~/[2468]/};p x ?$_.index(x):-1,x
  • $_zawiera ostatnie wejście odczytane przez gets.
  • pwywołuje inspectargumenty i wypisuje wyniki.
po prawej stronie
źródło
3

perl - - 94-53 znaków (lub 48)

Zamiast index()podejścia zerowego używamy posi zaczynamy od jednego; bez CPAN. Uruchom to za pomocą perl -nEi będzie czekać na dane wejściowe (z których może również odbierać STDIN).

Pierwsza //operacja match ( ) działa na wartości domyślnej ( $_) z danych wejściowych, dopasowuje się do podanych liczb parzystych, sortumieszcza dopasowania w tablicy, a następnie przechowuje je na „liście skalarnej” ($m). W kontekście skalarnym wartość listy posortowanej tablicy ma długość jednego elementu, a zatem składa się z najniższej dopasowanej parzystej cyfry w liczbie.

Po wyodrębnieniu najniższej parzystej nawet cyfry, używamy następnie $mdo drugiej operacji dopasowania, która znajdzie pierwsze wystąpienie wartości $mw oryginalnym ciągu. Nadal używamy tutaj wartości domyślnej $_i zapisujemy dopasowanie do zawartości $min $1(powód ()dookoła $mw drugiej instrukcji). Po tym, posi sayzrobić resztę (iw mniejszej ilości znaków niż indexa print).

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

Jeśli kolejność wyjściowa lub przecinki nie mają znaczenia, możliwe jest zmniejszenie tych 5 znaków:

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

W mojej wcześniejszej próbie pospieszyłem i popełniłem błąd - chciałem tylko pokonać pytona i ruby ​​(ale nie udało się) ... westchnienie.

Gratulacje dla zwycięzcy i innych uczestników za ich fajne rozwiązania - szczególnie perl6:-) Przydałaby się możliwa adaptacja tego podejścia do Perl6 ” .comb(zasugerowane przez Masaka i in .).

$_=get;my $n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/"
G. Cito
źródło
Byłem tak skoncentrowany na pokonaniu pytona / rubinu, że zamieściłem jeden linijkę, która nie działała, gdy nie było żadnych liczb parzystych: chętnie wykorzystałem wcześniejszą wersję powyższej z mojej $SHELLhistorii do „wygranej”. Ta działająca wersja jest absurdalnie długa i krępująca. Służy mi dobrze: skróci się później, aby uniknąć wstydu :-(
G. Cito
starszy hack: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
Dobrze, ale pozostało miejsce na dalszą grę w golfa: ($m)=sort/[2468]/g;/$m/g;say$&?pos.",$&":"-1,0"(47 + 1 bajtów, AFAIK -nkosztuje dodatkowy bajt).
Heiko Oberdiek
NB poszwraca przesunięcie. W efekcie zwraca indeks 1 w twoim przykładzie.
draegtun
@draegtun oopsie :-) dzięki. @Heiko prawdą, że: przełączniki powinny liczyć inaczej perl„s -Mwygra za każdym razem ;-)
G. Cito
3

Perl 6, 37 55 60 znaków

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

EDYCJA: Za pierwszym razem źle zrozumiałem pytanie. Ta aktualizacja powinna być poprawna. Znajduje najniższą liczbę 2,4,6 lub 8, która zawiera dane wejściowe, a następnie dopasowuje wyrażenie regularne względem danych wejściowych o najniższej liczbie. $/.frompobiera pozycję dopasowania i ',', $/.Intjest przecinkiem plus samo dopasowanie lub 0, jeśli tekst nie pasuje.

Będąc tutaj, idź upvote G. Cito , który pomógł mi naprawić mój wpis w komentarzach i na IRC :)

Mouq
źródło
1
Niestety wypisuje pierwszy znaleziony numer parzysty (2468), a nie najniższy :( Uwaga. Istnieje także problem z $/.frombrakiem znalezienia (może to być błąd w mojej starej wersji Rakudo). Oto wariant twojego rozwiązania, które działa ( dla mnie!) my$x=get;for 2,4,6,8 ->$n{if $x~~/$n/ {say $/.from,",$/";exit}};say "-1 0"; Wchodzi w 75 znaków, ale jestem pewien, że można zrobić krótsze rozwiązanie perl6.
draegtun
@draegtun ... Popełniłem wczoraj podobny błąd podczas mojej próby perl5 (patrz poniżej). Moja poprawka dodała 70 znaków! Właśnie zaktualizowałem wersję ~ 50 znaków - która wydaje się działać. Myślę, że jeśli posortujesz wszystkie parzyste cyfry w liczbie, możesz następnie dopasować, używając (teraz) pierwszej cyfry w sortowaniu i upewnij się, że masz najniższą i pierwszą. Czy mam rację?
G. Cito
@ G.Cito Wygląda mi dobrze i mam już +1 twojej odpowiedzi. Widzę sposób, by zgolić kilka znaków, ale widzę, że Heiko jest zrobione nawet lepiej niż to, co zamierzałem zasugerować!
draegtun
@draegtun O rany, kompletnie wtedy źle zrozumiałem pytanie :( Dziękuję bardzo! Zaktualizuję to jak najszybciej
Mouq
@mouq Oto podejście który wykorzystuje takie samo podejście jak perl5 przykład napisałem poniżej my $n; $_="333992";$n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/". Dowiedziałem się około .comb20 minut temu i już mi się podoba :-)
G. Cito
2

J, 44 znaki

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

wypisuje ostatni znak wejścia, jeśli nie zostanie znaleziona parzysta cyfra

Przykład:

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

Wyjaśnienie:

  • echo ... i=.1!:1]1jest wejście / wyjście. O wiele dłużej, niż tego chcę. Wejście jest również ukryte i.
  • '2468'i.~ znajduje pierwsze wystąpienie każdej parzystej cyfry na wejściu, zwracając długość wejściową, jeśli cyfra nie może zostać znaleziona
  • (#~(#i)&>)czyta „wybierz według długości wejściowej większej niż ta”; innymi słowy, wybierz te wskaźniki, które wskazują na dane wejściowe. O wiele dłużej, niż tego chcę.
  • _1,~dołącza -1 do tyłu. Podkreślenie jest sposobem J reprezentowania wartości ujemnych.
  • {. wybiera pierwszy element
  • (;{&i)łączy go ze znakiem wejściowym w tej pozycji w dwóch polach; ponieważ łączymy liczbę ze znakiem, konkatenacja bez boksu ( ,) nie zadziała. Jeśli pożądane jest wyświetlanie bez rozpakowania, indeks należy ":najpierw sformatować ( ) kosztem dwóch znaków.
John Dvorak
źródło
2

Python 2.7 - 76

Odpowiedź referencyjna, której w pełni oczekuję, że zostanę pobity. Ale aby zacząć od ludzi:

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

źródło
3
możesz ogolić postać, zmieniając indexna find; możesz także zmienić [2,4,6,8]na 2,4,6,8(z odstępem z przodu).
Justin,
4
Krótszy:print[(s.find(`e`),e)for e in 2,4,6,8if`e`in s+'8'][0]
grc
4
Myślę, że złamałeś własną zasadę ... Od kiedy raw_input nie jest standardowe?
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])

Przykłady (w R indeks zaczyna się od 1):

_4_502
6  2

_3_501
-1 0 

583746
5  4
Sven Hohenstein
źródło
2

PowerShell, 76 73 71

$s=read-host;2,4,6,8|%{if($i=$s.indexof("$_")+1){"$i,$_";break}};"-1,0"
  • $s=read-host przechowuje dane wejściowe użytkownika w $s
  • 2,4,6,8|%{...} uruchamia to, co jest w środku {}dla cyfr 2,4,6 i 8
  • $i=$s.indexof("$_")+1 ustawia $iindeks oparty na 1 cyfrze w $slub 0jeśli cyfra nie zostanie znaleziona
  • if( $i=... ){...} warunek będzie spełniony, gdy $inie będzie0
  • "$i,$_";break wyprowadza indeks i cyfrę oraz zatrzymuje wykonywanie
  • "-1,0" w przeciwnym razie wyjścia -1,0
Danko Durbić
źródło
To nie wyświetla poprawnego indeksu. W PowerShell, podobnie jak w przypadkach testowych podanych dla pytania, indeksy zaczynają się od zera.
Iszi
1
Reguła nr 2 mówi, że indeks może być oparty na 0 lub 1.
Danko Durbić
O. Nie zauważyłem tego. Tak czy inaczej, oto wariant od zera, który jest tylko 5 znaków dłuższy. $s=read-host;(2,4,6,8)|%{if(($i=$s.indexof("$_"))-gt-1){"$i,$_";break}};'-1,0'
Iszi
Jestem też całkiem pewien, że nawiasy wokół 2,4,6,8są niepotrzebne.
Iszi
Wariant zerowy można wydłużyć o 2 znaki, jeśli zmienisz warunek if na:if(1+($i=$s.indexof("$_")))
Danko Durbić
2

C ++ 11, 173 (w tym dwa znaki nowej linii)

Oto skompresowana wersja:

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

Oto czytelna wersja:

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

Oto starsza wersja:

C ++ 11, 175 (w tym dwa znaki nowej linii)

Oto skompresowana wersja:

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

Oto czytelna wersja:

#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";
}
But
źródło
Spróbować #define o std::cout<<. Myślę, że przycina twój kod o 1 znak.
@ user2509848, nie, to właściwie 2 znaki dłuższe. Ale i tak dzięki :)
Shoe
k==c?std::cout<<(...),throw 0:0;- operator warunkowy może zastąpić if, gdy wszystko czego potrzebujesz to wyrażenia. throwto wyrażenie, a także jeden znak krótszy niż return.
MSalters
1

C, 80 znaków

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

C # - 124

Jestem trochę spóźniony na przyjęcie

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");}
mnsr
źródło
0

Haskell, 79 znaków

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

Działa to trochę szybko i luźno z formatowaniem wyjściowym:

& 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
źródło
0

PowerShell: 145 103

Zmiany w stosunku do oryginału
Usunięto błąd quelch dla komentarza pytającego .

Kod:

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

Przewodnik:

"... "Wszystko w cudzysłowie zostanie dołączone do wyniku.

$(... )Wszystko między nawiasami będzie traktowane jako polecenia, a wynik samego kodu zostanie dołączony zamiast samych poleceń.

[array]::IndexOf(... )Służy do uzyskania indeksu elementu z tablicą. Pierwszym parametrem jest przeszukiwany obiekt tablicowy. Drugi parametr to obiekt do znalezienia. To tylko wypisuje indeks pierwszego pasującego elementu. Próbowałem po prostu użyć IndexOfmetody bezpośrednio przeciwko $s(np .: $s.IndexOf($x), ale to się nie udaje z jakiegoś powodu, którego jeszcze nie odkryłem - twierdzi, że metoda nie istnieje na tym obiekcie.

(... )Wyrażenie w nawiasie będzie pierwszym parametrem dla IndexOf.

$s= $ s będzie zmienną do przechowywania danych wejściowych użytkownika.

(read-host)-split'' Pobiera dane wejściowe użytkownika i dzieli je na tablicę znaków

|?{$_}Odfiltrowuje dodatkowe puste elementy tablicy, które są generowane przez -split''.

,(... )Wyrażenie w nawiasie będzie drugim parametrem dla IndexOf.

$x= $ s będzie zmienną do przechowywania najniższej parzystej cyfry z danych wejściowych użytkownika.

$s|?{$_%2-eq0} Wyciąga parzyste liczby z $ s.

|?{$_-gt0} Unieważnia zero.

|sort Sortuje pozostałe obiekty, domyślnie kolejność jest rosnąca.

|select -f 1 Wybiera pierwszy obiekt, który do tej pory będzie najniższą cyfrą parzystą.

,$xPowyższy kod wyświetli indeks naszej najniższej parzystej cyfry. Dodaje to przecinek, a następnie wypisuje samą cyfrę.

Uwagi:

Być może jest to trochę zasada rozciągania # 4. Jeśli nie ma parzystej cyfry, wynik nie będzie zawierał drugiej liczby.

Spowoduje to również wygenerowanie niektórych błędów nieterminalnych, jeśli dane wejściowe zawierają elementy nienumeryczne. Skrypt nadal będzie działał i dawał prawidłowe dane wyjściowe, ale możesz chcieć ustawić $ErrorActionPreferencego 'SilentlyContinue'przed uruchomieniem.

Iszi
źródło
@ DankoDurbić Teraz, gdy już mocno mnie pokonałeś, czy mógłbyś mi pomóc dowiedzieć się, dlaczego nie mogłem $s.IndexOftutaj skorzystać ? To dawało mi błąd, mówiąc, że metoda nie istnieje dla tego obiektu, mimo że $s|gmtak jest. Działa w systemie, w którym teraz jestem, ale nie w tym, w którym próbowałem to zrobić dzisiaj. Czy to problem ze zgodnością wersji? Wcześniejszy system to PSv2, obecny to PSv4.
Iszi
Twoja $sjest string[]i $s.indexofnie działa, ponieważ ...[System.String[]] doesn't contain a method named 'indexOf'wydaje się rozsądne (korzystam z PS 2.0). $s|gmzwraca członków System.String, a nie System.String[]. Nie jestem pewien, dlaczego to robi.
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

Pachnie lekko, ponieważ wykorzystuje dynamiczne ustawienie VB. Opcja Jawne wyłączenie i importowanie konsoli systemowej .

Adam Speight
źródło
0

VB.net (193c) przy użyciu LINQ

Ten wykorzystuje przede wszystkim zapytanie 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
źródło
0

Golf-Basic 84, 91 znaków

:L1/L1_L2i`L1:fpart(L1,2)2_L1:SortA(L1)@cumSum(L1)=length(L1):Thend`-1#d`cumSum(L1):Endd`L1
  • Upewnij się, że nie ma 0 danych wejściowych (nie jest nawet, kto powiedział, że to musi być dziwne?)
  • Uzyskaj dane wejściowe do L1 (Lista 1)
  • Moduł znajdowania pętli 2 dla każdej wartości
  • Sortuj L1 od najmniejszej do najwyższej
  • Wyświetl indeks (albo -1 albo sumę skumulowaną) i najmniejszą liczbę
Timtech
źródło
0

Powłoka Bourne'a (sh), 88 znaków

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

Myślałem, że dla zabawy zrobię przetwarzanie łańcuchów. Technicznie odczytuje ze standardowego wejścia, ale jeśli uruchomisz go interaktywnie, poprosi użytkownika o podanie danych, ponieważ klawiatura jest domyślnym strumieniem standardowego wejścia. Korzysta z podstawowych poleceń powłoki, aby podzielić dane wejściowe na linie, numerować je (przy użyciu nieznanego nlnarzędzia), odfiltrować wiersze spełniające kryteria, posortować je i wyprowadzić cyfrę o najniższej cyfrze. Drukuje, 88 -1jeśli nie znaleziono cyfry parzystej.

Robaczek świętojański
źródło
0

C ++ - 223 221 Postacie:

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

Wersja do odczytu:

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

Jest długi, ale nie tak zły jak Java.


źródło
W rzeczywistości jest to 221 + 2 (znaki nowej linii), w przeciwnym razie nie zostanie skompilowany.
But
O. Słowo wykryło tylko 221, zmienię je.
0

Javascript 93 znaki

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

Zbierz wszystkie numery zdarzeń, posortuj tablicę i wydrukuje pierwszą cyfrę.

Felipe Miosso
źródło
0

Mathematica, 157 znaków

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
źródło
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 naprawdę potrzebuje krótszego sposobu na zdobycie wkładu do gry w golfa. Policzyłem definicję fi jedno połączenie z f. Jednym z indeksowania jest to, dlaczego odpowiedzi różnią się od przykładów.

gggg
źródło
0

JavaScript - 53 znaków

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

Odczytuje dane wejściowe z monitu i wysyła (do konsoli) najniższy parzysty znak, a następnie (bez separatora) pierwszy indeks tego znaku; jeśli nie ma niezerowych parzystych znaków, to wypisuje 8-1.

MT0
źródło
0

C, 110 znaków

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

bez golfa:

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
źródło
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]]

Odczytuje wartość, iteruje każdy znak, jeśli reprezentacja liczbowa mod 2 jest równa 0, a liczba jest mniejsza niż to, co jest już zapisane b, zamień wartości nab

Danny
źródło
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
źródło
0

Rubinowy 55

p gets.chars.sort*''=~/[2468]/?[$_.index($&),$&]:[-1,0]
daniero
źródło
0

JavaScript / jQuery 149

Grał w golfa

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

Pełne źródło

<!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
źródło