Скільки треба писати?


35

Виписання чисел є одним із привітних програм програмування, часто це цифри 1-10.

Я хочу виписати багато номерів! Багато, багато чисел. Але скільки цифр треба написати?

Завдання

З урахуванням цілого введення, дайте число як вихід, яке дасть мені число цифр, яке було б у рядку, що містить усі цілі числа в діапазоні від 0 до вводу включно. Ідентифікатор заперечення ("-") вважається одним символом.

Приклад I / Os

Вхід: 8
Виписано: 0,1,2,3,4,5,6,7,8
Вихід: 9

Вхід: 101
виписано: 0,1,2,3 ...., 99,100,101
Вихід: 196

Вхід: 102
виписано: 0,1,2,3 ...., 100,101,102
вихід: 199

Вхід -10
Виписано: 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10
вихід: 22

Це . Виграє найменша кількість байтів!

Відповіді:




11

Рода , 23 байти

f x{[#([seq(0,x)]&"")]}

Спробуйте в Інтернеті!

Пояснили:

f x{[#([seq(0,x)]&"")]}
f x{                  } /* Defines function f with parameter x. */
        seq(0,x)        /* Creates a stream of numbers from 0 to x. */
       [        ]       /* Creates an array. */
                 &""    /* Joins with "". */
     #(             )   /* Calculates the length of the resulting string. */
    [                ]  /* Returns the value. */


7

Утиліти Bash + OS X (BSD), 24 22 байти

Завдяки @seshoumara за збереження 2-х байт.

seq 0 $1|fold -1|wc -l

Тестовий запуск на Mac OS X:

$ for n in 8 101 102 -10 -1 0 1; do printf %6d $n; ./digitcount $n; done
     8       9
   101     196
   102     199
   -10      22
    -1       3
     0       1
     1       2

Ось версія GNU:

Bash + coreutils, 40 38 байт

Знову 2 байти збережено завдяки @seshoumara.

(seq $1 0;seq 0 $1)|uniq|fold -1|wc -l

Спробуйте в Інтернеті!


@tuskiomi Я писав coreutils, коли мав на увазі утиліти BSD - я протестував це в Mac OS X, де він працює і на негативних входах (seq там не те ж, що і у GNU).
Мітчелл Спектор

@DigitalTrauma Приємне рішення GNU. Продовжуйте і розміщуйте його самостійно, якщо хочете; Я думаю, що це занадто інакше, щоб вважати мій варіант.
Мітчелл Спектор

Гаразд, ось ви :)
Digital Trauma

Як щодо використання fold -1|wc -lпідрахунку? Він коротший.
seshoumara

6

Python 2, 83 , 78 64 байт

найкоротша версія:

lambda x:sum(map(len,map(str,(range(0,x+cmp(x,.5),cmp(x,.5))))))

ця версія зберегла 5 байт, завдяки @numbermaniac:

x=input()
print len(''.join(map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))

Спробуйте в Інтернеті!

цей я придумав самостійно після цього (така ж кількість байтів):

x=input()
print sum(map(len,map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))

Спробуйте в Інтернеті!


Ви можете використовувати mapна другій лінії на 78 байт: print len(''.join(map(str,(range(x+1)if x>0 else range(0,x-1,-1))))). Ви могли б заощадити ще більше, роблячи це лямбда.
numbermaniac

1
@numbermaniac чи можу я зробити щось подібне таким чином?
micsthepick

1
@numbermaniac тут еквівалент:print sum(map(len,map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))
micsthepick

lambda x:sum(map(len,map(str,(range(x+1)if x>0 else range(0,x-1,-1)))))за 71 байт
Феліпе Нарді Батіста

6

Java 7, 74 байти (рекурсивний - включаючи другий параметр за замовчуванням)

int c(int r,int n){r+=(n+"").length();return n>0?c(r,n-1):n<0?c(r,n+1):r;}

Пояснення (1):

int c(int r, int n){     // Recursive method with two integer parameters and integer return-type
                         // Parameter `r` is the previous result of this recursive method (starting at 0)
  r += (n+"").length();  //  Append the result with the current number's width
  return n > 0 ?         //  If the input is positive
     c(r, n-1)           //   Continue recursive method with n-1
    : n < 0 ?            //  Else if the input is negative
     c(r, n+1)           //   Continue recursive method with n+1
    ?                    //  Else (input is zero)
     r;                  //   Return the result
}                        // End of method

Java 7, 81 79 байт (цикл - один параметр)

Якщо наявність другого параметра за замовчуванням 0для цього рекурсивного підходу з якоїсь причини не дозволено, замість цього може бути використаний цикл for:

int d(int n){String r="x";for(int i=n;i!=0;i+=n<0?1:-1)r+=i;return r.length();}

Пояснення (2)

int d(int n){                 // Method with integer parameter and integer return-type
  String r = "x";             //  Initial String (with length 1 so we won't have to +1 in the end)
  for(int i=n; i != 0;        //  Loop as long as the current number isn't 0
      i += n < 0 ? 1 : 1)     //   After every iteration of the loop: go to next number
    r += i;                   //   Append String with current number
                              //  End of loop (implicit / single-line body)
  return r.length();          //  Return the length of the String
}                             // End of method

Код тесту:

Спробуйте тут.

class M{
  static int c(int r,int n){r+=(n+"").length();return n>0?c(r,n-1):n<0?c(r,n+1):r;}

  static int d(int n){String r="x";for(int i=n;i!=0;i+=n<0?1:-1)r+=i;return r.length();}

  public static void main(String[] a){
    System.out.println(c(0, 8) + "\t" + d(8));
    System.out.println(c(0, 101) + "\t" + d(101));
    System.out.println(c(0, 102) + "\t" + d(102));
    System.out.println(c(0, -10) + "\t" + d(-10));
  }
}

Вихід:

9   9
196 196
199 199
22  22

1
Мені подобається це рішення, :)
tuskiomi


4

Брахілог , 5 байт

⟦ṡᵐcl

Спробуйте в Інтернеті!

Будує діапазон [0, вхід], перетворює кожне число в рядок, об'єднує в одну рядок і повертає довжину результату


Я помітив, що TIO має аргумент Z; що з цим? Чи повинно бути в рахунку?
Стінберг

3
@steenbergh: Подання Лео - це функція, а не повна програма. Надаючи аргумент Zінтерпретатору Brachylog, він каже йому додати відповідну обгортку, щоб зробити функцію перевіряемою. (Якщо ви запустили його як повну програму, вона не дасть жодного результату.) Тут ми допускаємо подання програми або функцій, так що не слід зараховувати кількість байтів, оскільки це насправді не є частиною подання.

4

PHP, 59 60 байт

Перевершив Roberto06 - https://codegolf.stackexchange.com/a/112536/38505

Завдяки roberto06 за те, що помітив, що попередня версія не спрацювала з негативними цифрами.

Просто будує масив чисел, додає його до рядка, а потім підраховує цифри (і знак мінус)

<?=preg_match_all("/\-|\d/",implode(",",range(0,$argv[1])));

Приклад запуску: php -f 112504.php 8


Це не працює на негативний вклад, дивіться тут
roberto06

Ви можете зберегти 3 байти, використовуючи joinзамість того, implodeщо це псевдонім.
Маріо

не потрібно уникати мінус -1 Байт. З іншого боку, ви можете змінити свій регулярний вираз на[--9]
Йорг Хюльсерманн

4

Haskell , 39 38 байт

f 0=1
f n=length$show=<<[0..n]++[n..0]

Спробуйте в Інтернеті! Редагувати: збережено 1 байт завдяки @xnor!

Пояснення:

У Haskell для чисел aі b [a..b]це діапазон від aдо b1-го кроку або 1-декрему, залежно від того b, більший a. Отже, для позитиву nперший список [0..n]++[n..0]є, [0,1,2,...,n]а другий - порожнім. Для мінусів nдругий діапазон виходить, [0,-1,-2,...,n]а перший - порожнім. Однак якщо n=0обидва діапазони дають список [0], то конкатенація [0,0]призведе до помилкового результату 2. Ось чому0 розглядається як окремий випадок.

Оператор =<<у списку такий самий, як concatMap, таким чином, кожне число перетворюється в рядок showі всі ці рядки об'єднуються в одну довгу рядок, з якої lengthнарешті повертається.


Перед порадою xnor я використовував [0,signum n..n]замість [0..n]++[n..0]. signum nє -1для негативних чисел, 0для нуля і 1для позитивних чисел і діапазон форми [a,b..c]створює список чисел від aдо cз кроком b. Тим самим [0,signum n..n]будується діапазон як [0,1,2,...,n]для позитивного, так nі [0,-1,-2,...,n]для негативного n. Оскільки n=0це створило б нескінченний список, [0,0,0,...]тому нам потрібно розглянути 0як особливий випадок.


Я думаю, що [0..n]++[n..0]слід робити [0,signum n..n].
xnor

4

PHP, 41 35 байт

Збережено 6 байт завдяки користувачу59178

Оскільки ʰᵈ відповідь неправильна для негативного вкладу, я взяв на себе рішення, щоб створити нове рішення:

<?=strlen(join(range(0,$argv[1])));

Ця функція:

  • Створює масив з 0до $argv[1](він же вхід)
  • Виводить його із порожнім символом (тобто перетворює його на рядок)
  • Перегукується довжина струни

Спробуйте тут!


Це приємніше рішення для мого, ідк, чому я подумав, що я повинен це зробити preg_match():(
ʰᵈˑ

Ну, я б не подумав, range()якби не ваше рішення, я думаю, ми навіть;)
roberto06

1
ви можете зберегти 3 байти, використовуючи join()замість implode(). це псевдонім для тієї ж речі. php.net/manual/en/function.join.php
користувач59178

1
І ще 3, опустивши параметр 'клею'.
користувач59178

Я знав, що існує псевдонім для implode, але не знав, що можу опустити параметр номеру. Спасибі !
roberto06


4

R, 26 20 байт

sum(nchar(0:scan()))

Дуже базовий підхід:

  • Складіть вектор 0: x

  • Підрахунок символів у кожному значенні (автоматично буде присвоєно рядку)

  • Сума

Не впевнені, чи є якісь хитрощі для скорочення визначення функції? 6 байтів збереглися завдяки Джузеппе, взявши натомість stdin.


ви можете зробити sum(nchar(0:scan()))замість цього і читати nзі stdin.
Джузеппе

4

Математика, 48 47 46 байт

-1 байт завдяки Мартіну Ендеру !

StringLength[""<>ToString/@Range[0,#,Sign@#]]&

Анонімна функція, приймаючи число як аргумент.

Коротше рішення Грега Мартіна , 39 байт

1-#~Min~0+Tr@IntegerLength@Range@Abs@#&

1
Ви можете використовувати Sign@#для #/Abs@#.
Мартін Ендер

1
Ви можете зберегти кілька байт з дещо іншим підходом: 1-#~Min~0+Tr@IntegerLength@Range@Abs@#&. Початкові 1обчислюють цифру 0, тоді як -#~Min~0рахунки для всіх негативних знаків, якщо вхід негативний.
Грег Мартін

3

Пакетна, 110 байт

@set/a"n=%1,t=n>>31,n*=t|1,t=1-t*n,i=0
@for /l %%i in (0,1,9)do @set/a"t+=(i-n)*(i-n>>31),i=i*10+9
@echo %t%

Обчислити sum(min(0,abs(n)+1-10^k),k=0..9)+(n<0?1-n:1). (Я повинен лише піднятися9 через обмеження цілочисельної арифметики Батча.)



3

MATL , 11 байт

0hSZ}&:VXzn

Спробуйте в Інтернеті!

0h           % Implicitly input n. Append a 0: gives array [n 0]
  S          % Sort
   Z}        % Split array: pushes 0, n or n, 0 according to the previous sorting
     &:      % Binary range: from 0 to n or from n to 0
       V     % Convert to string. Inserts spaces between numbers
        Xz   % Remove spaces
          n  % Length of string. Implicit display

3

PowerShell , 23 байти

-join(0.."$args")|% Le*

Спробуйте в Інтернеті!(буде барф на TIO для дуже великих (абсолютних) входів)

Використовує ..оператор діапазону для побудови діапазону від 0до входу $args(передається як рядок для перетворення з вхідного масиву). Це -joinоб'єднується в рядок (наприклад, 01234), а потім Leприймається ngth. Те, що залишилося на конвеєрі, і вихід неявний.


Точне рішення у мене було в голові, коли я читав це питання 😝
британіст


3

QBIC , 25 байт

:[0,a,sgn(a)|A=A+!b$]?_lA

Пояснення:

:[0,a     Read 'a' from the cmd line, start a FOR loop from 0 to 'a'
,sgn(a)|  with incrementer set to -1 for negative ranges and 1 for positive ones
A=A+!b$   Add a string cast of each iteration (var 'b') to A$
]         NEXT
?_lA      Print the length of A$

3

JavaScript, 50 байт

Співпраця з @ETHproductions

n=>{for(t="";n;n<0?n++:n--)t+=n;alert(++t.length)}


3

Сітківка , 28 байт

\d+
$*
1
$`1¶
1+
$.&
^-?
0
.

Спробуйте в Інтернеті!

Пояснення

\d+
$*

Перетворіть номер в одинаковий, не зберігаючи знак.

1
$`1¶

Кожен 1 замінюється на все, що залежить від себе, плюс новий рядок. Цим ми отримуємо діапазон від 1 до n, якщо n було позитивним, від -1 до n з додатковим -на початку, якщо воно було негативним. Усі числа є одинарними та розділені новими рядками.

1+
$.&

Перетворіть кожну послідовність одиниць у відповідне десяткове число.

^-?
0

Покладіть 0на початок, замінивши додатковий, -якщо він є.

.

Порахуйте кількість символів (не в новому рядку).


3

Emacs, 20 байт

C-x ( C-x C-k TAB C-x ) M-{input} C-x e C-x h M-=

Сама команда - 20 натискань клавіш, але мені потрібно уточнити, як це слід вважати байтами. Я мотивував, що підрахунок кожного натискання клавіші як 1 байт було б найбільш справедливим. Команда вище написана умовно для легшого читання.

Пояснення

C-x (

Почніть визначати макрос клавіатури.

C-x C-k TAB

Створіть новий лічильник макросів. Записує 0в буфер; значення лічильника зараз дорівнює 1.

C-x )

Визначення кінця макросу клавіатури

M-{input} C-x e

Після натискання на META введіть номер введення. C-x eПотім виконує макрос , який у багато разів.

C-x h

Встановіть позначку на початку буфера (який вибирає весь створений таким чином текст).

M-=

Запустити кількість символів для вибраного регіону. Кількість символів буде надруковано в мінібуфері.

Приклад

Вибачення за жахливий колір підкреслення. Це приклад використання цієї команди з введенням 100. Вихід знаходиться в мінібуфері в нижній частині екрана.

Example execution with input of 100


Так, я впевнений, що один натискання клавіші - це один байт.
NoOneIsHere

@NoOneIsHere У мене були дві думки щодо цього: 1) Чи може символ Ctrl + бути представлений як один байт? І 2) Я бачу тут багато відповідей, рахуючи символи Unicode як один байт, але їх немає, тому я подумав, що, можливо, у CodeGolf є своє визначення "байт"? Спасибі.
cheryllium

