Önde gelen sıfır mücadelesi


31

Meydan okuma

Giriş ( xve y) olarak iki tamsayı verildiğinde , işareti olmayan karakterlerin uzun xolması için gereken çok sayıda sıfır bulunan bir dize olarak verilir y.

kurallar

  • Rakamdan xdaha büyükse y, xdeğişiklik yapmadan dizge olarak çıktı alın .

  • Önde gelen sıfır olmasa bile tamsayı olarak çıkış kabul edilmez.

  • xNegatif olduğunda , olduğu -gibi devam edin ve mutlak değer üzerinde çalışın.

  • Negatif y, 0 olarak değerlendirilmelidir, yani çıktı xolarak (ancak dize olarak) çıktı alın

Örnekler:

IN: (1,1)   OUT: "1"
IN: (1,2)   OUT: "01"
IN: (10,1)  OUT: "10"
IN: (-7,3)  OUT: "-007"
IN: (-1,1)  OUT: "-1"
IN: (10,-1) OUT: "10"
IN: (0,0)   OUT: "0"
IN: (0,1)   OUT: "0"
IN: (0,4)   OUT: "0000"

Bayt cinsinden en kısa kod kazanır, standart boşluklar uygulanır.



1
X'i string olarak alabilir miyim?
LiefdeWen

ne (-1,1)veriyor
Adam

@ Adám bunu örneklere ekledi.
Brian H.

1
+Pozitif sayılar için lider işareti kabul edilebilir mi?
Tom Carpenter,

Yanıtlar:


4

Japt , 13 8 bayt

İlk girdiyi ( x) bir dizge olarak alır.

®©ùTV}'-

Dene

ETHproductions sayesinde büyük bir 5 bayt kaydedildi.


açıklama

Dizge U=xve tamsayının örtük girişi V=y.

® }'-Ueksi sembolündeki bir diziye böler , üstünden eşler ve eksi sembollü bir dizgeye yeniden bağlanır.

©mantıksal AND ( &&) olduğundan, eğer geçerli eleman truthy ise (boş olmayan bir dize), sonra ù0 ( T) uzunluğunda sola ( ) bastırın V.


Güzel bir! Etrafında sadece haritalama yaparak biraz tasarruf edebilirsiniz -: ethproductions.github.io/japt/…
ETHproductions 19

@ETHproductions: Harika bir çağrı. Teşekkürler. Bunu yaptığımdan beri çok uzun zaman geçti, tamamen tek bir yöntemle bir ipi böldüğünüzü, haritalandırabileceğinizi ve yeniden birleştirebileceğinizi unutmuşum!
Shaggy

Evet, fonksiyonelliğin taşınması gerektiğini düşünüyorum q, o zaman q-_©ùTV1 byte :-) tasarruf sağlayacaktı.
ETHproductions

@ETProductions, eğer bu hakkı anlıyorsam, eğer bir fonksiyonun S.q()(bize vererek S.q(s,f)) ikinci bir argüman olarak geçilmesi Sdurumunda ayrılmasının s, çalıştırılmasının fve yeniden birleştirilmesinin önerisidir s? Bunu sevdim! :)
Shaggy

(Bir işlev geçtiyseniz, işlevi aracılığıyla çalıştırmak normal işlevleri yapmak ve ilk değişikliği geri Evet, Oliver ile konuşmak değil, bunu yapmayı mı N.s, S/A.y, N.ìyöntemlerin bir grup ile zaten bunu)? Biriyle
konuştum,



6

05AB1E , 11 10 bayt

Olarak verilen giriş amount_of_digits, number

ÎIÄg-×ì'-†

Çevrimiçi deneyin!

açıklama

Î            # push 0 and first input
 IÄ          # push the absolute value of the second input
   g         # length
    -        # subtract, (input1-len(abs(input2))
     ×       # repeat the zero that many times
      ì      # prepend to the second input
       '-†   # move any "-" to the front

Görünüşe göre bu şimdiye kadar kazanan cevap, yarın iyileşmezse, kabul edeceğim.
Brian H.

çok yoruldun :(
Brian H.

@BrianH. Aslında ben var :)
Emigna




5

JavaScript (ES6), 42

