Kolejne genialne pytanie z Stack Overflow przerodziło się w wyzwanie w golfa !
Napisz program, który:
- 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.
- Znajduje indeks (na podstawie 0 lub 1) pierwszej najniższej parzystej cyfry .
- Drukuje 2 liczby całkowite , indeks i najniższą parzystą cyfrę .
- Jeśli nie ma cyfry parzystej , zwróć -1 jako indeks, druga liczba może być dowolna.
- 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.
Odpowiedzi:
Golfscript, 26 (28) znaków
Przykład:
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, że8
jest 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:
:x?x
aby to naprawić (nie lubię zmiennych tymczasowych.n@
(który również wykonuje zamianę),n\
(który nie wykonuje) lub]`
(który formatuje dane wyjściowe jako["8" -1]
).źródło
.0=@?
z.@\?
lub:x?x
zapisać jedną postać i uniknięcia wątpliwości co do kolejności. Ładne wykorzystanie8
jako awaryjne.APL (37)
(Domyślnie oparty na 1, ale przestrzega
⎕IO
)Wyjaśnienie:
⍞
: czytaj dane wprowadzone przez użytkownikam←⍵/⍨⍵∊'2468'
: usuń wszystkie znaki, które nie są2468
, zapisz wm
.×⍴m
: sprawdź, czy są:
: Jeśli tak:z←⌊/⍎¨m
: oceń każdy znakm
, znajdź najniższą liczbę i zapiszz
.z,⍨⍵⍳⍕z
: zwraca indeksz
in⍵
, a następniez
.⋄
: Jeśli nie:¯1,0
: powrót(-1, 0)
źródło
Python 3, 69
łącząc pomysły stąd .
źródło
Ruby, 60 znaków
$_
zawiera ostatnie wejście odczytane przezgets
.p
wywołujeinspect
argumenty i wypisuje wyniki.źródło
perl - -
94-53znaków (lub 48)Zamiast
index()
podejścia zerowego używamypos
i zaczynamy od jednego; bez CPAN. Uruchom to za pomocąperl -nE
i 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,sort
umieszcza 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
$m
do drugiej operacji dopasowania, która znajdzie pierwsze wystąpienie wartości$m
w oryginalnym ciągu. Nadal używamy tutaj wartości domyślnej$_
i zapisujemy dopasowanie do zawartości$m
in$1
(powód()
dookoła$m
w drugiej instrukcji). Po tym,pos
isay
zrobić resztę (iw mniejszej ilości znaków niżindex
aprint
).Jeśli kolejność wyjściowa lub przecinki nie mają znaczenia, możliwe jest zmniejszenie tych 5 znaków:
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 .).źródło
$SHELL
historii 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 :-(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 bajtów, AFAIK-n
kosztuje dodatkowy bajt).pos
zwraca przesunięcie. W efekcie zwraca indeks 1 w twoim przykładzie.perl
„s-M
wygra za każdym razem ;-)Perl 6,
375560 znakówEDYCJA: 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.
$/.from
pobiera pozycję dopasowania i',', $/.Int
jest 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 :)
źródło
$/.from
brakiem 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.my $n; $_="333992";$n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/"
. Dowiedziałem się około.comb
20 minut temu i już mi się podoba :-)J, 44 znaki
wypisuje ostatni znak wejścia, jeśli nie zostanie znaleziona parzysta cyfra
Przykład:
Wyjaśnienie:
echo ... i=.1!:1]1
jest wejście / wyjście. O wiele dłużej, niż tego chcę. Wejście jest również ukrytei
.'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.źródło
Python 2.7 - 76
Odpowiedź referencyjna, której w pełni oczekuję, że zostanę pobity. Ale aby zacząć od ludzi:
źródło
index
nafind
; możesz także zmienić[2,4,6,8]
na2,4,6,8
(z odstępem z przodu).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
Przykłady (w R indeks zaczyna się od 1):
źródło
PowerShell,
767371$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$i
indeks oparty na 1 cyfrze w$s
lub0
jeśli cyfra nie zostanie znalezionaif( $i=... ){...}
warunek będzie spełniony, gdy$i
nie będzie0
"$i,$_";break
wyprowadza indeks i cyfrę oraz zatrzymuje wykonywanie"-1,0"
w przeciwnym razie wyjścia-1,0
źródło
$s=read-host;(2,4,6,8)|%{if(($i=$s.indexof("$_"))-gt-1){"$i,$_";break}};'-1,0'
2,4,6,8
są niepotrzebne.if(1+($i=$s.indexof("$_")))
C ++ 11, 173 (w tym dwa znaki nowej linii)
Oto skompresowana wersja:
Oto czytelna wersja:
Oto starsza wersja:
C ++ 11, 175 (w tym dwa znaki nowej linii)
Oto skompresowana wersja:
Oto czytelna wersja:
źródło
#define o std::cout<<
. Myślę, że przycina twój kod o 1 znak.k==c?std::cout<<(...),throw 0:0;
- operator warunkowy może zastąpićif
, gdy wszystko czego potrzebujesz to wyrażenia.throw
to wyrażenie, a także jeden znak krótszy niżreturn
.C, 80 znaków
źródło
C # - 124
Jestem trochę spóźniony na przyjęcie
źródło
Haskell, 79 znaków
Działa to trochę szybko i luźno z formatowaniem wyjściowym:
źródło
PowerShell:
145103Kod:
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ćIndexOf
metody 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 dlaIndexOf
.$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 dlaIndexOf
.$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ą.,$x
Powyż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ć
$ErrorActionPreference
go'SilentlyContinue'
przed uruchomieniem.źródło
$s.IndexOf
tutaj skorzystać ? To dawało mi błąd, mówiąc, że metoda nie istnieje dla tego obiektu, mimo że$s|gm
tak 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.$s
jeststring[]
i$s.indexof
nie działa, ponieważ...[System.String[]] doesn't contain a method named 'indexOf'
wydaje się rozsądne (korzystam z PS 2.0).$s|gm
zwraca członkówSystem.String
, a nieSystem.String[]
. Nie jestem pewien, dlaczego to robi.vb.net (108c)
Pachnie lekko, ponieważ wykorzystuje dynamiczne ustawienie VB. Opcja Jawne wyłączenie i importowanie konsoli systemowej .
źródło
VB.net (193c) przy użyciu LINQ
Ten wykorzystuje przede wszystkim zapytanie LINQ.
źródło
Golf-Basic 84, 91 znaków
0
danych wejściowych (nie jest nawet, kto powiedział, że to musi być dziwne?)źródło
Powłoka Bourne'a (sh), 88 znaków
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
nl
narzędzia), odfiltrować wiersze spełniające kryteria, posortować je i wyprowadzić cyfrę o najniższej cyfrze. Drukuje,88 -1
jeśli nie znaleziono cyfry parzystej.źródło
C ++ - 223
221Postacie:Wersja do odczytu:
Jest długi, ale nie tak zły jak Java.
źródło
Javascript 93 znaki
Zbierz wszystkie numery zdarzeń, posortuj tablicę i wydrukuje pierwszą cyfrę.
źródło
Mathematica, 157 znaków
źródło
Julia, 84
Julia naprawdę potrzebuje krótszego sposobu na zdobycie wkładu do gry w golfa. Policzyłem definicję
f
i jedno połączenie zf
. Jednym z indeksowania jest to, dlaczego odpowiedzi różnią się od przykładów.źródło
JavaScript - 53 znaków
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
.źródło
C, 110 znaków
bez golfa:
źródło
JavaScript, 69
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
źródło
Rebol, 69
źródło
Rubinowy 55
źródło
JavaScript / jQuery 149
Grał w golfa
Pełne źródło
źródło