不足している数は何ですか(9で割り切れます)


22

チャレンジ

9で割り切れる整数と1桁の欠落桁がある場合、欠落桁を見つけます。

欠落している数字は、一貫している限り、数字0〜9以外の任意の文字で表すことができます。

欠落している数字が0または9である可能性がある場合は、そのことを示す何かを出力します。

ユーザーが不足している数字を1つだけ、数字を1つだけ入れるのに十分な知性があると仮定します。

テストケース

テストケースでは、欠落している数字は疑問符で表されます

123? -> 3
?999 -> 0 or 9
?0023 -> 4
000?1 -> 8

2
出力できます0か?何について[0, 9] (2つの数字の配列またはリスト)?
user202729

1
あなたが0または9の代わりにあなたが意味すると仮定すると、私はこの要件を編集して、どちらかになる可能性があることを示す任意の値になると思います。ありがとうございました!
NK1406

3
単なる?入力ですか?
XNOR

2
先行ゼロをサポートする必要がありますか?
mbomb007

1
@ NK1406先行ゼロを要求することはお勧めしません。少なくとも一部の言語では、これをサポートするために必要な追加バイトが表示されます。
エリックアウトゴルファー

回答:



9

アリス、12バイト

/o&
\i@/+R9%

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

0結果が0または9の場合に出力します。

説明

/   Switch to Ordinal mode.
i   Read all input as a string.
&   Fold the next operation over the characters of this strings.
/   Switch to Cardinal mode (not an operation).
+   Add. Implicitly converts each character to the integer value it represents
    and adds it to the top of the stack. The top of the stack is initially, implicitly
    zero. When the character is "?", it is simply discarded, which adds the top of
    the stack to another implicit zero beneath, so the "?" is effectively skipped.
R   Negate. Multiplies the sum by -1.
9%  Modulo 9. This gives the result.
\   Switch to Ordinal mode.
o   Implicitly convert the result to a string and print it.
@   Terminate the program.

&基本的モードは、ほとんど2つの整数で、元の入力を解釈するため、除去することができます。
ニトロドン

6

JavaScript(ES6)、40バイト

0または9の場合は9を出力します。

f=_=>9-([..._].reduce((a,b)=>a+~~b,0)%9)

2
PPCGへようこそ!素敵な最初の投稿!
Rɪᴋᴇʀ

2
数える必要はありませんf=。無名関数は完全に有効です。
シャギー

演算子の優先順位のため、最も外側の括弧は必要ありません;)
浅本しえる

5

Japt、7バイト

いくつかのソリューションを試してみましたが?、最初のものを置き換える必要がないことを除いて、最短のものは他のほとんどのものと同様でした。

欠落している数字として、数字以外の文字を使用できます。0ソリューションがそれまたはである場合に出力し9ます。

¬x*J u9

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


説明

stringの暗黙的な入力U¬個々の文字の配列に分割し、x非数値要素を無視して追加して配列を縮小し、*J各要素に-1を乗算してu9、結果の正の係数を取得します。


5

JavaScript(ES6)、18バイト

+欠落している桁としてaが必要です。戻り値9のため0または9

s=>9-eval(9+s+9)%9

テストケース



4

パイソン244の 41 35バイト

RiaDのおかげで-6バイト

lambda n:-sum(ord(c)-3for c in n)%9

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

]不足している数字のユーザー。欠落している数字が0または9の可能性がある場合に
出力し0ます。


HMは、すべてのテストケースでは私はそれが出力しようとした0ので、意味が曖昧な場合のために9%9 == 0
ふわふわ

場合あなたが悪いの文字のための適切な文字を選択した場合、あなたは、必要がないこと3 - > ORD(C) -あなたはint型(c)を行う場合
リヤド

3

Pyth、9 7バイト

%_s-Qd9

スペースを区切り文字として使用し、結果が0または9になる可能性がある場合は0を返します。

オンラインで試す

説明

%_s-Qd9
   -Qd   Remove the space from the input.
  s      Convert it to an integer.
%_    9  Negate mod 9.

3

プロローグ(SWI)、59バイト

0*[].
X*[H|T]:-between(0,9,H),U is mod(X+H,9),U*T.
+X:-0*X.

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

論理プログラミングに賛成です!