Özyinelemeli, parametreler ters sırada, önce y sonra x. Ve Currying

y=>r=x=>x<0?'-'+r(-x):`${x}`.padStart(y,0)

Ölçek

var F=
y=>r=x=>x<0?'-'+r(-x):`${x}`.padStart(y,0)

;`IN: (1,1)   OUT: "1"
IN: (1,2)   OUT: "01"
IN: (10,1)  OUT: "10"
IN: (-7,3)  OUT: "-007"
IN: (-1,1)  OUT: "-1"
IN: (10,-1) OUT: "10"
IN: (0,0)   OUT: "0"
IN: (0,1)   OUT: "0"
IN: (0,4)   OUT: "0000"`
.split(`\n`).map(r => r.match(/[-\d]+/g))
.forEach(([x,y,k])=>{
  o = F(y)(x)
  ok = o == k
  console.log(ok?'OK':'KO',x,y,'->', o)
})


Etkileyici olsa da, bu cevabın f(y)(x)yerine işlevi tanımlayarak kuralları hafifçe etkilediğini hissediyorum f(x,y).
styletron

“Köriler” kurallarını okuduğumda, itirazımın körelme ile değil tersine çevrilmiş paramlarla daha fazla olduğunu eklemek istedim.
styletron

1
@styletron parametrelerin sırası mücadelede belirtilmemiştir. Böylece bundan yararlanabilirsiniz
edc65

Dang, y=>r=x=>x<0?'-'+r(-x):(x+='')[y-1]?x:r(0+x)çok yakın geliyor ...
ETHproductions

Giriş sırasını tersine çeviren insanlarla hiçbir sorunum yok.
Brian H.



5

Kabuğu , 12 bayt

Ö±Ωo≥⁰#±:'0s

Çevrimiçi deneyin!

açıklama

Ö±Ωo≥⁰#±:'0s  Inputs are y=4 and x=-20
           s  Convert x to string: "-20"
        :'0   Prepend '0'
  Ω           until
      #±      the number of digits
   o≥⁰        is at least y: "00-20"
Ö±            Sort by is-digit: "-0020"
              Print implicitly.

5

R, 56 48 bayt

function(x,y)sprintf(paste0("%0",y+(x<0),"d"),x)

Çevrimiçi deneyin!

-8 bayt sayesinde Djhurio

açıklama

  • sprintf("%0zd",x) döner xuzunluğu sıfır olan yastıklı dize olarakz
  • paste0("%0",y+(x<0),"d")dize oluşturur "%0zd", nerede zolduğunuy takdirde, artı 1 xden az sıfırdır
  • Basamaktaki zsayı sayısından azsa x, xolduğu gibi bir dize olarak yazdırılır.

48 baytfunction(x,y)sprintf(paste0("%0",y+(x<0),"d"),x)
djhurio

@djhurio brilliant! Bunun bir düzenlemeden çok başka bir cevap vereceğini düşünüyorum, ne dersiniz?
duckmayr

Bir düzenleme olarak yapabilirsiniz. Bu çözüm çok farklı değil, sadece farklı işlevler kullanıyor.
djhurio

4

Alice , 23 bayt

/oRe./'+Ao
\I*tI&0-R$@/

Çevrimiçi deneyin!

Girdi, ilk satırdaki numara ve ikinci genişlik ile satır beslemeli olarak ayrılmalıdır.

açıklama

/...
\...@/

Bu, Sıralı moddaki doğrusal programlar için normal çerçevedir. Bu durumda sadece yakalamak bu bit:

.../...
...&...

Bu, IP’nin Kardinal moda dikey olarak girmesine ve sadece & Ordinal moda devam etmeden önce Kardinal modunda .

Daha sonra zikzak kontrol akışının açılması:

IRt.&'-A$o*eI/&/0+Ro@

I    Read the first line of input (the value) as a string.
R    Reverse the string.
t.   Split off the last character and duplicate it.
&    Fold the next command over this string. This doesn't really do anything,
     because the string contains only one character (so folding the next
     command is identical to executing it normally).
'-   Push "-".
A    Set intersection. Gives "-" for negative inputs and "" otherwise.
$o   If it's "-", print it, otherwise it must have been a digit which we
     leave on the stack.
