Найти, сколько буквенно-цифровых символов можно составить из одного числа


23

Буквенно-цифровые символы имеют ASCII-значения:

0-9  ->  48-57
A-Z  ->  65-90
a-z  ->  97-122

Ваша задача - взять целое число в качестве входных данных и вывести, сколько символов можно сделать, используя последовательные цифры этого числа. Коды символов могут перекрываться. 666должно привести 2, так как у вас есть 66дважды.

Тестовые случаи:

Input: 5698
Possible characters: '8' (56), 'E' (69), 'b' (98)
Output: 3

Input: 564693
Possible characters: '8' (56), 'E' (69)
Output: 2

Input: 530923864209124521
Possible characters: '5' (53), 'V' (86), '4' (52)  
Output: 3

Input: 1111111
Possible characters: 'ooooo' (5*111)
Output: 5

Input: 5115643141276343
Possible characters: '3' (51), '8' (56), 'L' (76), 's' (115)
Output: 4

Input: 56789
Possible characters: '8' (56), 'C' (67), 'N' (78), 'Y' (89)
Output: 4

Input: 94
Possible characters: ''
Output: 0

Input: 1
Output: 0

Форматы ввода и вывода являются необязательными (да, вы можете взять целое число в виде строки).

Ответы:


11

05AB1E , 8 7 байт

žKÇIŒÃg

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

объяснение

žK       # push [a-zA-Z0-9]
  Ç      # convert to list of ascii codes
   IŒ    # push all substrings of input
     Ã   # keep only the subtrings which exist in the list of acsii codes
      g  # push length of resulting list

ŒžKÇÃgне работает?
Волшебная Урна Осьминога

@carusocomputing: К сожалению, он не проходит 1111111тест-кейс.
Emigna

Ã, это имеет гораздо больше смысла теперь, когда я прочитал, что он делает, дерьмо.
Волшебная Урна Осьминога

7

Брахилог , 22 байта

∧Ạụ:Ạ:Ịcạ:?{tT&h∋~sT}ᶜ

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

объяснение

       c                 Concatenate together:
∧Ạụ:                       "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    Ạ:                     "abcdefghijklmnopqrstuvwxyz"
      Ị                    "0123456789"
        ạ                Get the list of ASCII codes of that string
         :?{        }ᶜ   Count the number of results, for input [list of codes, Input], of:
            tT             Call the Input T
              &h∋          Take one ASCII code
                 ~sT       It is a substring of T

К сожалению для меня, к счастью для вас, у меня нет доступа к компьютеру в данный момент;)
Leaky Nun

@ LeakyNun Я думал о более коротких способах сделать это, оба терпят неудачу из-за ошибок.
Fatalize

Можете ли вы присоединиться к двум Tвместе?
Утренняя монахиня

1
В чем причина этой ошибки?
Утренняя монахиня

1
@LeakyNun Например, для целого числа 13 существует бесконечно много списков и бесконечно много целых чисел, содержащих 13, и неясно, в каком порядке вы должны их перечислять.
Fatalize

7

MATL , 17 13 байт

8Y2"G@oVXf]vn

Попробуйте онлайн! Или проверьте все тестовые случаи .

объяснение

8Y2     % Predefined literal: string with all letters, uppercase and lowercase,
        % and digits
"       % For each character in that string
  G     %   Push input, for example the string '5115643141276343'
  @     %   Push current character, such as 'A'
  o     %   Convert to its ASCII code, such as 65
  V     %   String representation, such as '65'
  Xf    %   Find string '65' within string '5115643141276343'. This gives a vector
        %   (possibly empty) with indices of occurrences
]       % End
v       % Concatenate all stack contents vertically
n       % Number of entries. Implicitly display

6

Java 7, 204 197 195 байт

int c(String n){int r=0,i=0,e=n.length()-1,t;for(;i<e;r+=((t=new Byte(n.substring(i,i+2)))>47&t<57)|(t>64&t<91)|(t>96&t<100)|((t=new Short(n.substring(i,i++>e-2?i:i+2)))>99&t<123)?1:0);return r;}

