Как долго мой номер?


26

Вызов

Если задано целое число Qв диапазоне -(2^100) ≤ Q ≤ 2^100, выведите количество цифр в этом числе (в базе 10).

правила

Да, вы можете взять число в виде строки и найти его длину.

Все математические функции разрешены.

Вы можете принимать входные данные в любой базе, но выходные данные должны быть длиной числа в 10-й базе.

Не считайте знак минус для отрицательных чисел. Число никогда не будет иметь десятичной точки.

Ноль может иметь одну или ноль цифр.

Предположим, что ввод всегда будет действительным целым числом.

Примеры

Input > Output

-45 > 2
12548026 > 8
33107638153846291829 > 20
-20000 > 5
0 > 1 or 0

выигрыш

Самый короткий код в байтах побеждает.

Ответы:


10

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

l

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

Другое встроенное решение, но у этого есть самое короткое имя (если кто-то не найдет язык, который выполняет эту задачу в нулевых байтах). Это должно работать как в Brachylog 1, так и в Brachylog 2.

Это отправка функции (ссылка TIO содержит аргумент командной строки, который заставляет интерпретатор запускать отдельную функцию, а не целую программу), частично потому, что в противном случае нам пришлось бы тратить байты на вывод, частично потому, что синтаксис Brachylog для отрицательного числа несколько необычны, и превращение этой программы в функцию разрешает любые возможные аргументы о синтаксисе ввода.

Меня часто беспокоит, что большинство встроенных в Брахилог трактуют отрицательные числа как положительные, но этот факт в конечном итоге пригодился. Я думаю, что есть компромиссы, связанные с каждым языком игры в гольф.


Здесь я прекращаю прокручивать ... это возмутительно!
Богдан Александру

39

Такси , 1118 байт

1 is waiting at Starchild Numerology.Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to Chop Suey.Go to Chop Suey:n 1 r 1 l 4 r 1 l.Pickup a passenger going to Crime Lab.'-' is waiting at Writer's Depot.Go to Writer's Depot:n 1 l 3 l.Pickup a passenger going to Crime Lab.Go to Crime Lab:n 1 r 2 r 2 l.Switch to plan "n" if no one is waiting.-1 is waiting at Starchild Numerology.[n]0 is waiting at Starchild Numerology.Go to Starchild Numerology:s 1 r 1 l 1 l 2 l.Pickup a passenger going to Cyclone.Pickup a passenger going to Addition Alley.Go to Cyclone:e 1 l 2 r.[r]Pickup a passenger going to Cyclone.Pickup a passenger going to Addition Alley.Go to Zoom Zoom:n.Go to Addition Alley:w 1 l 1 r.Pickup a passenger going to Addition Alley.Go to Chop Suey:n 1 r 2 r.Switch to plan "f" if no one is waiting.Pickup a passenger going to Sunny Skies Park.Go to Sunny Skies Park:n 1 l 3 l 1 l.Go to Cyclone:n 1 l.Switch to plan "r".[f]Go to Addition Alley:n 1 l 2 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:n 1 r 1 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 l 1 r.

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

Ungolfed:

1 is waiting at Starchild Numerology.
Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to Chop Suey.
Go to Chop Suey: north 1st right 1st left 4th right 1st left.
Pickup a passenger going to Crime Lab.
'-' is waiting at Writer's Depot.
Go to Writer's Depot: north 1st left 3rd left.
Pickup a passenger going to Crime Lab.
Go to Crime Lab: north 1st right 2nd right 2nd left.
Switch to plan "n" if no one is waiting.
-1 is waiting at Starchild Numerology.
[n]
0 is waiting at Starchild Numerology.
Go to Starchild Numerology: south 1st right 1st left 1st left 2nd left.
Pickup a passenger going to Cyclone.
Pickup a passenger going to Addition Alley.
Go to Cyclone: east 1st left 2nd right.
[r]
Pickup a passenger going to Cyclone.
Pickup a passenger going to Addition Alley.
Go to Zoom Zoom: north.
Go to Addition Alley: west 1st left 1st right.
Pickup a passenger going to Addition Alley.
Go to Chop Suey: north 1st right 2nd right.
Switch to plan "f" if no one is waiting.
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park: north 1st left 3rd left 1st left.
Go to Cyclone: north 1st left.
Switch to plan "r".
[f]
Go to Addition Alley: north 1st left 2nd left.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: north 1st right 1st right.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st left 1st right.

Объяснение:

Pickup the input and split it into individual characters
Pickup the value 1.
If the first character a hyphen, add -1. Otherwise, add 0.
Keep picking up characters and adding 1 until you're out.
Convert the running total to a string and print to stdout.

8
Я давно скрываюсь в этом обмене, но никогда не видел ничего подобного
Кубок Явы

