Numaram ne kadar sürüyor?


26

Meydan okuma

Bir tam sayı verildiğinde Q, aralıktaki -(2^100) ≤ Q ≤ 2^100, bu sayıdaki hane sayısını (10 tabanındaki) çıkar.

kurallar

Evet, numarayı bir ip olarak alabilir ve uzunluğunu bulabilirsiniz.

Tüm matematiksel fonksiyonlara izin verilir.

Herhangi bir bazda giriş alabilirsiniz, ancak çıkış, baz 10'daki sayının uzunluğu olmalıdır.

Eksi işaretini negatif sayılar için saymayın. Sayının hiçbir zaman ondalık noktası olmaz.

Sıfır, bir veya sıfır basamağa sahip olabilir.

Girişin her zaman geçerli bir tam sayı olacağını varsayalım.

Örnekler

Input > Output

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

Kazanan

Bayt cinsinden en kısa kod kazanır.

Yanıtlar:


10

Brachylog , 1 bayt

l

Çevrimiçi deneyin!

Başka bir yerleşik çözüm, ancak bu en kısa ada sahip (birisi bu görevi sıfır baytta yapan bir dil bulamazsa). Bu hem Brachylog 1 hem de Brachylog 2'de çalışmalıdır.

Bu bir işlev bildirimidir (TIO bağlantısı, tercümanın bir programdan ziyade tek bir işlevi çalıştırmasına neden olan bir komut satırı argümanı içerir), kısmen aksi halde çıktı için bayt harcamamız gerekir, çünkü kısmen Brachylog'un negatif sözdizimi sayılar biraz olağandışıdır ve bu programı bir işlev haline getirme, giriş sözdizimi hakkındaki olası argümanları çözer.

Brachylog'un yerleşiklerinin çoğunun, pozitif olanlar gibi negatif sayıları ele alması beni sık sık rahatsız ediyordu, ancak bu gerçek burada işe yaramadı. Sanırım her golf diliyle ilgili bir takım travmalar var.


Kaydırmayı bıraktığım yer burası ... bu çok çirkin!
Bogdan Alexandru

39

Taksi , 1118 bayt

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.

Çevrimiçi deneyin!

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.

Açıklama:

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
Uzun zamandır bu takasta bir lurker oldum, ancak böyle bir şey görmedim
Java Kupası

7
Sayı yeterince uzunsa bu gaz biter mi?
Robert Fraser,

5
Bu beyin fırtınasından daha büyük bir beyin fırtınası.
Omega

1
@RobertFraser Bu yüzden Zoom Zoomher döngüde duruyoruz plan "r". Az önce 100.000 basamağa kadar test ettim ve hiç gaz tükendi. Hesaplamamıştım ama sanırım kullandığı gazın parasını ödemesi yeterliydi, bu yüzden tankı her döngüde dolduruyor.
Mühendis Tost

1
@CupofJava OH MY GOSH, Shakespeare'i nasıl unuttum .
Mühendis Tost


14

dc, 3

?Zp

Normalde daha normal dcolan _yerine negatif sayılar verilmesi gerektiğini unutmayın -. Bununla birlikte, bu durumda, her ikisi de kullanılabilir. Eğer -verilir, daha sonra dc, boş bir yığında bir çıkarma olarak davranır atar dc: stack emptyve daha sonra sayıda geri kalanı ile devam eder; Böylece sonuç farklı değil.

Çevrimiçi deneyin .

?    # input
 Z   # measure length
  p  # print

Bu sadece Zbir işlev sunumu olarak olamaz mı? dcAlıntı + dup + eval operatörleri ile birleştirici bir dildir, bu nedenle isteğe bağlı kod dizelerini yeniden kullanabilir.


5

05AB1E , 2 bayt

Äg

Çevrimiçi deneyin! veya Tüm Testleri Deneyin!

Ä  # Absolute value
 g # Length

Ä, ha? Değil þmi? Yeterince adil.
Magic Octopus Urn,

@carusocomputing Äİlk ben düşündüm , ancak þondalık bir nokta ele alır, bu yüzden biraz daha iyi sanırım.
Riley,

Sadece 2 kişinin birbirinden 2 dakika içinde 2 farklı 2 baytlık çözüm ürettiğini düşünün, üçüncü bir şey olduğunu sanmıyorum; birini düşünmeye çalışıyorum.
Magic Octopus Urn,

5

Alice , 16 bayt

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

Çevrimiçi deneyin!

açıklama

Bunun için yarı düzgün bir düzen bulmak oldukça zordu. Çünkü boşluk, hala onunla süper mutlu değilim <ve ;ancak bu şimdilik yapabileceği en iyisidir.