説明

最初に述語を作ります *、ゼロと空のリストに適用されたときに成立します。述語は、リストの先頭が0から9の間であり、先頭の桁mod 9を追加したときにも述語が保持されます。

次に、最初の引数として+この述部のみを定義し0ます。つまり、デジタル合計を9の倍数にする必要があります。

プロローグは、実際にソリューションを見つけるという面倒な作業をすべて行います。


3

Befunge-93、16バイト

1+!_#@3#.--9%~:#

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

James HoldernessのBefunge回答の1行バージョンで、2バイトを削り取ることができます。これは基本的にコードを1行に圧縮し、方向を逆にし、Befungeが行の終わりでスキップしないという事実を利用します。彼は私が別の答えを説明付きで投稿することを提案した。コードは、欠落している数字を表す*を取り、0または9のいずれかに対して9を出力します。

使い方

1+!_  3  --9% Initialises the pointer going right and initialises the digitsum with 3

1+!_         ~: Gets input and checks whether it is end of input (-1)

      3  - Subtract three from the input. 
           This turns the ASCII values of digits into their mod 9 equivalent ("0"(48)=>45(mod 9)=>0)

          -9% Subtract the value from the digitsum and mod it with 9
              This keeps the digitsum as a negative digit greater than -9
              Repeat this until the input ends

Now this is where it gets tricky.
At the end of input, the stack looks like this:
  -(Digitsum%9), Copy of EOF input (-1)
The pointer is moving left from the _
 +!_ Invert the -1 to get 0 and add it to the digitsum (does nothing but get rid of the -1)
1           %~ Adds 1 mod -1 (no input) = 0 to the stack
         --9 Subtracts 9 from 0, yielding -9 and subtracts that from the digitsum. 
             This makes the digitsum positive and equal to 9-(digitsum%9), our desired value
     @  . Finally, print and exit

* (ASCII値42)は、数字の初期値である3を打ち消すため、欠落文字として選択されました。


私はあなたがまだこれからバイトを絞り続けることができることに驚いています。よくやった!
ジェームズホルダーネス

2

LaTeX、多くのバイト(1000 628 614)