7
Это закончится газом, если число будет достаточно длинным?
Роберт Фрейзер

5
Это больший мозговой трах, чем мозговой.
Омега

1
@RobertFraser Вот почему мы остановились на Zoom Zoomкаждом цикле plan "r". Я только что проверил его до 100 000 цифр, и он никогда не заканчивался бензин. Я не рассчитал это, но я полагаю, что для того, чтобы заплатить за газ, который он использует, требуется более, чем достаточно, чтобы заполнить бак на каждом цикле.
Тост инженера

1
@CupofJava О Боже, как я забыл о Шекспире .
Тост инженера


14

дк, 3

?Zp

Обратите внимание, что обычно dcтребуется давать отрицательные числа _вместо более обычных -. Однако в этом случае может быть использован любой из них. Если -дано, то dcобрабатывает это как вычитание в пустом стеке, бросает dc: stack empty, а затем продолжает с остальной частью числа; Таким образом, результат не отличается.

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

?    # input
 Z   # measure length
  p  # print

Разве это не может быть просто передачей Zфункции? dcКонкатенационный язык с операторами quote + dup + eval, поэтому может повторно использовать произвольные строки кода.


5

05AB1E , 2 байта

Äg

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

Ä  # Absolute value
 g # Length

Äа? Нет þ? Справедливо.
Волшебная Урна Осьминога

@carusocomputing Сначала я подумал Ä, но þобработал бы десятичную точку, так что, думаю, немного лучше.
Райли

Просто круто, как 2 человека придумали 2 разных 2-байтовых решения в течение 2 минут друг от друга, хотя я не думаю, что есть третье; пытаясь думать об одном.
Волшебная Урна Осьминога

5

Алиса , 16 байт

//; 'q<)e
o!@i -

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

объяснение

Найти полуприличный макет для этого было довольно сложно. Я все еще не очень доволен этим из-за пробелов, <и ;, но это лучшее, что я мог сделать на данный момент.

Длина строки - одна из тех очень распространенных встроенных функций, которые не существуют в Алисе, потому что ее ввод является строкой, а вывод - целым числом (и все команды Алисы являются строго целыми числами для целых чисел или строками для строк). Мы можем измерить длину строки, записав ее на ленту в обычном режиме, а затем найдя ее конец в кардинальном режиме.

/      Reflect to SE. Switch to Ordinal. While in Ordinal mode, the IP will bounce
       diagonally up and down through the code.
!      Store an implicit empty string on the tape, does nothing.
;      Discard an implicit empty string, does nothing.
i      Read all input as a string.
'-     Push "-".
<      Set the horizontal component of the IP's direction to west, so we're bouncing
       back now.
-      Remove substring. This deletes the minus sign if it exists.
'i     Push "i".
;      Discard it again.
!      Store the input, minus a potential minus sign, on the tape.
/      Reflect to W. Switch to Cardinal. The IP immediately wraps to the
       last column.
e)     Search the tape to the right for a -1, which will be found at the end
       of the string we stored there.
<      Does nothing.
q      Push the tape head's position, which is equal to the string length.
'<sp>  Push " ".
;      Discard it again.
/      Reflect to NW. Switch to Ordinal. The IP immediately bounces off
       the top boundary to move SW instead.
o      Implicitly convert the string length to a string and print it.
       IP bounces off the bottom left corner, moves back NE.
/      Reflect to S. Switch to Cardinal.
!      Store an implicit 0 on the tape, irrelevant.
       The IP wraps back to the first line.
/      Reflect to NE. Switch to Ordinal. The IP immediately bounces off
       the top boundary to move SE instead.
@      Terminate the program.

Я также пытался позаботиться о знаке минус в режиме Cardinal с помощью H(абсолютного значения), но дополнительный переключатель режима всегда оказывался более дорогим в моих попытках.


4

PHP, 23 байта

<?=-~log10(abs($argn));

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

журнал базы 10 абсолютного значения плюс одно приведение к int

для нуля, поскольку вход log10 возвращает, INFчто интерпретируется как ложное

Лучше всего заменить $argnна $argn?:1+3 байта

PHP, 27 байт

<?=strlen($argn)-($argn<0);

длина строки минус логическое значение меньше нуля

+2 байта для сравнения строк $argn<"0"

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

PHP, 32 байта

<?=preg_match_all("#\d#",$argn);

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

Regex подсчитать все цифры

35 байт

<?=strlen($argn)-strspn($argn,"-");

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

длина строки минус количество -

strspn


1
Первый не работает, например 10, потому что ^имеет более низкий приоритет. Вы можете это исправить с помощью -~.
user63956

Почему не просто <?=strlen(abs($argn));?
roberto06