Объяснение:

int c(String n){       // Method with String parameter and integer return-type
  int r=0,             //  Result
      i=0,             //  Index
      e=n.length()-1,  //  Length of String -1
      t;               //  Temp integer
  for(;i<e;            //  Loop over the String using the index
    r+=                //   Append the result-sum with:
      ((t=new Byte(n.substring(i,i+2)))>47&t<57)|(t>64&t<91)|(t>96&t<100)
                       //    If two adjacent digits are a digit or letter
      |                //    or
      ((t=new Short(n.substring(i,i++>e-2?i:i+2)))>99&t<123)?
                       //    if three adjacent digits are a letter
       1               //     Raise the sum by 1
      :                //    Else:
       0               //     Keep the sum the same (by adding 0)
  );                   //  End of loop (implicit / no body)
  return r;            //  Return result
}                      // End of method

Тестовый код:

Попробуй это здесь.

class M{
  static int c(String n){int r=0,i=0,e=n.length()-1,t;for(;i<e;r+=((t=new Byte(n.substring(i,i+2)))>47&t<57)|(t>64&t<91)|(t>96&t<100)|((t=new Short(n.substring(i,i++>e-2?i:i+2)))>99&t<123)?1:0);return r;}

  public static void main(String[] a){
    System.out.println(c("5698"));
    System.out.println(c("564693"));
    System.out.println(c("530923864209124521"));
    System.out.println(c("1111111"));
    System.out.println(c("5115643141276343"));
    System.out.println(c("56789"));
    System.out.println(c("94"));
    System.out.println(c("1"));
  }
}

Я не могу получить доступ к компьютеру прямо сейчас, поэтому я не могу подтвердить, но вот два предложения: 1. Поместите инициализации в цикл for. 2. вместо манипуляции со строками используйте арифметику (используйте целочисленное деление для итерации по цифрам и по модулю для извлечения последних 2 или 3 цифр).
Утренняя монахиня

@LeakyNun Спасибо за предложения. Что касается вашего первого, причина, по которой инициализация целых чисел находится вне цикла for, заключается в том, что я должен вернуть результат ( r). Тем не менее, я смог сыграть в гольф 7 байтов, поместив все остальное внутри цикла, в одну тройку. Я посмотрю, смогу ли я сделать ваше второе предложение позже, возможно. Мой обеденный перерыв снова закончился, поэтому мне придется вернуться к работе. Буду иметь в виду.
Кевин Круйссен

5

JavaScript (ES6), 71 70 байт

f=([a,...b])=>a?(a&(a+=b[0])+b[1]<123|a>47&a<58|a>64&a<91|a>96)+f(b):0

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


4

Perl 5 , 47 байт

46 байтов кода + -pфлаг.

$"="|";$_=()=/(?=@{[48..57,65..90,97..122]})/g

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

Я не мог найти более короткий способ написать это 48..57,65..90,97..122: map{ord}0..9,a..z,A..Z(получение значения ascii символов) на один байт длиннее. И выполнение for$c(0..122){$\+=chr($c)=~/\pl|\d/ for/(?=$c)/g}}{(поиск всех чисел, но сохранение только тех, чьи числа соответствуют значению ascii letters ( \pl) или digits ( \d)) будет на 5 байт длиннее (обратите внимание, что \pl|\dего нельзя заменить, так \wкак последнее также включает подчеркивания)) ,


Предыдущий подход (49 байт):

