Як довго мій номер?


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

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

Ще одне вбудоване рішення, але це найкоротша назва (якщо хтось не знайде мову, яка виконує це завдання в нульових байтах). Це має працювати і в Брахілог 1, і в Брахілог 2.

Це подання функції (посилання TIO містить аргумент командного рядка, який змушує інтерпретатора запускати окрему функцію, а не всю програму), частково тому, що в іншому випадку нам доведеться витрачати байти на вихід, частково через синтаксис Брахілога для негативного цифри є дещо незвичним, і завдяки цій програмі функція вирішує будь-які потенційні аргументи щодо синтаксису введення.

Мене часто турбує, що більшість побудованих брахілог відноситься до негативних чисел як до позитивних, але цей факт тут корисний. Я думаю, що з будь-якою мовою з гольфу є компроміси.


Тут я перестаю прокручувати ... це обурливо!
Богдан Олександру

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.

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

Безголівки:

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це конкатенативна мова з операторами quo + dup + eval, тому вона може повторно використовувати довільні рядки коду.


5

05AB1E , 2 байти

Äg

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

Ä  # Absolute value
 g # Length

Ä, так? Ні þ? Досить справедливо.
Чарівна восьминога урна

@carusocomputing Я подумав Äспочатку, але обробляв þби десяткову точку, тому я думаю, що трохи краще.
Райлі

Просто здорово, як двоє людей придумали 2 різних 2-байтних рішення протягом 2 хвилин один від одного, я не думаю, що є й третій; намагаючись думати про одне.
Чарівна восьминога урна

5

Аліса , 16 байт

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

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

Пояснення

Пошук напівпристойного плану для цього був досить складним. Я все ще не надто задоволений цим через простори, <і; , але це найкраще, що я міг зробити зараз.

Довжина рядка - одна з тих дуже поширених вбудованих програм, яка не існує в Alice, оскільки її вхід є рядком, а вихід - цілим числом (а всі команди Alice - це цілі числа до цілих чи рядків до рядків). Ми можемо виміряти довжину струни, записавши її на стрічку в ординарному режимі, а потім знайти її кінець у режимі Кардинала.

/      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.

Я також намагався піклуватися про знак мінус у режимі Кардинала з H(абсолютне значення), але перемикач додаткового режиму завжди виявлявся дорожчим у моїх спробах.


4

PHP, 23 байти

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

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

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

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

Кращий спосіб - замінити $argnна$argn?:1 +3 Bytes

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

Fortran 95 (gfortran), 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
бета-розпад

3

Ruby, 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
Що це за магія?
Chowlett

2
@Chowlett додав пояснення.
Значення чорнила

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()?
Скеля

2
+1 для надання зразкового коду, який показує, як це викликано, та для уточнення типу iвашої відповіді. Я думаю, що більше лямбда відповідей повинні зробити це.
Пукайте


1

Мозок-Флак , 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 , 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))

Чистий макіяж, 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гарантує перетворення в, 1якщо trueабо 0якщоfalse

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

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

@Squidy ох ух приємна знахідка! Я ламав мозок століттями, намагаючись скоротити це, і навіть ніколи цього не придумав! Дякуємо за пропозицію, а особливо за реєстрацію в PCCG, щоб повідомити мені!
Тас

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.