欠落している整数を出力します


34

文字列が与えられます。0〜9の9つの一意の整数が含まれます。不足している整数を返す必要があります。文字列は次のようになります。

123456789
 > 0

134567890
 > 2

867953120
 > 4

5
@rikerそれは、シーケンスに欠けている数を見つけることについてのようです。これは、セットから欠落している数字を見つけることについてのようです。
DJMcMayhem

10
@Rikerリンクされたチャレンジが厳密に増分するシーケンス(潜在的に複数桁の数字)を持っていることを考えると、重複しているとは思いませんが、ここでは任意の順序です。
AdmBorkBork

3
こんにちはジョシュ!これまで誰もそれについて言及していなかったので、メインに投稿する前に、将来のチャレンジのアイデアを投稿し、有意義なフィードバックを得ることができるサンドボックスに案内します。これにより、詳細(STDIN / STDOUTなど)を解決し、ここでダウン票を受け取る前に重複したジレンマを解決できました。
AdmBorkBork

1
9-x%9が0以外の数字で機能するのは非常に残念です。たぶん私よりも賢い人がそれを機能させる方法を見つけるでしょう。
ビジャン

2
いくつかの答えは、関数入力として整数を取ります。それは許されますか?
デニス

回答:


36

パイソン218の 16バイト

+ Sarge Borschのおかげで美しさ

`99066**2`.strip

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

99066**2 0〜9を含む文字列を生成するための短い方法です


7
32043は、より美しい数値に変更できます。99066は、中心対称(中心回りに回転180度変化しない)、または多分97779(ドローム、二つの別個の桁)である
Sargeのボルシチ

1
OPで数値を2回印刷できる場合、764**42バイト節約できます。
タイタス

@Titusが764**4不足している589
ロッド

1
タイプミス...私が意味した763**4=338920744561
タイタス

25

Python、22バイト

lambda s:-int(s,16)%15

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

算術ソリューション。入力文字列を16進数として解釈し、否定し、結果をモジュロ15で取ります。


2
これがなぜ機能するのか説明できますか?
カールカストール

1
@KarlKastor、基数16のモジュロ15は、基数10のモジュロ9と同様に機能します。10≡1(基数1)であるため、数字の合計をとるとき、基数1のモジュロは定数です。可能なすべての数字の合計は定数であるため、欠落している数字はこの定数と入力数(モジュロベース1)の差です。
-mik

16

APL(Dyalog)、4バイト

派生関数

D∘~

⎕DDの igits

 (左引数を次のダイアディック関数に結び付けて、モナド関数を作成します)

~ [引数]を除く

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


ファンクショントレイン

D~⊢

⎕DDの igits

~ を除く

 正しい議論

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


明示的なプログラム

D~⍞

⎕DDの igits

~ を除く

 文字入力

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


12

Brain-Flak48 38 36 + 3 = 39バイト

DJMcMayhemのおかげで10バイト節約!

((([]())[]{}){()()({}[()])}{}[{{}}])

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

説明

Asciiのすべての数字の合計は525です。このプログラムは入力を合計し、525から減算して不足している数字を取得します。

((([]())[]{}){()()({}[()])}{}      )

525をプッシュします。これは、最初に9つの入力要素があることがわかっているという事実を利用しています。これは、[]評価が9であるため、525などの大きな数値にすばやく到達できることを意味します。

次にビットがあります:

                             [{{}}]

入力を合計し、合計から減算します。


これはどのように作動しますか?
パベル

@ГригорийПерельман説明が追加されました!
小麦ウィザード

2
negative(sum(input()))最後まで移動すると、スタック高さniladを悪用して、525を簡単にプッシュできます。(([][][]()()()){()()({}[()])}{}[{{}}])10バイト節約できます
DJMcMayhem

代わりに477を減算して30バイト
ジョーキング

12

Haskell24 23バイト

(477-).sum.map fromEnum

