Это приятный номер?


22

Приятное число (согласно этому определению) - это число, которое можно передать через следующий процесс (давайте использовать 41802000в качестве примера):

  • Разделите одинаковые номера в конце ( 41802000 => [41802, 000])
  • Отсортируйте первую половину цифр и возьмите максимум ( [41802, 000] => [8, 000])
  • Возьмите длину последнего элемента. Вызовите результирующие элементы A и B ( [8, 000] => A=8, B=3)
  • Является ли N B = A для любого целого числа N? ( Trueв этом примере; 2 3 = 8)

Если ввод происходит в результате Trueследующего процесса, это считается приятным.

Ваша задача - взять целое число xи вывести, xявляется ли число приятным. Вы можете вывести любые два разных значения для truey и falsey, но, пожалуйста, укажите, что вы используете в своем ответе. xгарантированно имеет как минимум две разные цифры (например 111, это неверный ввод). Как и в большинстве задач, вы можете взять xв виде строки или списка цифр.

Это поэтому выигрывает самый короткий код в байтах .

Контрольные примеры

          Input          Output
       41802000               1
            100               1
      123456788               0
      451111111               0
234543454545444               0
             12               1
       41902000               0
          92599               1

можно ли передать число в виде строки? (особенно с учетом теста «234543454545444»)
Уриэль

@Uriel Вы можете принять входные данные в виде строки
caird coinheringaahing

3
В качестве предложения для пояснения: я бы использовал термин «цифра», а не «число», поскольку вы конкретно ссылаетесь на десятичные символы, абстрагированные от их числовых значений.
Джонатан Фрех

list of digits- будет ли это список цифровых символов ASCII или список целых чисел от 0-9
Decurous

1
@ Οurous До вас
Caird Coneheringaahing

Ответы:


9

APL (Dyalog) , 36 байт

{(⊢≡⌊)(⌈/⍎¨⍵/⍨~o)*÷≢⍵/⍨o←⌽⌊\1,2=/⌽⍵}

Попробуйте онлайн!

Как?

Почти стихотворение.

⌽⍵ - один раз изменить вход,

1,2=/ - получить список различий.

⌊\ - сохранить только первую группу единиц,

- и переверните его, чтобы завершить.


o←- присвоить o,

~o - переключать нули и нули,

⍵/⍨ - фильтруйте вход с ним,

⍎¨ - превратить результат в список каждой цифры,

  • ⌈/- и получите максимум. (это)

⍵/⍨o- отфильтруйте вход с помощью ounalt (ered),

- и возьми длину, это было бы B.

÷ - разделить на один результат,

* - и возьми себе эту власть.


⊢≡⌊ - целое число?


8

05AB1E , 11 байт

γRćgUZXzm.ï

Попробуйте онлайн!

объяснение

γRćgUZXzm.ï ~ Полная программа.

γ ~ Разделить на серии цифр.
 Реверс.
  ~ Вставьте [1:], [0] в стек.
   g ~ длина (из [0]).
    U ~ Присвойте это целочисленной переменной X.
     ZX ~ Получите максимум, не хлопая, и нажмите X.
       ZM ~ A 1 / В .
         .i ~ Это целое число?

Эминья спасла 1 байт.

Полагается на тот факт, что если A является положительным целым числом N, возведенным в степень B , то N = A 1 / B , следовательно, оно должно быть целым числом.