@ user63956 Версия с log10 не может работать в случае нулевого ввода, поэтому я ее удаляю.
Йорг Хюльсерманн

1
@ JörgHülsermann Почему бы не просто $argn?:1? Было бы 26 байтов с log10()и abs().
user63956

1
@ JörgHülsermann -~$xэквивалентен ((int)$x)+1. <?=-~log10(abs($argn?:1));похоже на работу.
user63956

4

Фортран 95 (гфортран), 121 96 95 байт

program c
character b
call get_command_argument(1,b,length=i)
print*,i-index(b,'-')
end program

Объяснение:
Вычитает индекс знака «-» из длины аргумента.
Массивы начинаются с 1 в Fortran, а index () возвращает 0, если символ не найден.

Редактировать: переключено на неявное целое число «i», также получатель объединенного аргумента.

Редактировать: -1 байт благодаря @Tsathoggua


1
Добро пожаловать в PPCG!
Мартин Эндер

3

PowerShell, 24 байта

"$args"-replace'-'|% Le*

преобразует «абсолютное» значение входных аргументов в строку и получает ее свойство length.

На 1 байт короче "".Length

пока кто-то не найдет лучший способ получить абс числа в PS, это, вероятно, так же коротко, как и получится.


Как насчет "$args".trim('-')|% Le*? :)
что бы ни было


3

мозговой трах , 37 байт

-[+>+[+<]>+]>->,[-<->]<[>+>],[<+>,]<.

Вывод байтового значения.

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

объяснение

-[+>+[+<]>+]>->  Constant for 45 (from esolangs wiki)
,                Read a byte of input
[-<->]           Subtract that byte from 45
<[>+>]           If the result is nonzero then increment a cell and move to the right
                 (0 means it was a minus; so not counted)
,[<+>,]          Read a byte and increment the cell to its left until EOF is reached
<.               Print the cell that was being incremented

Можно ли добавить нижний колонтитул в ссылку TIO, которая выводит результат в виде числа?
бета-распад

@BetaDecay Добавлено
Business Cat

Это замечательно, спасибо: D
Beta Decay

3

Рубин, 15 11 + 1 = 16 12 байт

Использует -nфлаг.

p~/$/-~/\d/

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

объяснение

                  # -n flag gets one line of input implicitly
p                 # Print
 ~/$/             # Position of end of line (aka string length) in input
     -            # minus
      ~/\d/       # Position of first digit (1 if negative number, 0 otherwise)

1
Что это за магия?
Чоулетт

2
@Chowlett добавил объяснение.
Value Ink

2

Желе , 2 байта

DL

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

Это делает буквально то, что спросили:

DL - Main link number n         e.g. -45
D  - convert to a decimal list       [-4,-5]
 L - get the length                  2

Это интересный встроенный там, Dработает на десятичных? Будет ли -1.2выход [-1,-0.2]? Пробовал сам, это не так.
Волшебная урна осьминога

1
Не совсем, базовая конверсия сводится только к единицам, что, например, 654.321Dдало бы [6,5,4.321](ну на самом деле [6.0,5.0,4.321000000000026])
Джонатан Аллан

[-6.0, -5.0, -4.321000000000026]собственно, видимо.
Волшебная урна осьминога

Ах - да, только что отредактировано - арифметика с плавающей точкой.
Джонатан Аллан




2

JavaScript (ES6), 27 26 25 24 байта

Принимает ввод в виде строки.

s=>s.match(/\d/g).length
  • Сохранено два байта благодаря Арно.

Ваш заголовок содержит 23 байта, но ваш код 24 ... Однако это 23 байта s=>`${s>0?s:-s}`.length:!
Дом Гастингс

Спасибо, @DomHastings. Вы должны опубликовать свой как отдельный ответ, так как это другой подход к моему.
Лохматый


2

Java, 30 24 байта

i->(""+i.abs()).length()

Предполагает iявляетсяBigInteger . Кроме того, тип является контекстуализированным, поэтому импорт не требуется, как показано в тестовом коде.

Тест

// No imports
class Pcg120897 {
  public static void main(String[] args) {
    java.util.function.ToIntFunction<java.math.BigInteger> f =
        // No full class declaration past here
        i->(""+i.abs()).length()
        // No full class declaration before here
      ;
    System.out.println(f.applyAsInt(new java.math.BigInteger("-1267650600228229401496703205376"))); // -(2^100)
    System.out.println(f.applyAsInt(new java.math.BigInteger("1267650600228229401496703205376"))); // (2^100)
  }
}

Сохраняет

  • 30 -> 24 байта: благодаря @cliffroot

+""вместо .toString()?
Cliffroot

2
+1 за предоставление примера кода, показывающего, как это вызывается, и за уточнение типа iответа. Я думаю, что больше лямбда-ответов должны сделать это.
Poke


