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


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тесту.
Емінья

Ã, що має багато сенсу зараз, коли я читаю, що це робить, лайно.
Чарівний восьминога Урна

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 Я придумав більш короткі способи зробити це, і те, і інше, через помилки.
Фаталізувати

Чи можете ви приєднатися до двох Tразом?
Leaky Nun

1
У чому причина цієї помилки?
Leaky Nun

1
@LeakyNun Наприклад, наприклад, ціле число 13, існує нескінченно багато списків і нескінченно багато цілих чисел, які містять 13, і не очевидно, в якому порядку ви повинні їх перелічити.
Фаталізувати

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 цифр).
Leaky Nun

@LeakyNun Дякуємо за пропозиції. Що стосується вашого першого, то причина ініціалізації цілих чисел знаходиться поза циклом for-тому, що я повинен повернути результат ( r). Однак мені вдалося пограти в 7 байтів, поклавши все інше всередину фор-петлі, в одну трійку. Я побачу, чи зможу пізніше зробити вашу другу пропозицію. Мій час обіду знову закінчився, тому мені доведеться повертатися на роботу. Буде це мати на увазі.
Kevin Cruijssen

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}}{(шукати всі числа, але зберігати лише ті, чиї числа відповідають значенню літер ( \pl) або цифр ( \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


Regexp не так вже й погано; Порт моєї відповіді на 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. Про це навіть згадується в підказок щодо гольфу щодо Haskell - ніхто до цього не скаржився.
німі

@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.
Leaky Nun

Також 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.
Значення чорнила

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.