UZXдолжен работать вместоs{θs
Emigna

9-байтовая программа не работает 41902000(должна быть ложной).
Згарб

@Zgarb Да, я был почти уверен, что это потерпит неудачу, поэтому я удалил его ... Кроме того, lol, мы получили точно такое же целое число
Mr. Xcoder

Сбой для418802000
Okx

8

Haskell , 85 75 72 71 байт

Изменить : -10 байт, взяв список цифр вместо строки. Спасибо WhatToDo за указание, что это разрешено. -3 байта благодаря решению Ourous в Clean . -1 байт благодаря пользователю 28667 .

f s|(b,a)<-span(==last s)$reverse s=or[n^length b==maximum a|n<-[1..9]]

Попробуйте онлайн! Вводит в виде списка цифр. Пример использования: f [4,1,8,0,2,0,0,0]доходность True.

Объяснение:

Учитывая вход s=[4,1,8,0,2,0,0,0], мы reverseсписок и выделить ведущие элементы с span(==last s): ([0,0,0],[2,0,8,1,4]). Сравнение шаблонов по (b,a)урожайности b=[0,0,0]и a=[2,0,8,1,4].

В список постижение or[n^length b==maximum a|n<-[1..a]]проверяет , является ли любое целое число nв диапазоне от 1до 9удовлетворяет n^length b==maximum a, то есть n^3=8.


Вы опубликовали свои, прежде чем я сделал мои, и наши похожи, так что: Попробуйте онлайн!
WhatToDo

@WhatToDo Спасибо, я не видел те списки цифр, где разрешено в качестве ввода.
Лайкони

Не могли бы вы просто взять максимум. Не нужно проверять их все.
Тим

@ Я не уверен, что понимаю, что ты имеешь в виду. Взятие максимума из всего списка ввода для получения aне удастся в таких случаях, как 477.
Лайкони

@ Я получаю максимум, чтобы получить b, но проверяю каждое целое число nот 0до 9(ранее от 0до a). Это точно спецификация, насколько я вижу.
Лайкони

5

Haskell , 104 89 байт

@Laikoni нашел более короткое решение , но это лучшее, что я мог сделать. Спасибо @Laikoni за сообщение, что мы также можем принимать списки цифр в качестве входных данных.

import Data.List
(g.length.last<*>maximum.concat.init).group
g b a=any(==a)$(^b)<$>[1..a]

Объяснение:

Попробуйте онлайн!


Зачем использовать, any(==a)когда вы могли бы использовать elem a?
Wheat Wizard

@WheatWizard Спасибо за предложения, касающиеся вашего второго комментария: разве это не сработает, например 2888?
flawr

Да, похоже, я неправильно понял вопрос. Я не понимал, что конечные числа могут быть чем угодно, кроме нуля.
Wheat Wizard

но head.maximumвсе же короче, чем maximum.concatна 2 байта, и сохраняет функциональность.
Wheat Wizard

4

R , 80 байт

function(x)any((0:(m=max((d=rle(rev(utf8ToInt(c(x,''))-48)))$v[-1])))^d$l[1]==m)

Попробуйте онлайн!

Пользы utf8ToInt - 48 для разделения числа на цифры. Это выдает предупреждение от преобразования в строку.

С помощью rle получите количество завершающих цифр и максимальное значение первых цифр. Верните true, если любое значение из диапазона от 0 до максимального значения до степени конечного счетчика равно максимальному значению.

Я думаю, что есть еще возможности для игры в гольф, но это может подождать до завтра.


2
Я удалил свой ответ, потому что я не видел, что мое сообщение просто объединяет ваш ответ и @ NofP's: function(x,R=rle(rev(utf8ToInt(x)-48)))!max(R$v[-1])^(1/R$l[‌​1])%%1(66 байтов, принимая xв качестве строки)
plannapus

@plannapus Лично я бы восстановил это. Это лучший счет, чем у нас обоих, и не совсем копия
MickyT

@plannapus Я согласен с MickyT!
NofP

@NofP и MickyT: Хорошо, вот оно,
plannapus

4

Желе , 11 байт

ŒgµṪL9*€fṀL

Вводит в виде списка цифр.

Попробуйте онлайн!

Как это работает

ŒgµṪL9*€fṀL  Main link. Argument: D (digit array)

Œg           Group runs of digits, yielding a run array R.
  µ          Begin a new chain with argument D.
   Ṫ         Tail; remove and yield the last element of D.
    L        Take the length. Let's call it b.
     9*€     Compute [1**b, ..., 9**b].
         Ṁ   Take the maximum run in R, yileding [a, ..., a].
        f    Filter, yielding either [a] (if a = n**b for some n) or [].
          L  Take the length. 

Прежде чем посмотреть на ответы и вообще не зная Jelly, я догадался, что ответ Jelly будет 12 байтов. ;)
DLosc

4

R, 66 байт

Этот ответ более или менее является смесью ответов MickyT и NofP , и по их запросу, вот он:

function(x,R=rle(rev(utf8ToInt(x)-48)))!max(R$v[-1])^(1/R$l[1])%%1

Он принимает х в виде строки.

> f=function(x,R=rle(rev(utf8ToInt(x)-48)))!max(R$v[-1])^(1/R$l[1])%%1
> f("41802000")
[1] TRUE
> f("100")
[1] TRUE
> f("123456788")
[1] FALSE
> f("451111111")
[1] FALSE
> f("234543454545444")
[1] FALSE
> f("12")
[1] TRUE
> f("41902000")
[1] FALSE