Я справді не знаю. Але ви можете запитати на Meta .
NoOneIsHere

3

Луа, 52 байти

t=0;for i=0,io.read()do t=t+#tostring(i)end;print(t)

Ітератується через цикл for з 0 - введення, перетворює ціле число iв рядок і додає довжину рядка вt друкуt



2

C #, 77 73 байт

-4 байти завдяки @Kevin Cruijssen

Функція лямбда:

(r)=>{var l="";for(int i=0,s=r<0?-1:1;i!=r+s;i+=s)l+=i;return l.Length;};

Безгольові та з тестовими кейсами:

class P
{
    delegate int numbers(int e);
    static void Main()
    {
        numbers n = (r) =>
        {
            var l = ""; 
            for (int i = 0, s = r < 0 ? -1 : 1; i != r + s; i += s)
                l += i; 
            return l.Length;
        };
        System.Console.WriteLine(n(8));
        System.Console.WriteLine(n(101));
        System.Console.WriteLine(n(102));
        System.Console.WriteLine(n(-10));
        System.Console.ReadKey();
    }
}

Ви можете змінити , whileщоб forзаощадити пару байтів: (r)=>{var l="";for(int i=0,s=r<0?-1:1;i!=r+s;i+=s)l+=i;return l.Length;};( 73 байта )
Kevin Cruijssen

@Kevin Cruijssen Ви праві, дякую.
Містер Scapegrace

Можливо, ви можете використовувати лічильник int і додати довжину всередині циклу, щоб зберегти кілька байт. Якщо ви компілюєте в a, Func<int, int>ви можете викликати такі функції, як r=>...збереження 2 байтів (можливо, це все одно можна зробити).
TheLethalCoder


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