オンラインでお試しください!使用法:(477-).sum.map fromEnum $ "123456890"。477は、0を除く1〜9の数字の文字コードの合計です。この匿名関数は、477からすべての数字の文字コードの合計を引いて、不足している文字コードを見つけます。

charの数字をintに変換すると、1バイト長くなります。

(45-).sum.map(read.pure)
foldl(\a b->a-read[b])45

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


10

ゼリー、3バイト

ØDḟ

「0123456789」()からの入力文字列を単純にフィルタリング()します。ØD

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


3
私は、すべてのゴルフ言語(および一部の非ゴルフ言語も)が同じアルゴリズムを使用している方法が好きですが、ジェリーは、使用する組み込み関数の最短名と、の引数を逆にするための最小の定型句を持っています

1
@ ais523 APLは、(それはむしろ機能/プログラムよりスニペットAPLであろうことを除いて)同じ文字による文字である:Ø= D= D= ~、のように⎕D~'867953120'
アダム

3
答えをスクロールしながら、「ゼリーの3人のキャラクターを予測しています。」ビンゴ。:^ D
DLosc


9

JavaScript(ES6)、26

1バイトを編集して thx @Neilを保存し、さらに賢いトリックを使用

1から9までのすべての値をXorすると、1が得られます。Xor1をもう一度入力すると、結果は0になります。したがって、1つの値が欠落している場合、結果は欠損値になります。

s=>eval([1,...s].join`^`)

テスト

f=s=>eval([1,...s].join`^`)

function go() {

  var i=I.value;
  O.textContent = f(i)
}  

go()
<input oninput='go()' value='012987653' id=I>
<pre id=O></pre>


s=>eval([1,...s].join`^`)バイトを保存します。
ニール

@ニール...そしてそれもはるかに興味深いです
-edc65

このヒントは、「 Dとにかく素敵なゴルフ+1」と答えた疑わしいほど短くなったように感じます。
クリストフ

1
@Christophまあ、それはあなたが言葉を広めたかったように聞こえた...-
ニール

@Neil absolutly :)それが助けたことを見てうれしい!
クリストフ

8

網膜27 21 19バイト

-6ベーシックサンセットに
感謝-2マーティンエンダーに感謝

.
$*_5$*
+`_1|1_

1

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

すべての数字をその数_と5 で置き換えます1

.
$*_5$*

すべての_sおよびa 1をそれぞれ削除します。

+`_1|1_ 


1残っているs の数を数えます:

1

二番目の答えの最初の行はちょうどでありえます.
ニール

交換の代わりに重複排除を使用すると、数バイトを節約できます。オンラインで試してください
Business Cat