Dize uzunluğu, Alice'te bulunmayan çok yaygın yerleşiklerden biridir, çünkü girişi bir dizedir ve çıktısı bir tamsayıdır (ve tüm Alice komutları kesinlikle tamsayıya tamsayıdır veya dizelere dizeleridir). Dizenin uzunluğunu Ordinal modda kasete yazıp ardından Kardinal modda sonunu bularak ölçebiliriz.

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

Ben de H(mutlak değer) Kardinal modda eksi işaretine dikkat etmeyi denedim , ancak ek mod düğmesi denemelerimde her zaman daha pahalı oldu.


4

PHP, 23 Bayt

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

Çevrimiçi deneyin!

mutlak değerin üssünün 10 logu artı bir int a int

log10 girişini sıfır olduğu için sıfır INFolarak yanlış olarak yorumlanır

+3 Bayt $argnile değiştirmenin en iyi yolu$argn?:1

PHP, 27 Bayt

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

dize uzunluğu eksi boolean sıfır sonra

Dizi karşılaştırması için +2 Bayt $argn<"0"

Çevrimiçi deneyin!

PHP, 32 Bayt

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

Çevrimiçi deneyin!

Regex tüm rakamları say

35 Bayt

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

Çevrimiçi deneyin!

dize uzunluğu eksi sayısı -

strspn


1
İlki çalışmaz, örneğin 10, çünkü ^daha düşük önceliğe sahiptir. İle düzeltebilirsin -~.
user63956

Neden basitçe değil <?=strlen(abs($argn));?
roberto06

@ user63956 log10'lu sürüm sıfır giriş durumunda çalışamaz, bu yüzden sildim.
Jörg Hülsermann

1
@ JörgHülsermann Neden sadece değil $argn?:1? O ile 26 byte olacaktır log10()ve abs().
user63956

1
@ JörgHülsermann -~$xeşittir ((int)$x)+1. <?=-~log10(abs($argn?:1));iş gibi görünüyor.
user63956

4

Fortran 95 (gfortran), 121 96 95 bayt

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

Açıklama:
'-' işaretinin dizinini argüman uzunluğundan çıkarır.
Diziler Fortran'da 1'den başlar ve sembol bulunmazsa index () 0 değerini döndürür.

Düzenleme: "i" tamsayılığına, ayrıca argüman alıcısına geçildi.

Düzenleme: @Tsathoggua sayesinde -1 bayt


1
PPCG'ye Hoşgeldiniz!
Martin Ender

3

PowerShell, 24 Bayt

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

girişin "mutlak" değerini bir dizgiye kopyalar ve 'uzunluk' özelliğini alır.

1 bayt daha kısa "".Length

Birisi PS'de bir sayının abs'ünü almak için daha iyi bir yol bulana kadar bu muhtemelen alacağı kadar kısa.


Ne dersiniz "$args".trim('-')|% Le*? :)
ne olursa olsun


3

brainfuck , 37 bayt

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

Çıktı bayt değerine göredir.

Çevrimiçi deneyin!

açıklama

-[+>+[+<]>+]>->  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

Sonucu sayı olarak veren TIO bağlantısına altbilgi eklemek mümkün müdür?
Beta,

@BetaDecay Eklendi
Business Cat

Bu harika, teşekkürler: D
Beta Decay

3

Ruby, 15 11 + 1 = 16 12 bayt

-nBayrağı kullanır .

p~/$/-~/\d/

Çevrimiçi deneyin!

açıklama

                  # -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
Bu ne büyüsü?
Chowlett

2
@Chowlett bir açıklama ekledi.
Değerli Mürekkep

2

Jöle , 2 bayt

DL

Çevrimiçi deneyin!

Bu kelimenin tam anlamıyla ne istendiğini yapar:

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

Bu ilginç bir yerleşik var, Donluklarla mı çalışıyor? Would -1.2çıktı [-1,-0.2]? Kendim denedim, değil.
Magic Octopus Urn,

1
Tam olarak değil, temel dönüşüm yalnızca birimlere gider, örneğin, örneğin (aslında ) 654.321Dverim elde eder[6,5,4.321][6.0,5.0,4.321000000000026]
Jonathan Allan,

[-6.0, -5.0, -4.321000000000026], aslında, görünüşe göre.
Magic Octopus Urn,

Ah - evet, sadece düzenlendi - kayan nokta aritmetiği.
Jonathan Allan,


2

Japt , 5 bayt

a s l

Çevrimiçi deneyin!

açıklama

 a s l