*    Join the digit back onto the number. If the number was negative, this
     joins the (absolute value of the) number to an implicit empty string,
     doing nothing.
e    Push an empty string.
I    Read the width W.
/&/  Iterate the next command W times.
0    Append a zero. So we get a string of W zeros on top of the absolute
     value of the input number.
+    Superimpose. This takes the character-wise maximum of both strings
     and appends extraneous characters from the longer string. Since the
     string of zeros can never be larger than the digits in the input,
     the input itself will be uneffected, but extraneous zeros are appended,
     padding the string to the required length.
R    Reverse the result.
o    Print it.
@    Terminate the program.

İşte bunlardan kurtulmak için Kardinal H( abs ) kullanan 23 baytta da iki alternatif -:

/R.I&0-RoH
\Ie#\'+Ao\@/

/R.H#/.+Xo
\Ie\I&0QRo@/

Prensip olarak, bunlar daha kısa bir komuttur, ancak &yığında 1 karakterli bir dize bulunan bir konuma sığmaz, bu yüzden a ile atlamamız gerekir #.



4

Kömür , 16 13 bayt

‹N⁰﹪⁺⁺%0ηd↔Iθ

Çevrimiçi deneyin!

Bu, lider veya izleyen beyaz alanları yazdırmadan Kömürü kullanabildiğim en kısa şey. En azından şimdi Modulodizeleri biçimlendirmek için işlevin nasıl kullanılacağını anlamaya başladım .

Belirlenen kod aşağıdaki gibidir:

Print(Less(InputNumber(),0));    # Prints a - if the first input is less than 0
Print(Modulo(Add(Add("%0",h),"d"),Abs(Cast(q))));   # q: first input;  h: second input
  • Neil sayesinde 3 bayt kurtarıldı!

1
-Charcoal'da yazdırmak ya da hiçbir şey gerçekten kolay değildir: -0 yazdırırken yazdırırken hiçbir şey yazdırılmaz. Yani, üçlü gereksizdir, 3 bayt kurtarır.
Neil,

Eğer takas Eğer InputNumber()ile Cast(q), seni sonra başka byte kaydetmek için bir dize karşılaştırma geçebilirsiniz düşünüyorum.
Neil,

@Neil Basitleştirebileceğimi biliyordum Ternary!
Charlie,


4

PHP, 45 bayt

printf("%0".($argv[2]+(0>$n=$argv[1])).d,$n);

veya

[,$n,$e]=$argv;printf("%0".($e+(0>$n)).d,$n);       # requires PHP 7.1 or later

Çevrimiçi olarak koşun -nrveya deneyin .


Bu linkteki kodu çalıştırırken hata alıyorum.
Shaggy

@Shaggy İkinci sürüm PHP 7.1 gerektirir
Titus

Bu konuda gittim ve gittim ve tam olarak bu cevaba geldim. Bunun en iyi versiyon olduğuna inanıyorum
Ismael Miguel

3

Mathematica, 118 bayt

(j=ToString;If[#2<=0,j@#,If[(z=IntegerLength@#)>=#2,t=z,t=#2];s=j/@PadLeft[IntegerDigits@#,t];If[#>=0,""<>s,"-"<>s]])&


Çevrimiçi deneyin!


3

Mathematica, 63 62 bayt

If[#<0,"-",""]<>IntegerString[#,10,Max[#2,IntegerLength@#,1]]&

Çevrimiçi deneyin!


2
PPCG'ye Hoşgeldiniz! Bence bu istediğini yapmıyor. Muhtemelen IntegerLengthyerine demek istedin IntegerDigits. Yine de IntegerLength@#yerine bir bayt kaydedebilirsiniz IntegerLength[#].
Martin Ender

Teşekkür ederim! Kodu, test ettiğim el ile başka bir bilgisayardan kopyalıyordum ve IntegerLength için IntegerDigits'i yanlış yazdım. Şimdi çalışması gerekiyor. Ayrıca, test açıklamasında (+1) beklendiği gibi çalıştığını gösteren tüm test senaryolarına bir TIO bağlantısı ekledim. Fazladan bir bayt kaydetme öneriniz için de teşekkür ederiz! Daha önce nasıl kaçırdığımı bilmiyorum. :)
MatjazGo

2

Excel, 29 bayt

Excel'in TEXTişlevselliğini kullanma ("Bir değeri belirli bir sayı biçiminde metne dönüştürür").

xA1'de, yB1'de

=TEXT(A1,REPT("0",MAX(1,B1)))

)))For-Bytes'ı Google Sayfalarına dönüştürerek bırakabilirsiniz
Taylor Scott