\RequirePackage{expl3}
\ExplSyntaxOn
\tl_new:N \l_divnine_input_tl
\int_new:N \l_divnine_sum_int
\def \getnum {
  \typein [ \l_divnine_input_tl ] { Input\space a\space number }
  \tl_map_function:NN \l_divnine_input_tl \divnine_sum:n
  \int_set:Nn \l_tmpa_int { 9 - \int_mod:nn { \l_divnine_sum_int } { 9 } }
  \typeout
    { The\space missing\space digit\space is:\space
      \int_use:N \l_tmpa_int
      \int_compare:nNnT { \l_tmpa_int } = { 0 } { \space or\space 9 }
    }
}
\cs_new:Nn \divnine_sum:n {
  \regex_match:nnT { \d } { #1 } { \int_add:Nn \l_divnine_sum_int { #1 } }
}
\ExplSyntaxOff
\getnum
\stop

LaTeX、判読不能(348 334バイト)

\RequirePackage{expl3}\ExplSyntaxOn\int_new:N\1\tl_new:N\2\def\3{\typein[\2]{Input\space a\space number}\tl_map_function:NN\2\4\int_set:Nn\1{9-\int_mod:nn{\1}{9}}\typeout{The\space missing\space digit\space is:\space\int_use:N\1\int_compare:nNnT{\1}={0}{\space or\space9}}}\def\4#1{\regex_match:nnT{\d}{#1}{\int_add:Nn\1{#1}}}\3\stop

LaTeX、132バイト

\RequirePackage{expl3}\typein[\1].\newcount\2{\ExplSyntaxOn\int_gset:Nn\2{9-\int_mod:nn\19}}\typeout{\the\2 \ifnum\2=9or 0\fi}\stop

このコードでは、不明な数字としてスペースのみが許可されています。


2

J14 12バイト

@BolceBussiereのおかげで-2バイト

9|9-[:+/"."0

私は正直に"."0解釈する理由がわかりません? 0プリターとTIOで解釈するので、質問しません。(更新:理由の説明についてはコメントを参照)。

このアプローチは、桁の合計を非常に単純に取り、9から減算してそれを否定し、9を法として取ります。

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


1
合計する前に
解く

1
また、「。は「?」を解釈しません 0として、それは空のリストとして解釈し、それが収まるようにするために、この場合(数値配列)に0である充填文字でJパッドを、。
Bolce Bussiere

2

ゼリー11 9 6バイト

|0SN%9

説明

|0     # Read input while removing non-digits (question marks) and removing leading zeros
  S    # Sum the digits
   N   # Negate
    %9 # Mod by 9

出力が0の場合、結果は0または9になります。

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

Mr. Xcoderのおかげで2バイト節約できました評価中に各クイック()を使用する場合、数字を数字に分割することは冗長でした。

Dennisのおかげで3バイト節約できました。入力を数値として手動で解析する代わりに、先行ゼロと非数字を削除する代わりに、入力を0とビット単位でORできます。


9バイト。ジェリーゴルフへようこそ!
ミスターXcoder

これは、答えが0または9の場合には対応しません。また、実際、Jellyにようこそ。私も新しいですが、これまでのところとても楽しかったです。
ディルナン

@dylnanはこれを対処
ポケ

@ポケオハイオ州、決して気にしない、私は要件が変更されたことを見ませんでした
ディルナン

|0の代わりに動作しfØDV€ます。
デニス


1

Befunge-93(PyFunge)22 21バイト

?は不在の数字を表すために使用する必要がないことに気づいたので、48を引いた後、9の倍数であるものを使用しました:x
これにより、ゴルフをオフにする3+ことができましたが、条件付き:(の前の最初の行


:私のBefunge-98の答えのポート
5は、より多くの我々はEOFに達したかどうかを確認するために、バイト
48(プッシュする1つの以上のバイト"0"'0)、
との答えを印刷するための1以上のバイト.@
第二ため、そして1つのより多くのバイトを行には
合計8バイトのスペースがあります。

~:0`!#|_"0"-+
 @.%9-<

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

0欠落している数字が0または9の可能性がある場合に出力します。

これは、以下で説明する理由でPyFungeインタープリターでのみ機能します。

説明

この説明の多くは、Befunge-98の説明からコピーアンドペーストされています。このプログラムはこの説明と非常によく似ているためです。恥知らずなプラグ

プログラムの最初の行で、xを含む数字を合計します。これは、ASCII値のために72のように扱われます。ただし、9で変更すると合計は同じになるため、これは無関係です。

~:0`!#|_"0"-+    THE FIRST LINE
~                Gets a character from input - If it is negative, we've reached EOF
 :0`!            Pushes 0 if the character is positive, 0 otherwise
     #|_         Goes to the next line if the value if 0
                     This also gets the negative value off the stack by using a |
        "0"-     Subtracts 48 to account for taking in ASCII values
            +    Adds this adjusted value to the sum

9だけ変更した場合、が必要になるため、間違った数字が残り9 - (sum % 9)ます。ただし、9\-9から剰余を減算するよりも良い方法があります。9で改造する前に合計を負にすると9 - (sum % 9)、一部のインタープリターと同等の正の結果が得られます。Befunge 93と98の両方でPyFungeインタープリターを使用する必要があるのは、TIOでこれを行う唯一のものであるためです。その他は、0と8の代わりに-8と8の間の値を与えます

 @.%9-<    THE SECOND LINE
      <    Redirects the IP onto this line
     -     Subtracts the sum from an implicit 0, making it negative
   %9      Mods the sum by 9
 @.        Prints the digit and exits

いい答えだ!余分なチェックを避けるために、欠落している数字にカスタム文字を使用することを考えたことがありません。更新された回答でそのトリックを盗んだことを気にしないでください。リファレンスインタプリタでも同じ概念が機能するかどうか確認したかったのです。
ジェームズホルダーネス

1

Befunge-98(PyFunge)15 13バイト

?欠けている数字を表すのに使う必要がないことに気づいたので、48を引いた後、9の倍数の数字を使用x
しました3+

#v~'0-+
q>-9%

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

を使用します x(その一般的に数学における変数として使用するので、それの素敵な)それのASCII値が48を差し引いた後、9で割り切れるので、行方不明の数字として。

終了コードによる出力(qが1バイト短いため.@)欠落している数字が0または9である可能性がある場合に
出力し0ます。

これは、以下で説明する理由でPyFungeインタープリターでのみ機能します。

説明

プログラムの最初の行で、xASCII値のために72のように扱われるを含む数字を合計します。ただし、9で変更すると合計は同じになるため、これは無関係です。

#v~'0-+    THE FIRST LINE
#v~        Pushes the next character from input, and goes to the second line on EOF
   '0-     Subtracts 48 to account for taking in ASCII values
      +    Adds this adjusted value to the sum

9だけ変更した場合、が必要になるため、間違った数字が残り9 - (sum % 9)ます。ただし、9\-9から剰余を減算するよりも良い方法があります。9で改造する前に合計を負にすると9 - (sum % 9) 、一部のインタープリターと同等の正の結果が得られます。Befunge 93と98の両方でPyFungeインタープリターを使用する必要があるのは、TIOでこれを行う唯一のものであるためです。他のものは、0と8の代わりに-8と8の間の値を与えます。

q>-9%    THE SECOND LINE
 >       Redirects the IP onto this line
  -      Subtracts the sum from an implicit 0, making it negative
   9%    Mods the sum by 9
q        Outputs via exit code, ending the program

1

ルビー、22バイト

用途'0「0」で割り切れる距離を持つ任意の文字は、0それ自体ます)。

の出力0は、0またはを意味します9

p -(gets.sum+6*~/$/)%9

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

説明

p     # print after inspecting
  -(  # unary negative, for reversing result of modulus (a-b%a)
    gets.sum # ascii value of string
    + 6*~/$/ # add six for each size (in chars) of input, so "0" translates to 0
  )%9 # mod 9
      # find remainder after dividing 9
      # except it's inverted so it's remainder to add to divide 9

1

ルビー46、41バイト

-5 @Unihedronに感謝

->s{-s.chars.sum{|i|?<>i ? i.to_i : 0}%9}

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


1.のchars代わりに.split(//)、2。'<'に置き換えることができます?<
Unihedron

同じツール(Ruby)で作成した短いプログラム(入力と出力を処理する)が独自の提出になるように作成しました。ここで見つけることができます:codegolf.stackexchange.com/a/151869/21830
Unihedron

@Unihedronありがとう、忘れてたなんて信じられないchars
トム・ラザー

1

Befunge-93、28の 27 19の 18バイト

ASCII値が9の倍数であることを確認した場合、PyFungeの答えから、欠落している数字の特別なチェックは不要であることが示されたMistah Figginsにクレジットする必要があります。

さらに、文字を数値に完全に変換する必要はなく、単純に3を減算して9を基準とする値を取得できることを示したJo Kingに感謝します(ASCII 0マイナス3は45、9の倍数) 。

3_v#`0:~--
%9_@.+9

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

これが機能する*ためには、欠落している数字に文字を使用する必要があります(他にも機能する可能性のあるものがありますが、それが最も優れています)。

9欠落している数字が0または9の可能性がある場合に出力します。

説明

3             Push 3 onto the stack.
 _            Since this is non-zero, drop the 3 and branch left.
3             Now executing right to left, push 3 again.
        --    Negate twice, leaving the value unchanged as our starting sum.

       ~      Now we start the main loop, reading a character from stdin.
    `0:       Duplicate and check if it's > 0, i.e. not end-of-stream.
 _ #          If so, continue to the left.
3        -    Subtract 3 to make the number relative to base 9.
        -     Then subtract it from the total, and repeat the loop.

  v           Once we reach the end of the input, we go down.
  _           Drop the EOF character from the stack and go left.
%9   +9       Mod the total with 9, and add 9.
   @.         Output the result and exit.

基本的に、すべての数字の合計に1桁あたり45を加えて計算します(9で変更すると最終的にキャンセルされます)。この合計は3(開始合計)から差し引かれ、さらに39が欠落している数字(ASCII *-3)から差し引かれます。繰り返しますが、3マイナス39は9の倍数であるため、9で変更するとキャンセルされます。

最終的に、すべての桁の負の合計、mod 9、プラス9を計算しています。つまり、

9 - (digitsum % 9)

そして、それは私たちに欠けている数字を与えてくれます。


-1バイトあなたはそれのほとんどは剰余に追加9を得るために必要で相殺されます代わりに48の3を引く場合
ジョー・キングを

@JoKingありがとう!それについて考えたことはなかったでしょう。残念ながら、今でも+9が必要ですが、それを取り除く方法はありません。
ジェームズホルダーネス

それを1行に圧縮することで、もう1 バイト削除することができました!ループごとに合計を%9に変更し、9を再利用します。途中で9を合計に追加します。
ジョーキング

@JoKing私はそれがもう1バイトしか節約していないことを知っていますが、それは素晴らしいです!それを新しい答えとして投稿する価値があります。あなたは間違いなく、私の票を得るでしょう。
ジェームズホルダーネス

投稿しました!最後の1バイトを削ることもできました!これが最後にできることだと思う
ジョーキング


0

PowerShell、40バイト

param($a)0..9|?{!(($a-replace'x',$_)%9)}

オンラインでお試しください!またはすべてのテストケースを検証する

以下のような入力を受け取り'123x'$a。範囲0を構築し、9それを使用してWhere-Object(ここでは略記|?)句に一致する整数を引き出します。この句は$a、正規表現-replaceを使用xして現在の数字に置き換え$_、mod 9を取得し%9ます。したがって、9が均等に分割される場合、これはゼロになります。ブール値ではなくブール値を使用します。これにより、ゼロが真になり、その他すべてが偽になり、Where-Object句を満たします。これらの結果はパイプラインに残され、出力は暗黙的です。



0

網膜35 34 25バイト

?できる場合、0 or 9結果はとして表示され9ます。

.
$*
1{9}

^
9$*;
+`;1

.

オンラインで試す

説明

.       Sum of the digits in unary + 1
$*
1{9}    Modulo 9

^       Prepend 9 semicolons, for subtracting
9$*;
+`;1    Subtract from 9

.       Back to decimal

\dはに変更でき.、次の行はに変更できると信じています$*
クリチキシリトス

ああ、そう。私がそれ?を書いたとき、私はまだ削除していませんでした。
mbomb007



@totallyhumanああ、そう。以前のバージョンからの別の名残。
mbomb007


0

Tcl、53バイト

puts [expr 9-([regsub -all (\\d)\\D? 0$argv +\\1])%9]

他の回答と同様に、これは明示的に「0または9」と言わないことで短くなります。
代わりに、「9」の結果は0または9を意味します。

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

説明

とても簡単に機能します。次の目的で正規表現を使用します。

  • 引数を個々の数字に分割します
  • 疑問符を削除します数字以外の
  • 数字をプラス記号でインターリーブします

次に、9-(sum_of_digits mod 9)を評価して、1..9の最終値に到達します。 putsます。

0$argv入力で疑問符が最初に来る場合に備えて、先頭の0()が必要です。変換されたシーケンスの先頭のプラス記号はの問題ではありませんexpr




0

brainfuck、50バイト

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

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

0または9のいずれかに対して9を出力します。不足している文字は次のように表されます。

使い方

Tape Format:
    0 Total Input 0

The total is represented as 9-digitSum%9

+>,[ Start loop with 1 as the total
    --- Subtract 3 from the inputted byte to make the value%9 equal to the digit
    [   While the input byte exists
      <-                 Decrement the total
      [<<]>[<+++++++++<] If the total is 0, reset it to 9
      >>-                Decrement the input byte
    ]
,] Continue loop until there is no input
-[<+>-----]<---. Add 48 to the total to convert the digit to the ascii value and output it

行方不明の文字はmod 9が4、+ 3の文字である必要があります。これは、通常の数字から3を減算し、合計を1として初期化するために+1するためです。

サイドノートとして、ゴルフのためにコードには多くの非効率性があります。各桁が3回ではなく48を引いたときに1回だけではなく、合計5回リセットされるためです。



0

Java 8, 36 34 bytes

s->9-s.map(c->c>57?0:c-48).sum()%9

Returns 9 when both 0 and 9 are valid.

Explanation:

Try it online.

s->                               // Method with IntStream parameter and int return-type
   9-                             //  Return 9, minus:
     s.map(c->c>57?0:c-48).sum()  //   The sum of the digits (ignoring the question mark)
     %9                           //   modulo-9
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.