Ua s l
Ua     # take the absolute value of the input
   s   # and turn it into a string
     l # and return its length


2

JavaScript (ES6), 27 26 25 24 bayt

Bir dize olarak girdi alır.

s=>s.match(/\d/g).length
  • Arnauld sayesinde iki bayt kurtarıldı.

Unvanınız 23 bayt diyor, ama kod 24 olduğunu ... Ancak, bu 23 bayt: s=>`${s>0?s:-s}`.length!
Dom Hastings

@DomHastings, teşekkürler. Sizinkine ayrı bir cevap olarak göndermelisiniz, çünkü benim için farklı bir yaklaşım.
Shaggy


2

Java, 30 24 bayt

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

Varsayım ibir BigInteger. Ayrıca, tür bağlamsallaştırılmıştır, bu nedenle test kodunda gösterildiği gibi ithalat gerekmez.

Ölçek

// 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)
  }
}

kaydeder

  • 30 -> 24 bayt: @cliffroot sayesinde

+""yerine .toString()?
cliffroot

2
Bunun nasıl çağrıldığını gösteren örnek kod sağlamak ve icevabınızın türünü açıklamak için +1 . Bence daha fazla lambda cevabı bunu yapmalı.
Poke


1

Brain-Flak , 63 bayt

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

Çevrimiçi deneyin!

Bu, -abayrak için 62 bayt kod ve +1 bayttır .

Diğer iki yaklaşımı denedim ama ne yazık ki ikisi de daha uzundu:

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

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

Bu çok kısa bir cevap olmalı . Aslında, negatif sayıları desteklemek zorunda kalmazsak, şunları yapabiliriz:

([]<>)

Fakat ilk girişi ilk önce 45 (ASCII -) ile karşılaştırmalıyız , bu da bu cevabın bayt sayısının çoğudur.

Bir aritmetik çözüm daha kısa olabilir.


62 bayt sayıyorum ..?
tamamen insanlık

1
@totallyhuman düzenlememe bakın.
DJMcMayhem

49 bayt:([{}]((((()()()()())){}{})){}{})({(<()>)}{}[]<>)
Nitrodon




1

Alice , 10 bayt (yarışmaz)

 /d/
O@IHc

Çevrimiçi deneyin!

Bu rekabet edici bir çözüm değil, çünkü bu zorluğun yayınlandığı tarihte emir c(ve sadece: D) tercümanına komut verildi. Martin Ender bu arada onu düzeltti, bu yüzden şimdi çalışıyor.

açıklama

Talimat göstericisi iki aynadan ( /) defalarca geçer, bu yüzden takip etmesi biraz zor olabilir. Kardinal yönleri kullanarak (mesela N yukarı, SW sola doğru ...) mümkün olduğunca açık bir şekilde anlatmaya çalışacağım. /1En soldaki ayna ve en soldaki ayna diyeceğim /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 bayt

Zorunlu stil:

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

İşlevsel stil, 113 bayt:

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

Pure Make, 83 bayt:

$(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 bayt

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

Tartışmanın uzunluğu yazdırır, minuses 1 İlk karakter eksi çünkü eğer boolgaranti dönüşüm için 1ise trueya da 0, eğerfalse

  • @Squidy <46yerine kullanabildiğim için işaretleme yerine 4 bayt =='-', yerine diziyi göz ardı etme[]

Sen değiştirerek 4 bayt traş olabilir c[1][0]=='-'ile *c[1]<46her zaman geçerli bir tamsayı olacaktır girişi varsayabiliriz çünkü. ('-' dışındaki öneklere izin verilmezse ...)
Squidy

@Squidy oh vay güzel bulmak! Bunu kısaltmaya çalışırken beynimi kırdım ve daha önce hiç gelmedim! Öneriniz için ve özellikle PCCG'ye kayıt olduğunuz için bana bildirdiğiniz için teşekkür ederiz!
Tas

1

TI-Basic (TI-84 Plus CE, İşletim Sistemi 5.2+), 6 bayt

length(toString(abs(Ans

TI-Basic belirtilmiş bir dildir; length(ve toString(her biri iki bayttır.

Anskapalı girdi olarak kullanılır; son (sadece) satırın değeri örtük olarak döndürülür.

Oldukça basit, bir eksi işaretinden kurtulmak için mutlak değeri alır, dizeye dönüştürülür, dizenin uzunluğunu döndürür.

0 ile çalışmayan 6 baytlık bir matematiksel yaklaşım:

1+log(abs(Ans

Hangi hesap makineleri var toString(?
kamoroso94

@ kamoroso94 TI-84 Plus CE
pizzapants184

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.