Волнисто число является числом , где его цифры чередуются между вверх и вниз , как показано в следующем номер: 461902 или 708143, или даже 1010101, но не 123, потому что 2 <3.
Напишите программу или функцию, которая возвращает истинное значение, если число ненулевое , и ложное значение в противном случае. Самый короткий код выигрывает.
Примечание. Однозначные числа являются допустимым вводом, но не считаются неправильными , поэтому isUndulant
возвращает значение false при n <10.
code-golf
decision-problem
number-theory
Леонардо
источник
источник
Ответы:
J, 45
Образец использования:
Я почти уверен, что есть более тонкий способ скручивания Insert,
/
чтобы выполнять большую часть работы на ходу, но я уже несколько месяцев не работаю, мне нужно вернуться к этому.источник
Рубин,
7270 символовИспользование и тестовые случаи:
Единственные цифры дают ложь :
Последовательные идентичные цифры также возвращают false :
источник
J, 30 байт
Другой подход, чем другие ответы J.
Было бы на 3 символа короче, если бы 5 считались ненужными.
источник
(pdf) eTeX, 129 символов
Компиляция с
pdfetex filename.tex 1324?
дает вывод PDF. TeX - это, прежде всего, язык набора текста, а вывод вместо stdout займет около 20 символов. Также странное требование для однозначных чисел (false, а не true) занимает у меня 26 символов.источник
Haskell,
88777365 знаковЭто требует обычно используемого языка прагму (или
-X
флаг):NoMonomorphismRestriction
. Если вы этого не признаете, мы должны добавить 4 символа и определитьz
таким образом:источник
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
Это вроде элегантно.zipWith
один раз с тем же,compare
что вы сделали, затемzipWith
снова с(==)
иcycle[GT,LT]
или вcycle[LT,GT]
качестве второго аргумента.tail>>=zipWith compare
который сократил бы несколько байтов.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)
Шалфей,
8376 байтЕсть идея использовать cmp (* [..]) из JBernardo. В Sage
uniq(...)
это псевдоним дляlist(set(...))
.Изменить: только что заметил, что для х <10
uniq(cmp(...)) == []
, который не включен[[1],[-1]]
. Если бы x было введено как строка, а не как целое число, я мог бы получить еще 4 символа!источник
sum(uniq(...))^2
, так какsum([1,-1]) = 0
, и суммы синглетонов [1] и [-1] возводят в квадрат 1. К сожалению, это не удается на трижды повторяющейся цифре; 1011101.L
если число больше, чем 2 ** 32 в Python и влияет на результат. Это случается на Мудреце?L
заботится о том, потому что Sage - это подготовленный python; 1234 -> Целое число ('1234'). Вы можете перейти прямо к использованию Sage здесь: sagenb.orgPython:
101100 символовДо минификации:
После минификации:
источник
Питон,
134129 символовUngolfed:
источник
JavaScript, 88 символов
По сути, превратите число в строку и сравните соседние символы, отражая ожидание для каждого.
источник
К, 41 байт
Например
источник
CoffeeScript,
986753 байтатесты:
несжатый:
источник
J
44393631 байтИспользование как раньше.
Я не заметил, что мое последнее редактирование сделало неравенство с проверкой 0 совершенно ненужным. :-)
Предыдущий ответ (+ объяснение):
Использование:
Ответ состоит из четырех частей:
u=.".;' ',.":
Это читает число в виде строки":
, разбивает его на список символов, перед которыми стоят пробелы' ',.
, сшивает его обратно;
, преобразует его обратно в числа".
и затем сохраняет результат.u=.
Это в основном превращает 461902 в 4 6 1 9 0 2, который я считаю легче обрабатывать в J.*/2~:/\2<:/\
Это действует на значение, хранящееся в вас. Он берет каждую пару символов и проверяет, меньше ли левый или равен правому,2<:/\
поэтому 4 6 1 9 0 2 становится 1 0 1 0 1. Затем он берет результат этого и проверяет каждую пару чисел на неравенство2~:/\
поэтому 1 0 1 0 1 становится 1 1 1 1. Наконец, он умножает их все вместе, чтобы получить либо 0, либо 1.*/
В этот момент мы можем вернуть ответ, если бы не 2 вещи: одна цифра возвращает 1, когда вопрос требует 0; и равные числа обрабатываются так же, как «меньше чем», поэтому 461900 возвращает 1 вместо 0. Облом. На мы идем ...(1<#u)
Это проверяет, больше ли количество элементов, хранящихся в u,#u
чем 1, и возвращает false, если это просто однозначное число.(0=+/2=/\u)
Это берет каждую пару чисел, хранящихся в u, и проверяет равенство2=/\u
. Затем он суммирует ответы и проверяет, имеет ли он 0.Результаты частей 2, 3 и 4 затем умножаются вместе, чтобы (мы надеемся) получить 1, когда число соответствует требованиям, указанным в вопросе.
источник
a.i.":
чтобы побрить еще несколько персонажей.)Haskell, 82 байта
Попробуйте онлайн!
источник
readFile "Undulant.hs" >>= print . length . dropWhile (== '\n') . reverse . filter (/= '\r')
c=cycle[(<),(>)]
можно сократить доc=(<):(>):c
.zipWith3($)l(show n)$tail$show n
может бытьzipWith3($)l=<<tail$show n
и((>):c)
может бытьtail c
. Все вместе 70 байтов: попробуйте онлайн!Питон,
119108 байтисточник
... for a,b in zip(t,t[1:])
вместо использования диапазонов. Кроме того, вам не нужны квадратные скобкиall([...])
- Python создает генератор, когда находит(... for ...)
, даже если круглые скобки предназначены для вызова функции.x>9 and all(i^j for i,j in zip(l,l[1:]))
и удалиif l else False
.cmp(i,j)
и вместо того , чтобыi^j
установитьi*j<0
и тестированиеand l[0]!=0
. Еще несколько символов: - /print
спасает одного персонажаreturn
, но законно ли это? Спецификация запрашивает функцию, которая «возвращает».Питон, 155 символов
источник
C ++, 94 символа
тот же метод, что и у моего Erlang awnser с циклом for, а не с рекурсией.
источник
Python
105101100 символовРекурсивное решение.
c(r,t)
проверяет, является ли первый символr
меньше(t==-1)
или больше(t==1)
второго символа, и вызывает противоположную проверку укороченной строки.источник
0
, и вы можете сохранить три символа во второй строке, написавu=lambda x:x>9 and c(`x`,cmp(*`x`[:2])or 1)
x>9and
.Perl / re, 139 байт
дела все в регулярных выражениях - плохая идея.
Я использую Perl 5.12, но я думаю, что это будет работать на Perl 5.10. Я уверен, что 5.8 вышел.
источник
GolfScript, 48 байт
Надеясь победить J, я впервые использую GolfScript. Не совсем удалось.
источник
JavaScript,
66656260 байтПринимает ввод в виде строки, возвращает
true
для неоправданных чисел, пустую строку (Falsey) для однозначных чисел и вfalse
противном случае.Попытайся
Запустите фрагмент ниже, чтобы проверить
0-9
и 25 случайных чисел<10,000,000
.объяснение
Несколько забавных маленьких трюков в этом, так что я думаю, что это оправдывает редкое объяснение решения JS от меня.
Мы начинаем просто с анонимной функции, которая принимает целочисленную строку в качестве аргумента при вызове.
Этот аргумент сразу же разбивается на 2 параметра:
s
первый символ в строке иa
массив, содержащий оставшиеся символы (например,"461902"
становитсяs="4"
иa=["6","1","9","0","2"]
).Во-первых, мы объединяем
a
себя, что приводит оба вхождения к строкам. Если ввод представляет собой однозначное число, то оноa
будет пустым и, следовательно, станет пустой строкой; пустая строка плюс пустая строка по-прежнему является пустой строкой, и, поскольку в JS это неправильно, мы прекращаем обработку в логическом И и выводим нашу пустую строку. Во всех остальных случаяхa+a
будет правдой, и поэтому мы переходим к следующей части функции.Мы будем проверять , если каждый элемент
x
вa
возвратахtrue
при прохождении через функцию.Это определяет, каким будет наше первое сравнение (
<
или>
), и затем мы будем чередоваться оттуда. Мы проверяем,s
меньше ли строка, чем массивa
, который получает приведение к строке в процессе, поэтому, еслиs
он меньше, чем первый символ вa
,y
будетtrue
илиfalse
не будет.Мы строим строку с текущим значением
s
в начале иx
в конце. В промежутке мы индексируем строку"<>"
, увеличиваяy
ее начальное логическое значение на целое и по модулю 2, давая нам0
или1
.Оцените эту строку.
Наконец, мы передаем второй аргумент
eval
, который он игнорирует, и используем его, чтобы установитьs
текущее значениеx
для следующей итерации.источник
PowerShell, 88
Наивный и банальный. Я буду в гольф позже.
Мои тестовые случаи .
источник
JavaScript, 112
Вам нужно только передать один аргумент. Я мог бы, вероятно, играть в гольф дальше с петлей для.
источник
d>=l
->d>0
) и (d<=l
->d<2
) возможно? Я не присматриваюсь, поскольку, возможно,d
содержит дробные части, которые могут исказить его.L
, а не1
. Спасибо хоть!Эрланг,
137123118 символовисточник
CJam, 30 байтов
CJam новее, чем этот вызов, так что он не конкурирует за зеленую галочку, но в любом случае он не победитель (хотя я уверен, что на самом деле это может быть немало).
Проверьте это здесь.
Как это устроено
Во-первых, я делаю некоторые манипуляции со строками (за которыми следует eval), чтобы сохранить 5 байтов в дубликате кода:
Итак, по сути мой код
Во-первых, вот как я справляюсь со странным частным случаем одной цифры. Я копирую цифру по индексу
1
и добавляю ее к числу. Нужно выделить 3 случая:12...
, потом получаем212...
, поэтому начало не является избыточным, и не влияет на то, является ли полное число ненужным.11...
и тогда, мы получаем111...
. Теперь начало не отменено, но число все равно не уменьшилось, так что это также не повлияет на результат.1
будет первой цифрой (потому что индексирование массива CJam зацикливается вокруг конца), так что это приводит к двум одинаковым цифрам, и число не является лишним.Теперь подробно рассмотрим код:
Я уверен, что есть более короткий способ на самом деле проверить цифры (длиной больше 1) на предмет того, являются ли они ненульными (в частности, без использования двух сгибов), но я пока не смог их найти.
источник
Пролог 87 байт
Чтобы запустить его, просто сохраните его как golf.pl, откройте интерпретатор пролога (например, gprolog) в том же каталоге и выполните:
Он выдаст,
true
если номер будет лишним, иначе просто нет.источник
Mathematica, 46 байт
Примеры (пробелы не требуются):
источник
Scala,
141 133 12997 байтС a = n% 10, b = (n / 10)% 10, c = (n / 100)% 10
Тогда
a-b * b-c
либо сx*-y
или-x*y
сx
иy
как положительные числа, и продукт в обоих случаях отрицательный, но для-x*-y
илиx*y
(a <b <c или a> b> c) произведение всегда положительно.Остальная часть кода обрабатывает особые случаи: одна цифра, две цифры, две идентичные цифры.
источник
Perl, 78 байт
источник
Q, 71 байт
Пример использования:
источник
{(x>9)&any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':)("I"$')($)x}
($)
синтаксис,string
и логика приятна.Юлия 0,6 , 62 байта
Принимает число, возвращается
true
за Undulant, аfalse
за нет. Например,f(163)
возвращаетсяtrue
.Попробуйте онлайн!
источник