先行ゼロの課題


31

チャレンジ

入力(xおよびy)として2つの整数が与えられた場合、符号なしの文字長でxあるために必要な先行ゼロを含む文字列として出力されますy

ルール

  • 場合xよりも多く持っているy桁数、出力x変更せずに文字列としてを。

  • 先行ゼロがない場合でも、整数としての出力は受け入れられません。

  • xが負の場合、そのままに-して絶対値で操作します。

  • yは0として扱う必要があります。つまりx、そのまま出力します(ただし、文字列として)

例:

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"

バイト単位の最短コードが優先され、標準の抜け穴が適用されます。



1
xを文字列として使用できますか?
LiefdeWen

何が(-1,1)得られますか?
アダム

@Adámはこれを例に追加しました。
ブライアンH.17年

1
+正の数に先行符号は受け入れられますか?
トムカーペンター

回答:


4

Japt13 8バイト

最初の入力(x)を文字列として受け取ります。

®©ùTV}'-

それを試してみてください

ETHproductionsのおかげで5バイトを大幅に節約しました。


説明

string U=xおよびintegerの暗黙的な入力V=y

® }'-Uマイナス記号の配列に分割し、その上にマップし、マイナス記号のある文字列に再結合します。

©は論理AND(&&)であるため、現在の要素が真実(空ではない文字列)である場合、長さまでù0(T)を左()に埋め込みVます。


良いですね!あなたは、単に周りにマッピングすることによって、かなり保存することができます-ethproductions.github.io/japt/...
ETHproductions

@ETHproductions:素晴らしいコール。ありがとう。私がそうしてからとても長い間、私はあなたが1つの方法で文字列をすべて分割、マッピング、再結合できることを完全に忘れていました!
シャギー

はい、機能をに移動しqq-_©ùTV1バイトを節約します:
ETHproductions

@ETHproductions、私がその権利を理解しているなら、あなたは関数がS.q()(私たちを与えるS.q(s,f))の2番目の引数として渡された場合、S分割されs、実行され、f再結合されることを提案していsますか?私はそれが好きです!:)
シャギー

ええ、私はオリバーに話をしていないあなたのことをやって(関数を渡された場合、通常の機能を行う、機能を介して実行し、最初の変更を元に戻す;でしたN.sS/A.yN.ìすでにこれを行う)メソッドの束と?私は誰かと会話をしましたが、今誰を思い出せません:s
ETHproductions



6

05AB1E11 10バイト

として与えられる入力 amount_of_digits, number

ÎIÄg-×ì'-†

オンラインでお試しください!

説明

Î            # 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

これがこれまでの勝利の答えであるように思えますが、明日改善されない場合は受け入れます。
ブライアンH.

あなたはアウトゴルフされました:(
ブライアンH.

@BrianH。確かに私は:)
エミグナ




5

JavaScript(ES6)、42

再帰的、逆順のパラメーター、最初にy、次にx。そして、カリー化

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

テスト

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


印象的ではありますが、この答えはのf(y)(x)代わりに関数を定義することで規則をわずかに回避すると感じていますf(x,y)
styletron

「カリー化」ルールを読んで、私は、カレー自体ではなく、逆になったパラメーターにもっと反対していることを付け加えました。
styletron

1
@styletronでは、パラメータの順序はチャレンジで指定されていません。私はこれを活用することができるように
edc65

ダン、y=>r=x=>x<0?'-'+r(-x):(x+='')[y-1]?x:r(0+x)...ので、近づく
ETHproductions

入力順序を逆にする人には問題ありません。
ブライアンH.17年


5

bashの、27、25のバイト

ブルースフォルテのおかげで-2バイト

printf %0$[$2+($1<0)]d $1

オンラインで試す


1
パディングの長さをインライン化することにより、2バイト節約できます。また別の興味深い1(28バイト): printf %\ 0$[1+$1]d $2|xargs
ბიმო

多分あなたは意味printf %\ 0$[1+$2]d $1|xargsも有数のスペース削除するためにトリックをxargsの私が署名した数値のため、この形式を覚えていなかった、
ナウエルFouilleul


5

R、56 48バイト

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

オンラインでお試しください!

djhurioのおかげで-8バイト

説明

  • sprintf("%0zd",x)x長さがゼロになるようにパディングされた文字列として返されますz
  • paste0("%0",y+(x<0),"d")文字列を構築します"%0zd"。ここでzyxゼロ未満の場合は1
  • 場合zの桁数未満であるxxであるように文字列として印刷されます

48バイトfunction(x,y)sprintf(paste0("%0",y+(x<0),"d"),x)
djhurio

@djhurio素晴らしい!私はそれが私の編集ではなく別の答えを正当化すると思います、あなたは何と言いますか?
duckmayr

編集として作成できます。このソリューションはそれほど異なるものではなく、異なる機能を使用するだけです。
djhurio

4

アリス、23バイト

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

オンラインでお試しください!

入力は、最初の行の数字と2番目の行の幅で改行で区切る必要があります。

説明

/...
\...@/

これは、順序モードの線形プログラムの通常のフレームワークです。この場合の唯一の問題は次のビットです。

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