3

JavaScript (ES7), 66 байт

Принимает ввод в виде строки или массива символов. Возвращает логическое значение.

f=([c,...s],m)=>s.some(n=>n-c)?f(s,c<m?m:c):!(m**(1/-~s.length)%1)

Контрольные примеры



3

Python 2 , 95 78 байт

  • Сэкономили семнадцать байтов благодаря Роду .
def f(s,i=~0):
	while s[i]==s[~0]:i-=1
	return int(max(s[:-~i]))**(1./~i)%1==0

Попробуйте онлайн!


Вам не нужна сортировка, вы можете просто получить максимум, и, поскольку вы уже получили, iвы можете сбросить len до 78 байтов
Rod

@ Род Большое спасибо.
Джонатан Фрех

2

R , 93 байта

function(x){n=nchar(x)
d=x%/%10^(n:1-1)%%10
i=max(which(d!=d[n]))
max(d[1:i])^(1/(n-i))%%1>0}

Попробуйте онлайн!

Код принимает целое число в качестве входных данных и возвращает FALSE, если число приятно, и TRUE в противном случае.


2

Python 3 , 88 85 байт

def f(n):p=n.rstrip(n[-1]);a=int(max(p));b=len(n)-len(p);return round(a**(1/b))**b==a

Ungolfed:

def is_pleasing_number( n ):
    prefix = n.rstrip(n[-1])
    a = int(max(prefix))
    b = len(n) - len(prefix)
    return round(a ** (1 / b)) ** b == a
  • Ожидается, что входной аргумент будет цифровой строкой
  • Выход либо TrueилиFalse .
  • Подобно тому, что было разработано независимо от ответа Халварда, но использует арифметику с плавающей запятой таким образом, что не страдает от ошибок округления до тех пор, пока не a ** (1 / b)будет по меньшей мере 0,5 от b √a, для которого требуется значение выше 2 53 (или любого другого значения, основанного на осях с плавающей точкой и мантиссе длина Python случается использовать, смотрите sys.float_info).
  • Может быть изменен тривиально, чтобы по-прежнему работать с произвольными числами от 2 до 36.

@ovs: Да, с незначительными изменениями. Функция должна принять базу в качестве дополнительного аргумента и передать ее вызовам intи range. (В какой-то момент стало бы более целесообразным оценивать диапазон поиска на основе, a^(1/b)чем рассчитывать большие количества мощностей.)
Дэвид Фёрстер



1

Perl 6 , 55 байт

{m/(\d+?)((\d)$0*)$/;so any(^10)**$1.comb==$0.comb.max}

Попробуйте онлайн!

После вычисления начального регулярного выражения, которое может быть успешным только в том случае, если входное значение является положительным целым $0числом, содержит начальную часть числа, и$1 содержит содержит завершающие повторяющиеся цифры.

combМетод без аргументов, применяется к строке, возвращает список символов, которые в числовом контексте значение длины списка. Так $0.comb.maxсамая большая из цифр в префиксе, и$1.comb это длина суффикса.

Затем мы проверяем any(^10), равняется ли (то есть, ор-соединение чисел от 0 до 9), когда оно увеличено до степени длины суффикса, самой большой цифре в префиксе. В soсилах булевых оценок полученного перехода, которые иначе было бы просто прекрасно сами по себе как ценность truthy, но проблема требует только два различных значений , которые будут возвращены.


Это поздно, но поскольку входные данные гарантированно являются целыми числами, регулярное выражение может использовать .вместо \d.
DLosc



1

C # (.NET Core) , 132 байта

n=>{int A=0,B=1,s=1,i=n.Length-1;for(;i-->0;)if(n[i]==n[i+1]&s>0)B++;else{A=n[i]>A?n[i]:A;s=0;}return System.Math.Pow(A,1d/B)%1==0;}

Попробуйте онлайн!

Подтверждения

-12 байт благодаря @KevinCruijssen

DeGolfed

n=>{
    int A=0, // maximum digit
        B=1, // count of trailing identical numbers
        s=1, // 1 if dealing with trailing numbers, 0 otherwise
        i=n.Length-1;

    for(; i-- > 0;)
        if(n[i] == n[i+1] & s > 0)
            B++;
        else
        {
            A = n[i] > A? n[i] : A;
            s = 0;
        }

    return Math.Pow(A, 1d/B) % 1 == 0;
}