for$@(48..57,65..90,97..122){$\+=()=/(?=$@)/g}}{


1

JavaScript (ES), 165 161 156 154 153 байта

Да, RegEx определенно не был подходящим инструментом для работы здесь!

n=>[/\d{2}/g,/\d{3}/g].map(e=>eval("while(x=e.exec(n)){a.push(m=x[0]);e.lastIndex-=m.length-1}"),a=[])|a.filter(x=>x>47&x<58|x>64&x<91|x>96&x<123).length

Попытайся

f=

n=>[/\d{2}/g,/\d{3}/g].map(e=>eval("while(x=e.exec(n)){a.push(m=x[0]);e.lastIndex-=m.length-1}"),a=[])|a.filter(x=>x>47&x<58|x>64&x<91|x>96&x<123).length

console.log(f(5698))//3
console.log(f(564693))//2
console.log(f(530923864209124521))//3
console.log(f(1111111))//5
console.log(f(5115643141276343))//4
console.log(f(56789))//4
console.log(f(94))//0
console.log(f(1))//0


Регулярное выражение не так уж плохо; Порт моего ответа Retina составил 78 байт.
Нил



1

Haskell, 161 157 138 129 126 байтов

import Data.List
f x=sum[1|y<-nub$concat$words.concat<$>mapM(\c->[[c],c:" "])x,any(elem$read y)[[48..57],[65..90],[97..122]]]

Интересно, есть ли лучший способ удалить дубликаты списка, чем импортировать Data.List для nub?


1
Если вы импортируете Data.Listsвместо Data.List, вы можете использовать: y<-tail$powerslice x.
Ними

@nimi Против правил игры в гольф, если мне приходится загружать и устанавливать нестандартные модули? Я не думаю, что Data.Lists является стандартным в GHC.
maple_shaft

Насколько я знаю, у нас все еще нет единого мнения о том, что считать стандартным модулем. Здесь есть несколько ответов на Haskell, которые используют Data.Lists. Это даже упоминается в советах по игре в гольф для Хаскелла - пока никто не жаловался.
Ними

@nimi Честно говоря, я думаю, что если я смогу просто загрузить любой пакет из cabal, я мог бы просто написать функцию, которая решает проблему, загрузить ее, а затем импортировать модуль в моё решение. Технически я мог бы обмануть. Но тогда определенные проблемы не могут быть решены с помощью базовых GHC, таких как криптография, так что я не знаю.
maple_shaft

1
Вернуться к гольф советы: or $ f <$> listэто any f list: any(elem$read y)[...].
Ними

0

Pyth, 19 17 14 байтов

l@jGUTmr0Csd.:

берет строку

-3 байта благодаря @LeakyNun

Попытайся!

объяснение

l@jGUTmr0Csd.:
    UT                # the list of digits [0,1,2,...,9]
  jG                  # join that on the lowercase alphabet (repetition doesn't matter)
              Q       # implicit input
            .:        # all substrings of the input
      m               # for each of those substrings
          sd          # Convert the string to a base 10 integer
         C            # convert that integer to the character with that number
       r0             # make that character lowercase
l@                    # length of the intersection of those two list of chars we generated

Вместо того, чтобы использовать idT, вы можете использовать sd.
Утренняя монахиня

Кроме того, l@jGUTmr0Csd.:может быть короче (не уверен, что это работает).
Утренняя монахиня

@LeakyNun Спасибо, это работает!
КарлКастор

0

Желе , 8 байт

ØBODf@ẆL

Ввод представляет собой массив цифр.

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

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

ØBODf@ẆL  Main link. Argument: A (digit array)

ØB        Base 62; yield all alphanumeric ASCII characters.
  O       Ordinal; get their code points.
   D      Decimal; convert the code points into digit arrays.
      Ẇ   Window; yield all contiguous subarrays of A.
    f@    Filter swapped; keep all elements of the result to the right that appear
          in the result to the left.
       L  Length; count the matches.

0

Рубин, 50 байтов

p (0..~/$/).any?{|n|$_[n,2].to_i.chr=~/\p{Alnum}/}

Читает со стандартного ввода; требует, чтобы интерпретатор Ruby вызывался с -nпараметром (неявный while getsцикл).

Может быть уменьшен до 43 байт, если ему разрешено совпадать с подчеркиванием.

p (0..~/$/).any?{|n|$_[n,2].to_i.chr=~/\w/}

Это не возвращает количество раз, когда символы появляются. Кроме того, он терпит неудачу 111, который должен вернуться, 1но вы возвращаете 0.
Value Ink

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