これにより、IPは垂直モードでCardinalモードに入り&、順序モードで再開する前にCardinalモードでのみ実行されます。

ジグザグ制御フローを展開すると、次が得られます。

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.

こちらも23バイトの2つの選択肢で、Cardinal Habs)を使用して以下を取り除きます-

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

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

原則として、これらはより短いコマンドですが&、スタック上に1文字の文字列がある位置に収まらないため、でスキップする必要があり#ます。



4

16 13バイト

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

オンラインでお試しください!

これは、先頭または末尾の空白を印刷せずにCharcoalを使用して取得できる最短の時間です。少なくとも、このModulo関数を使用して文字列をフォーマットする方法を理解し始めています。

解読されたコードは次のとおりです。

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のおかげで3バイト節約されました!

1
-Charcoalでは、印刷するか何もするのは本当に簡単です。1 -を印刷すると0を印刷すると何も印刷されません。したがって、3進数は不要で、3バイトを節約します。
ニール

をで交換するInputNumber()と、Cast(q)文字列比較に切り替えて別のバイトを保存できると思います。
ニール

@Neil私は簡単にできることを知っていましたTernary
チャーリー


4

PHP、45バイト

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

または

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

で実行する-nr、オンラインで試してください


そのリンクでコードを実行するときにエラーが発生します。
シャギー

@Shaggy第二のバージョンは、PHP 7.1を必要とする
タイタス

私はこれについて何度も続けましたが、まさにこの答えにたどり着きました。私はこれが最適なバージョンであると考えている
イスマエルミゲル


3

Mathematica、63 62バイト

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

オンラインでお試しください!


2
PPCGへようこそ!これはあなたが望んでいることをやっているとは思いません。おそらくのIntegerLength代わりにIntegerDigits。ただし、IntegerLength@#代わりにを使用してバイトを保存できIntegerLength[#]ます。
マーティンエンダー

ありがとうございました!私はそれをテストしている別のコンピューターからコードを手でコピーしていましたが、実際にIntegerLengthのIntegerDigitsをタイプミスしました。これで動作するはずです。また、チャレンジの説明(+1)のすべてのテストケースにTIOリンクを追加して、期待どおりに機能することを示しました。余分なバイトを保存するための提案もありがとう!以前はどうやって見逃したのかわかりません。:)
MatjazGo

2

Excel、29バイト

Excelの TEXT機能する(「値を特定の数値形式のテキストに変換する」)。

xA1、yB1

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

あなたはドロップできる)))のGoogleスプレッドシートに変換することによって-3バイトのために
テイラースコット




2

Japt14 12バイト

@ETHproductionsのおかげで2バイト節約

s r"%d+"_ù0V

オンラインで試す


それは数字でマイナス記号を維持し、ちょうど混乱する少し安いです:オンラインテストそれ
ETHproductions

@ETHproductions:またはx10バイトの文字列として受け取ります
シャギー

@ETHproductionsはお礼を言います。デスクに戻ったら更新します。
オリバー

@Shaggyはあなたが自分の答えを投稿したように見えるので、ETHproductionのトリックを使用します。どうもありがとう。
オリバー

オリバー、その10バイトUは文字列としてJapt 2.0a0にアップグレードされた@ETHproductionの12バイトのソリューションであり、最初の2文字をゴルフで飛ばすことができます。
シャギー

2

PowerShell25 40バイト

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

オンラインでお試しください!

説明

これは.ToString()、生成された書式文字列で数値を呼び出しますが、$by)がそれぞれ負、0、または正であるかどうかに基づいて、-1、0、または1を乗算します。これはy、それ自体ではフォーマット文字列ではない負の値を処理するためです。

これは、サブステートメント()で負の数値をラップする必要があるようです。これは、リテラルを使用する場合の呼び出しのちょっとした癖です。整数型の変数を渡した場合、それは必要ありません。


yが負の場合、これらは両方とも失敗するようです。
シャギー

@Shaggy ugh good catch。2番目のソリューションをすべて削除し、最初のソリューションを修正しました、ありがとう!
ブリアンティスト

痛い、15バイト!ごめんなさい!
シャギー

@Shaggyへー、最近の1つで、私が考えていたPowerShellベースのゴルフ言語を実際に作成します。これは実際に私をもう少し研究し、それを開始することに近づいたので、そのために感謝します;)
briantist

2

C#6.0、35バイト

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

代替ソリューション(51バイト)

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


1

C(gcc)、45バイト

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

オンラインでお試しください!

説明

printf 3つの引数をフォーマットします。

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

%s文字列をフォーマットします"-"+(x>=0)"-"は実際には単なるアドレス41961441です。メモリでは、これは次のようになります。

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

文字列にフォーマットされると、Cはアドレス(たとえば41961441)を取得し、ヌルバイト(0x00)が満たされるまで文字を取得し続けます。xがゼロより小さい場合、値"-"+(x>=0)は元のアドレスの値になります(41961441)。それ以外の場合x>=0は1であるため、式はになり"-"+1、後のNULLバイトを指します"-"

%0*i指定された数の0sで埋められた整数を出力します。yこの番号を示します。私たちは、パッドabs(x)いくつかの引数に負のを避けるために。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.