Я знаю, что это было давно, но i=n.Length-2;for(;i>=0;i--)можно играть в гольф i=n.Length-1;for(;i-->0;)и &&можно играть в гольф &.
Кевин Круйссен,

О, и вы можете сыграть в гольф еще 6 байтов, удалив using System;и используя System.Math.Powнапрямую.
Кевин Круйссен

Последняя вещь. В настоящее время вы берете список символов, но также разрешено принимать список цифр. В этом случае их -48можно использовать для -3 байта.
Кевин Круйссен

1

Japt , 26 18 байт

ó¶
o l
ñ o n qV v1

Попробуйте онлайн!


Принимает ввод в виде строки, возвращает 1для приятных чисел, в 0противном случае.

Краткое объяснение:

ó¶

Возьмите первый вход и разделите его по значениям где (x,y) => x===ytrue. Например, '41802000'чтобы['4','1','8','0','2','000'] .

o l

Возьмем массив из первого шага, удалить последний элемент и получить его длину, получая B .

ñ o n qV v1

Найдите самый большой элемент в оставшемся массиве, получая A , возьмите его в степень 1/Bи затем верните, если результат делится на один.


Впервые работая с Japt, очень открыт для любых рекомендаций.
Срезано на 8 байт благодаря ETHproductions .


Привет, добро пожаловать в Japt! Извините, я сначала пропустил ваши ответы. Несколько советов: 1) Вы можете использовать авто-функцию, чтобы превратить первую строку в просто ó¶. 2) Не уверен, почему у вас есть vво второй строке, так как он просто преобразует строку в нижний регистр и не влияет на длину ;-) 3) Вы можете избежать !(Uна последней строке, изменив %1на v1, который возвращает, 1если субъект делится на 1 или 0иным образом.
ETHproductions

@ETHproductions Большое спасибо за ваши отзывы, очень ценю это. Я читал об авто-функциях раньше, но до сих пор не совсем понял, спасибо за пример. Я включил и остальные ваши изменения, добавив в общей сложности 8 байтов.
Нит


0

Древесный уголь , 33 байта

≔ESιθ⊞υ⊟θW⁼§υ⁰§θ±¹⊞υ⊟θ¬﹪XI⌈θ∕¹Lυ¹

Попробуйте онлайн! Ссылка на подробную версию кода. Выходы -для приятных номеров. Объяснение:

≔ESιθ

Разделить ввод qна символы.

⊞υ⊟θ

Удалите последний символ из qи нажмите его u(предопределено в пустой список).

W⁼§υ⁰§θ±¹⊞υ⊟θ

Повторно нажимайте и нажимайте, пока последний символ qявляется первым символом u.

¬﹪XI⌈θ∕¹Lυ¹

Возьмите максимальную цифру qи возведите ее в степень, равную обратной длинеu , затем проверьте, является ли результат целым числом.




0

Java 8, 125 байт

a->{int A=0,B=1,f=1,i=a.length-1;for(;i-->0;)if(a[i]==a[i+1]&f>0)B++;else{A=a[i]>A?a[i]:A;f=0;}return Math.pow(A,1d/B)%1==0;}

Порт ответа @ Ayb4btu на C # .NET .

Попробуйте онлайн.

Объяснение:

a->{                       // Method with digit-array parameter and boolean return-type
  int A=0,                 //  Maximum digit `A` as specified in the challenge description
      B=1,                 //  `B` as specified in the challenge description
      f=1,                 //  Flag-integer, starting at 1
      i=a.length-1;        //  Index integer `i`
  for(;i-->0;)             //  Loop `i` backwards over the digits (excluding the last)
    if(a[i]==a[i+1]        //   If the current and next digits are the same,
       &f>0)               //   and the flag is still 1
      B++;                 //    Increase `B` by 1
    else{                  //   Else:
      A=a[i]>A?            //    If the current digit is larger than `A` 
         a[i]              //     Replace `A` with the current digit
        :                  //    Else:
         A;                //     Leave `A` the same
      f=0;}                //    Set the flag-integer to 0
  return Math.pow(A,1d/B)  //  Return if `A` ^ (1/`B`)
    %1==0;}                //  is an exact integer


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.