Falujący jest to numer gdzie cyfr na przemian w górę i w dół , jak na nr 461902 i 708143, lub nawet 1010101, a nie 123, ponieważ 2 <3.
Napisz program lub funkcję, która zwraca prawdziwą wartość, jeśli liczba jest niedulantna , a wartość fałsz w przeciwnym razie. Najkrótszy kod wygrywa.
Uwaga : Liczby jednocyfrowe są prawidłowymi danymi wejściowymi, ale nie są uważane za udulant , dlatego isUndulant
zwraca wartość false dla n <10.
code-golf
decision-problem
number-theory
Leonardo
źródło
źródło
Odpowiedzi:
J, 45
Przykładowe użycie:
Jestem prawie pewien, że istnieje lepszy sposób na skręcenie Wstawki,
/
aby wykonać więcej pracy za jednym zamachem, ale od miesięcy nie mam J, muszę do tego wrócić.źródło
Ruby,
7270 znakówZastosowanie i przypadki testowe:
Pojedyncze cyfry dają fałsz :
Kolejne identyczne cyfry również zwracają false :
źródło
J, 30 bajtów
Inne podejście niż inne odpowiedzi J.
Byłyby 3 znaki krótsze, gdyby 5 uważano za niedorzeczne.
źródło
(pdf) eTeX, 129 znaków
Kompilacja z
pdfetex filename.tex 1324?
daje wynik pdf. TeX jest przede wszystkim językiem składu, a wyjście na standardowe wyjście zajmie około 20 znaków więcej. Również dziwne wymaganie dla liczb jednocyfrowych (raczej fałszywe niż prawdziwe) zabiera mi 26 znaków.źródło
Haskell,
88777365 znakówWymaga to powszechnie używany język (lub pragmy
-X
flagę)NoMonomorphismRestriction
. Jeśli nie przyznasz się do tego, musimy dodać 4 znaki i zdefiniować wz
ten sposób:źródło
u n=length s>1&&(a[GT,LT]||a[LT,GT])where s=show n;z=q compare s$tail s;w=q(==)z;q=zipWith;a=and.w.cycle
To trochę eleganckie.zipWith
raz z,compare
tak jak ty, potemzipWith
znowu z(==)
icycle[GT,LT]
lubcycle[LT,GT]
jako drugi argument.tail>>=zipWith compare
skróciłoby to kilka bajtów.q
:q[]=0<1;q(a:b:s)|a/=b,a/=EQ=q$b:s;q _=0>1
q s=and$all(/=EQ)s:zipWith(/=)s(tail s)
Sage,
8376 bajtówWpadłem na pomysł użycia cmp (* [..]) od JBernardo. W Sage
uniq(...)
jest pseudonimemlist(set(...))
.Edycja: właśnie zauważyłem, że dla x <10
uniq(cmp(...)) == []
, która nie jest włączona[[1],[-1]]
. Gdyby x wprowadzono jako ciąg, zamiast liczby całkowitej, mógłbym uzyskać kolejne 4 znaki!źródło
sum(uniq(...))^2
,sum([1,-1]) = 0
a sumy kwadratów singletonów [1] i [-1] do 1. Niestety nie udaje się to na trzykrotnie powtarzanej cyfrze; 1011101.L
jeśli liczba jest większa niż 2 ** 32 w Pythonie i wpływa na wynik. Czy tak się dzieje na Sage?L
ponieważ Sage jest przygotowanym pythonem; 1234 -> Liczba całkowita („1234”). Możesz przeskoczyć prawo do korzystania Sage tutaj: sagenb.orgPython:
101100 znakówPrzed minifikacją:
Po minifikacji:
źródło
Python,
134129 znakówNie golfowany:
źródło
JavaScript, 88 znaków
Zasadniczo zamień liczbę na ciąg znaków i porównaj sąsiednie postacie, zmieniając oczekiwania dla każdego z nich.
źródło
K, 41 bajtów
Na przykład
źródło
CoffeeScript,
986753 bajtyTesty:
Nieskompresowane:
źródło
J,
44393631 bajtówWykorzystanie jak poprzednio.
Nie zauważyłem, że moja ostatnia edycja sprawiła, że nierówność z czekiem 0 była zupełnie niepotrzebna. :-)
Poprzednia odpowiedź (+ wyjaśnienie):
Stosowanie:
Odpowiedź składa się z czterech części:
u=.".;' ',.":
Odczytuje liczbę jako ciąg znaków":
, dzieli ją na listę znaków poprzedzoną spacjami' ',.
, łączy ją z powrotem;
, konwertuje z powrotem na liczby,".
a następnie zapisuje wynik.u=.
Zasadniczo zamienia 461902 na 4 6 1 9 0 2, co jest dla mnie łatwiejsze przetwarzać w J.*/2~:/\2<:/\
Działa to na wartości zapisanej w u. Bierze każdą parę znaków i sprawdza, czy lewa jest mniejsza lub równa prawej,2<:/\
więc 4 6 1 9 0 2 staje się 1 0 1 0 1. Następnie bierze wynik tego i sprawdza każdą parę liczb pod kątem nierówności2~:/\
więc 1 0 1 0 1 staje się 1 1 1 1. W końcu mnoży je wszystkie razem, aby uzyskać 0 lub 1*/
W tym momencie moglibyśmy zwrócić odpowiedź, gdyby nie dwie rzeczy: pojedyncza cyfra zwraca 1, gdy pytanie wymaga 0; i równe liczby są traktowane tak samo jak „mniej niż”, więc 461900 zwraca 1 zamiast 0. Bummer. Jedziemy ...(1<#u)
To sprawdza, czy liczba elementów przechowywanych u#u
jest większa niż 1 i zwraca false, jeśli jest to tylko jedna cyfra.(0=+/2=/\u)
Pobiera każdą parę liczb zapisanych wu i sprawdza równość2=/\u
. Następnie sumuje odpowiedzi i sprawdza, czy ma 0.Wyniki części 2, 3 i 4 są następnie mnożone razem, aby (miejmy nadzieję) otrzymać 1, gdy liczba spełnia wymagania określone w pytaniu.
źródło
a.i.":
by ogolić jeszcze kilka postaci).Haskell, 82 bajty
Wypróbuj online!
źródło
readFile "Undulant.hs" >>= print . length . dropWhile (== '\n') . reverse . filter (/= '\r')
c=cycle[(<),(>)]
można skrócić doc=(<):(>):c
.zipWith3($)l(show n)$tail$show n
może byćzipWith3($)l=<<tail$show n
i((>):c)
może byćtail c
. 70 bajtów razem: wypróbuj online!Python,
119108 bajtówźródło
... for a,b in zip(t,t[1:])
rather than using ranges. Also, you don't need the brackets inall([...])
-- Python makes a generator when it finds(... for ...)
, even if the parentheses are for a function call.x>9 and all(i^j for i,j in zip(l,l[1:]))
and removeif l else False
.cmp(i,j)
and insteadi^j
seti*j<0
, and testingand l[0]!=0
. Few more characters :-/print
saves one character overreturn
, but is it legitimate? The spec does ask for a function that "returns".Python, 155 chars
źródło
C++, 94 chars
same method as my Erlang awnser with a for loop rather than recursion.
źródło
Python
105101100 charsRecursive solution.
c(r,t)
checks if first char ofr
is less(t==-1)
or greater(t==1)
of second char, and call opposite check on shortened string.źródło
0
, and you can save three characters on the second line by writingu=lambda x:x>9 and c(`x`,cmp(*`x`[:2])or 1)
x>9and
.Perl/re, 139 bytes
Doing everything in regex is kind of a bad idea.
I'm using Perl 5.12 but I think this will work on Perl 5.10. Pretty sure 5.8 is out though.
źródło
GolfScript, 48 bytes
Hoping to beat J, my first time using GolfScript. Didn't quite succeed.
źródło
JavaScript,
66656260 bytesTakes input as a string, returns
true
for undulant numbers, an empty string (falsey) for single digit numbers andfalse
otherwise.Try it
Run the Snippet below to test
0-9
and 25 random numbers<10,000,000
.Explanation
A few fun little tricks in this one so I think it warrants a rare explanation to a JS solution from me.
We start, simply, with an anonymous function which takes the integer string as an argument when called.
That argument is immediately destructured into 2 parameters:
s
being the first character in the string anda
being an array containing the remaining characters (e.g."461902"
becomess="4"
anda=["6","1","9","0","2"]
).First, we concatenate
a
with itself, which casts both occurrences to strings. If the input is a single digit number thena
will be empty and, therefore, become and empty string; an empty string plus an empty string is still an empty string and, because that's falsey in JS, we stop processing at the logical AND and output our empty string. In all other casesa+a
will be truthy and so we continue on to the next part of the function.We'll be checking if every element
x
ina
returnstrue
when passed through a function.This determines what our first comparison will be (
<
or>
) and then we'll alternate from there. We check if the strings
is less than the arraya
, which gets cast to a string in the process so, ifs
is less than the first character ina
,y
will betrue
orfalse
if it's not.We build a string with the current value of
s
at the beginning andx
at the end. In between, we index into the string"<>"
by incrementingy
, casting its initial boolean value to an integer, and modulo by 2, giving us0
or1
.Eval that string.
Finally, we pass a second argument to
eval
, which it ignores, and use it to set the value ofs
to the current value ofx
for the next iteration.źródło
PowerShell, 88
Naïve and trivial. I will golf later.
My test cases.
źródło
JavaScript, 112
You only need to pass it one argument. I could probably golf this further with a for loop.
źródło
d>=l
->d>0
) and (d<=l
->d<2
) perhaps? I'm not looking closely, as perhapsd
might contain fractional parts that might skew it.L
, not a1
. Thanks though!Erlang,
137123118 charsźródło
CJam, 30 bytes
CJam is newer than this challenge, so this does not compete for the green checkmark, but it's not a winner anyway (although I'm sure this can actually be golfed quite a bit).
Test it here.
How it works
Firstly, I'm doing some string manipulation (followed by eval) to save 5 bytes on duplicate code:
So in effect my code is
First, here is how I deal with the weird special case of a single digit. I copy the digit at index
1
and prepend it to the number. We need to distinguish 3 cases:12...
, then we get212...
, so the start is undulant, and won't affect whether the entire number is undulant.11...
, then we get111...
. Now the start is not undulant, but the number wasn't undulant anyway, so this won't affect the result either.1
will be the first digit (because CJam's array indexing loops around the end), so this results in two identical digits, and the number is not undulant.Now looking at the code in detail:
I'm sure there is a shorter way to actually check digits (of length greater 1) for whether they are undulant (in particular, without using two folds), but I couldn't find it yet.
źródło
Prolog 87 bytes
To run it, just save it as golf.pl, open a prolog interpreter (e.g. gprolog) in the same directory then do:
It will give
true
if the number is undulant, otherwise just no.źródło
Mathematica, 46 bytes
Examples (spaces are not required):
źródło
Scala,
141 133 12997 bytesWith a = n % 10, b = (n/10) % 10, c = (n/100) % 10
Then
a-b * b-c
is eitherx*-y
or-x*y
withx
andy
as positive numbers, and the product is in both cases negative, but for-x*-y
orx*y
(a < b < c or a > b > c) the product is always positive.The rest of the code is handling special cases: one digit, two digits, two identical digits.
źródło
Perl, 78 bytes
źródło
Q, 71 bytes
Sample usage:
źródło
{(x>9)&any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':)("I"$')($)x}
gives 62($)
syntax forstring
before and the logic is a nice touch.Julia 0.6, 62 bytes
Takes in a number, returns
true
for Undulant, andfalse
for not. Egf(163)
returnstrue
.Try it online!
źródło