2

Japt , 14 12 bayt

@ETHproductions sayesinde 2 bayt kaydedildi

s r"%d+"_ù0V

Çevrimiçi deneyin


Eksi oturumunu açık tutmak ve rakamları karıştırmak biraz daha ucuz: Çevrimiçi test edin
ETHproductions

@ETHproductions: Veya 10 baytlıkx bir dize olarak alın .
Shaggy

@ETHproductions teşekkürler arkadaşlar. Masama döndüğümde güncelleyeceğim.
Oliver,

@Shaggy Kendi cevabını göndermişsin gibi görünüyor, bu yüzden ETHproduction'nın numarasını kullanacağım. Yine de teşekkürler.
Oliver,

Oliver, bu 10 bayt sadece @ ETHproduction'ın 12 baytlık bir çözümü olan Japt 2.0a0'a yükseltildi Uve ilk 2 karakteri atmamıza izin veren bir ipti .
Shaggy,

2

PowerShell , 25 40 bayt

param($a,$b)$a|% *g $("D$b"*($b|% *o 0))

Çevrimiçi deneyin!

açıklama

Bu .ToString(), oluşturulan bir format dizgisine sahip numarayı çağırır , ancak $b( y) 'nın sırasıyla negatif, 0 veya pozitif olmasına bağlı olarak -1, 0 veya 1 ile çarpar ; bu olumsuz işlemeky dizgelerin kendi başlarına yapmadığı değerleri almaktır.

Bu (), değişmezleri kullanırken sadece çağrıların bir tuhaflığı olan çalışması için negatif sayıları bir tasfiyeye sarmayı gerektiriyor gibi görünüyor ; integer türündeki değişkenleri geçerse buna gerek kalmaz.


yNegatif olduğunda her ikisi de başarısız gibi görünüyor .
Shaggy

@Shaggy ugh iyi yakala. İkinci çözüm tamamen kaldırıldı ve ilk düzeltildi, teşekkürler!
briantist

Ah, 15 bayt! Üzgünüm!
Shaggy

@Shaggy heh, bugünlerden birinde aslında düşündüğüm PowerShell tabanlı golf dilini yazacağım. Bu aslında beni biraz daha araştırmaya ve başlatmaya daha da yaklaşmaya itti, bu yüzden teşekkürler;)
briantist

2

C # 6.0, 35 bayt

(x,y)=>(x.ToString($"D{y<0?0:y}"));

Alternatif çözüm (51 bayt)

(x,y)=>(x.ToString(string.Format("D{0}",y<0?0:y)));


1

C (gcc) , 45 bayt

f(x,y){printf("%s%0*i","-"+(x>=0),y,abs(x));}

Çevrimiçi deneyin!

açıklama

printf üç argümanı formatlar:

%s      ->    "-"+(x>=0)
%0*i    ->    y
        ->    abs(x)

%sdizeyi biçimlendirir "-"+(x>=0). "-"Gerçekten sadece bir adres, bir şey gibi 41961441. Hafızada, bu gibi bir şey görünüyor:

MEMORY ADDRESS | 41961441  41961442 ...
VALUE          | 45 ('-')  0 (0x00) ...

Bir dizeye biçimlendirildiğinde, C adresi alır (örneğin 41961441) ve boş bir bayt (0x00) karşılanıncaya kadar karakterleri almaya devam eder. X sıfırdan küçük olduğunda, değer "-"+(x>=0)orijinal adresin değerine sahiptir (41961441). Aksi takdirde, x>=01 olur "-"+1, bu nedenle ifade , sonra gelen boş baytı işaret eden olur"-" hiçbir şey yazdırmayan olur.

%0*ibelirtilen sayıda 0s ile dolgulu bir tamsayı yazdırır . ybu numarayı gösterir. Biz ped abs(x)bazı argümanlar içinde negatifi önlemek için.



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.