1

Brain-Flak , 63 байта

([({})]((((()()()()())){}{})){}{})((){[()](<{}>)}{})([{}][]<>)

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

Это 62 байта кода и +1 байт для -aфлага.

Я попробовал два других подхода, но, к сожалению, оба они были длиннее:

([]<({}[((((()()()()())){}{})){}{}]<>)((){[()](<{}>)}{})>)({}[{}])

([]<>)<>({}<>)((((([][]())){}{})){}{}[{}])((){[()](<{}>)}{})([{}]{})

Это должен быть очень короткий ответ. На самом деле, если бы нам не нужно было поддерживать отрицательные числа, мы могли бы просто сделать:

([]<>)

Но мы должны сравнить первый вход с 45 (ASCII -) первым, что составляет большую часть байтов этого ответа.

Арифметическое решение может быть короче.


Я считаю 62 байта ..?
полностью человек

1
@totallyhuman см. мое редактирование.
DJMcMayhem

49 байтов:([{}]((((()()()()())){}{})){}{})({(<()>)}{}[]<>)
Нитродон




1

Алиса , 10 байт (не конкурирует)

 /d/
O@IHc

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

Это неконкурентное решение, потому что в то время, когда в этот вызов была отправлена ​​команда c была прослушена в официальном (и только: D) интерпретаторе. Мартин Эндер тем временем исправил это, так что теперь это работает.

объяснение

Указатель инструкций проходит через два зеркала ( /) несколько раз, поэтому за ним может быть немного трудно следовать. Я постараюсь объяснить это как можно более четко, используя основные направления (например, N вверх, SW вниз налево ...). Я назову /1самое левое зеркало и /2самое правое.

Command    Direction    Comment
               E        Execution starts from the upper-left corner going right
   /1        E → SE     Passing through the mirror changes direction and switches
                        to ordinal mode (string operations)
   I        SE → NE     Push the input string to the stack, then bounce against
                        the bottom of the code
   /2       NE → S      Back to cardinal mode (numeric operations)
   H           S        Pop n, push abs(n). Execution wraps from bottom to top
   /2        S → SE     Ordinal mode again
   c        SE → NW     Pop s, push each char of s separatedly. Bounce against
                        the bottom right corner
   /2       NW → W      Cardinal mode
   d           W        Push the depth of the stack (which is now equal to 
                        the number of characters in abs(input))
   /1     W → NW → SW   Pass through the mirror, then bounce agains the top
   O        SW → NE     Output the result, then bounce on the bottom left corner
   /1       NE → S      Last mirror, I promise
   @           S        Terminate execution

1

GNU Make , 78 байт

Императивный стиль:

$(eval T=$1)$(foreach D,$(shell seq 9),$(eval T=$(subst $D,? ,$T)))$(words $T)

Функциональный стиль, 113 байт:

$(eval 2?=$(shell seq 9))$(if $2,$(call $0,$(subst $(word 1,$2),? ,$1),$(wordlist 2,$(words $2),$2)),$(words $1))

Pure Make, 83 байта:

$(eval T=$1)$(foreach D,0 1 2 3 4 5 6 7 8 9,$(eval T=$(subst $D,? ,$T)))$(words $T)

1

C ++, 80 76 байт

#include<string>
int main(int,char**c){printf("%d",strlen(c[1])-(*c[1]<46));}

Выводит длину аргумента, минус 1, если первый символ минус, потому что boolгарантирует преобразование в 1if trueили 0iffalse

  • 4 байта благодаря @Squidy за указание на то, что я могу использовать <46вместо него =='-', и вместо массива вместо[]

Вы могли бы сбрить 4 байта, заменив c[1][0]=='-'с , *c[1]<46так как мы можем предположить , вход всегда будет действительным числом. (Если не разрешены префиксы, отличные от '-' ...)
Squidy

@Squidy О, вау, приятно найти! Я целую вечность ломал голову, пытаясь сократить это, и даже не придумал этого! Спасибо за предложение, и особенно за регистрацию в PCCG, чтобы сообщить мне!
Tas

1

TI-Basic (TI-84 Plus CE, OS 5.2+), 6 байтов

length(toString(abs(Ans

TI-Basic - это токенизированный язык; length(и toString(два байта каждый.

Ansиспользуется в качестве неявного ввода; значение последней (единственной) строки возвращается неявно.

Довольно просто, принимает абсолютное значение, чтобы избавиться от знака минус, преобразует в строку, возвращает длину строки.

6-байтовый математический подход, который не работает для 0:

1+log(abs(Ans

Какие калькуляторы есть toString(?
kamoroso94

@ kamoroso94 TI-84 Plus CE
pizzapants184

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