まあ、ここで私はちょうど最初の答えの古いバイトカウントに2番目の答えを取得してい^ 5 ^. $*9¶ . $*_ +`_¶_ _
ニール

@Neil私はそれをオリジナルよりも1つ少なくしました。
ライリー

(それは私の答えと疑わしく類似しているように見えますが、唯一の違いは、バイトを保存する_よう1に切り替えたことです。)
ニール


6

JavaScript(ES6)、31 29 28 22バイト

s=>(15-`0x${s}`%15)%15

@xnorのPythonの回答のポート。ただし、JavaScriptにはモジュロ演算子ではなく剰余演算子のみがあるため、1つのステップでそれを行うことはできません。編集:@Arnauldのおかげで6バイトを保存しました。


s=>[...s].map(c=>r-=c,r=45)|r;-)
ETHproductions

3
あなたは恋しすぎreduceです。とにかく+1
edc65

@Arnauldいつ機能するかはわかりませんs[0]!='0'が、を使用する回答が既にありますeval
ニール

できますかs=>(15-`0x${s}`%15)%15
アーナルド

@Arnauld Bah、そして私はすでにバッチポートでもそれを行っていました...-
ニール

6

Brainfuck、17 15バイト

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

ここで試してみてくださいこのソリューションは、ラッピングに依存しているため、標準のBrainfuck(8ビットセル)でのみ機能します。

Brainfuckが実際に競争できるのはめったにない日ですが、この課題はたまたまBF仕様とかなりうまく並んでいます!

この答えをまっすぐに分解する代わりに、私が行った反復をステップ実行したいと思います。なぜなら、それはより理解しやすい(そしてより興味深い)と思うからです。
注:このソリューションは、主にWheat WizardのBrain-Flak answerに触発されています

説明

ステップ1、26バイト

彼の答えで、ウィートウィザードは、0-9合計のASCII値の合計は525であると指摘しました。標準のBrainfuckの概念は[0,255]のみであるため、これは値525%256 = 13になります。つまり、入力のASC​​II値を13ネットから減算すると、不足している数字が表示されます。

このプログラムの最初のバージョンであった:
最初のセル内の1入れ13
秒細胞への2テイク入力が
第一のセルから第二のセルを減算3.
残りの入力がある場合は2〜4ジャンプ
最初のセルを印刷5.します

そして、この簡単なソリューションのコードは次のとおりです。

+++++++++++++ #Set the first cell to 13  
>,            #Take inputs into the second cell  
[[<->-],]     #Subtract the second cell from the first cell and repeat until inputs are over  
<.            #Print the first cell  

ステップ2、19バイト

彼の答えで指摘したように、入力の長さは正確に9であることがわかっているため、その値を定数として使用し、先頭の+の長い文字列を削除できます。
また、13を追加する時点(重要、交換可能なプロパティ!)でも問題ではないため、減算と印刷のステップと混合します。

,        #Take input to enter the loop
[[->-<], #Subtract the first cell from the second cell 
>+<]     #Add 1 for each input; totaling 9
>++++    #Add the missing 4 to make 13
.        #And print

これはこの問題に対する私の最初の答えでしたが、もっとうまくやることができます。

ステップ3、17バイト

興味深いことに、前の答えは、の代わりに+で始まっても機能します。

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

Brainfuck は、ループを開始するためにセル内に何かを必要としました。それが他の場所に行くことができたとき、私たちは最後にその余分な4を単純に追加しました。

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

いくつかの完全に意図的な(試行:試行錯誤)ループトリックを使用して、プログラムを-で開始すると、2つの興味深い結果につながります。

  1. 1つは2番目のセルに追加されます(最後に1バイトを節約します)。
  2. ループは1回余分に実行され、合計9回ではなく10回(別の1バイトを節約)になります。

1 + 10 + 2 = 13で、元の答えになります。

振り返ってみると、これはおそらくこのような単純なBrainfuckプログラムの過剰な評価です。

ステップ4、15バイト

このソリューションについてもう少し考えた後、2バイトを削減することができました。

私は前のステップについて何かを明確にしたかった:
ループに入るマイナスは事実上 1を追加しますが、実際に行っているのは2番目のセルから255を減算することです(結果は1)。

振り返ってみると明らかですが、最初のセルから1を引くことは、2番目のセルに1を加えることと同じです(最初のセルのすべてが2番目のセルから減算されるため)。

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

最初のループの先頭に「-」を追加することで、「> + <」を削除できました。「> + <」があった場所ではなく、そこに行かなければなりません。プログラムがそうでなければ無限にループするからです。



5

Mathematica、25バイト

477-Tr@ToCharacterCode@#&

入力として文字列を取り、整数を返す純粋な関数。Mathematicaには長いコマンド名があり、文字列と整数の間の変換に消極的であるため、この課題では特に問題があります。私が見つけた最高のものは、Level River StのRuby answerのアルゴリズムで、入力文字列のASCIIコードの合計に基づいて計算を行いました。Mathematicaでは、これは1つの長いコマンド名のみを使用します。


5

PHP、27

<?=trim(32043**2,$argv[1]);

Rodの回答のトリックを使用して、すべての数字を含む文字列を生成し、欠落している数字を除くすべての数字を削除します。


PHP、41

for($b=1;$i<9;$b^=$argv[1][$i++]);echo$b;

私はまだ見たことがないので、これはxorを使用しています。


素敵な私はトリムについて考えていない。代替値32043,32286,33144,35172,35337,35757,35853,37176,37905,38772,39147,39336,40545,42744,43902,44016,45567,45624,46587,48852,49314,49353,50706,53976,54918,55446,55524,55581,55626,56532,57321,58413,58455,58554,59403,60984,61575,61866,62679,62961,63051,63129,65634,65637,66105,66276,67677,68763,68781,69513,71433,72621,75759,76047,76182,77346,78072,78453,80361,80445,81222,81945,83919,84648,85353,85743,85803,86073,87639,88623,89079,89145,89355,89523,90144,90153,90198,91248,91605,92214,94695,95154,96702,97779,98055,98802,99066
ヨルグヒュルサーマン

5

Bash + coreutils、19バイト

興味深いチェックサムアプローチを使用する短い bashソリューションを見つけました。

sum -s|dc -e524?--P

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

説明:

このsumコマンドは、チェックサムとブロックカウントを出力します。多くの詳細は知りませんが、オプション-s(System Vアルゴリズム)を使用すると、チェックサムが各入力文字コードのASCII合計に等しくなります。そのため、同じ入力文字の順序が変わっても、チェックサムは一定のままです。

与えられた867953120テストケース(最後の例)として、ここではスクリプトがどのように動作するかです:

  • sum -s出力473 1。整数が欠落していない場合、チェックサムは525になります。
  • dc -e524?524を押し、次にパイプ入力を押します。スタックは次のとおり1 473 524です。525からチェックサムを減算するという考え方ですが、合計も1を出力するため、それを処理する必要があります。
  • --P。2つの減算(524-(473-1))を適用すると、スタックは次のようになり52ます。'P'を使用すると、ASCIIコードの文字が表示されます:4不足している数字。

4

Fortran 95、146 128バイト

function m(s)
character(len=10)::s,t
t='0123456789'
do j=1,10
k=0
do i=1,9
if(s(i:i)==t(j:j))k=1
end do
if(k==0)m=j-1
end do
end

それほど短くはないが、私は怖い。

ゴルフをしていない:

integer function m(s)
    implicit none

    character(len=9)::s
    character(len=10)::t
    integer:: i, j, k

    t='0123456789'
    do j=1,10
        k=0
        do i=1,9
            if (s(i:i) == t(j:j)) k=1
        end do
        if (k==0) m=j-1
    end do

end function m



3

Brachylog(2)、5バイト

ẹ:Ị↔x

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

間違いなく短くする必要があります(なぜそれが必要なのかについて私はまだ混乱しています)が、これは私ができる最善の方法です。

説明

ẹ:Ị↔x
ẹ      Split the input into a list of characters
 :Ị    Pair that list with the string "0123456789"
   ↔x  Remove all elements of the list from the string

x実装は古くてかなりバグが多いため、必要です。
致命

あなたは実際に¬∋ℕ3文字でしか動作しないような議論をすることができます-それが私が最初に試したものです-しかし、それが失敗する理由はいくつかあります。

そう¬∋ℕではないことを具体的にプログラミングしない限り、そのような作業をPrologで行うことさえできませんnot in¬Brachylog \+ではProlog と同等であり、その意味は「これを検証しないものすべてに選択ポイントを与えて」(ほぼ常に無限の数である)というよりも、「閉世界の仮定の下では証明できない」という意味です)
致命的

Prologでそれを行う唯一の方法は、事前に「ラベル付け」することですが、それは述語の内容に基づいてBrachylogの評価順序をいじることを意味します。ただし、これは問題の1つにすぎません。他にもたくさんあります。

3

Common Lisp、47バイト

(lambda(s)(- 45(reduce'+ s :key'digit-char-p)))

ゴルフをしていない:

(lambda (s) (- 45 (reduce '+ s :key 'digit-char-p)))

説明:

(reduce '+ s :key 'digit-char-p)

これは、の文字​​をループし、sそれらを数字に変換して追加します。Digit-char-pは、便宜上、charの番号を「true」値として返すため、テストまたは変換として使用できます。

(- 45 ...)

45から減算すると、入力から欠落していた数字が返されます。


3

Cubix、18バイト

5v&;52/ni?@.>!&oW+

拡大

    5 v
    & ;
5 2 / n i ? @ .
> ! & o W + . .
    . .
    . .

ここで試してみてください

この頭脳の答えと同じ方法を使用します。

5、2、連結、5、連結、否定を押して、スタックに値-525を作成します。
その後、繰り返し入力を取得し、入力の終わりに達するまで追加します。
最後の入力を削除し、最後の加算結果を否定(正に)し、文字を出力して停止します。

-525から動作する理由は、入力の繰り返しごとに文字出力がヒットするためです。値は負であるため、ループが終了し、負の値が正になるまで何も出力されません。



3

Bash(+ユーティリティ)、 22、19バイト

  • seq括弧の代わりに-3バイトを使用します(Thx @Riley!)
seq 0 9|tr -d \\n$1 

テスト

$seq 0 9|tr -d \\n123456789
0

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


$1それよりも前にスペースを移動した場合は、より明確になります
ニール

@ニール、うん、それはいいアイデアです!THX !
ツェッペリン

あなたは使うことができseq代わりにechoseq 0 9|tr -d \\n$1
ライリー

3

Googleスプレッドシート、39 33バイト

入力はcellに入力されA1ます。

コード:

=REGEXEXTRACT(4&2^29,"[^"&A1&"]")

Steve Kassのおかげで6バイト節約されました。

前のコード:

=REGEXEXTRACT("0123456789","[^"&A1&"]")

結果:

ここに画像の説明を入力してください


数値2 ^ 29には4以外のすべての数字があるため、33バイト:= REGEXEXTRACT(4&2 ^ 29、 "[^"&A4& "]")
スティーブカス

@SteveKassニース。=REGEXEXTRACT(0&49^9,"[^"&A1&"]")同様のロジックを考えると、これも有効なソリューションです。更新された回答。
グラントミラー

3

Befunge 98、14の 12バイト

プログラムを1行と1バイトに移動することで1バイト節約しました。

~+;@.%a--7;#

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

説明

ASCII値の合計は、欠落している数値に応じて477〜468の範囲です。これを7から引くと、-470〜-461の範囲が得られます。この番号を10で改造すると、0〜9の範囲が得られ、印刷できます。

~+;       ;#    Sums the ASCII values of all characters to stdIn
~          #    The # doesn't skip over the ~ because it's on the end of a line
~               Once EOF is hit, the ~ reverses the IP's direction
          ;#    Jump the ; that was used before
       --7      Subtract the sum from 7 (really just 0 - (sum - 7))
     %a         Mod it by 10
   @.           Print and exit

整数入力を使用する代わりにASCII値を使用する理由は&、Try it OnlineのコマンドがEOFで停止するためです(IPを逆にする必要があります)。~しかし、正常に動作します。

古いプログラム、14バイト

#v~+
@>'i5*--,

10桁すべてのASCII値の合計は525です。525から指定された数字の合計を引くと、欠落している文字のASCII値が得られます。

#v~+         Sums the ASCII values of all characters on stdIn
             Moves to the next line when this is done
 >'i5*       Pushes 525 (105 * 5)
      --     Subtracts the sum from 525
@       ,    Prints and exits

2

PowerShell、30バイト

param($n)0..9|?{$n-notmatch$_}

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

入力を受け取り$n、範囲0..9(つまり0, 1, 2 ... 9)を構築してから、Where-Object句(|?{...})を使用してregexを実行する数値を引き出し-notmatchます。それはパイプラインに残っており、出力は暗黙的です。




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