文字列が与えられます。0〜9の9つの一意の整数が含まれます。不足している整数を返す必要があります。文字列は次のようになります。
123456789
> 0
134567890
> 2
867953120
> 4
文字列が与えられます。0〜9の9つの一意の整数が含まれます。不足している整数を返す必要があります。文字列は次のようになります。
123456789
> 0
134567890
> 2
867953120
> 4
回答:
764**4
2バイト節約できます。
764**4
不足している5
、8
と9
763**4
=338920744561
⎕D∘~
⎕D
Dの igits
∘
(左引数を次のダイアディック関数に結び付けて、モナド関数を作成します)
~
[引数]を除く
⎕D~⊢
⎕D
Dの igits
~
を除く
⊢
正しい議論
⎕D~⍞
⎕D
Dの igits
~
を除く
⍞
文字入力
DJMcMayhemのおかげで10バイト節約!
((([]())[]{}){()()({}[()])}{}[{{}}])
Asciiのすべての数字の合計は525です。このプログラムは入力を合計し、525から減算して不足している数字を取得します。
((([]())[]{}){()()({}[()])}{} )
525をプッシュします。これは、最初に9つの入力要素があることがわかっているという事実を利用しています。これは、[]
評価が9であるため、525などの大きな数値にすばやく到達できることを意味します。
次にビットがあります:
[{{}}]
入力を合計し、合計から減算します。
negative(sum(input()))
最後まで移動すると、スタック高さniladを悪用して、525を簡単にプッシュできます。(([][][]()()()){()()({}[()])}{}[{{}}])
10バイト節約できます
(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
ASCIIコードを合計し、48 * 9 + 45から減算します
->s{477-s.sum}
このように使用する
f=->s{477-s.sum}
puts f["123456789"]
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`^`)
バイトを保存します。
-6ベーシックサンセットに
感謝-2マーティンエンダーに感謝
.
$*_5$*
+`_1|1_
1
すべての数字をその数_
と5 で置き換えます1
。
.
$*_5$*
すべての_
sおよびa 1
をそれぞれ削除します。
+`_1|1_
1
残っているs の数を数えます:
1
.
。
^
5
^.
$*9¶
.
$*_
+`_¶_
¶
_
_
よう1
に切り替えたことです。)
s=>(15-`0x${s}`%15)%15
@xnorのPythonの回答のポート。ただし、JavaScriptにはモジュロ演算子ではなく剰余演算子のみがあるため、1つのステップでそれを行うことはできません。編集:@Arnauldのおかげで6バイトを保存しました。
s=>[...s].map(c=>r-=c,r=45)|r
;-)
reduce
です。とにかく+1
s[0]!='0'
が、を使用する回答が既にありますeval
。
s=>(15-`0x${s}`%15)%15
?
-[-[->-<],]>++.
ここで試してみてください。 このソリューションは、ラッピングに依存しているため、標準のBrainfuck(8ビットセル)でのみ機能します。
Brainfuckが実際に競争できるのはめったにない日ですが、この課題はたまたまBF仕様とかなりうまく並んでいます!
この答えをまっすぐに分解する代わりに、私が行った反復をステップ実行したいと思います。なぜなら、それはより理解しやすい(そしてより興味深い)と思うからです。
注:このソリューションは、主にWheat WizardのBrain-Flak answerに触発されています。
彼の答えで、ウィートウィザードは、0-9合計のASCII値の合計は525であると指摘しました。標準のBrainfuckの概念は[0,255]のみであるため、これは値525%256 = 13になります。つまり、入力のASCII値を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
彼の答えで指摘したように、入力の長さは正確に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
これはこの問題に対する私の最初の答えでしたが、もっとうまくやることができます。
興味深いことに、前の答えは、の代わりに+で始まっても機能します。
+[[->-<],>+<]>++++.
Brainfuck は、ループを開始するためにセル内に何かを必要としました。それが他の場所に行くことができたとき、私たちは最後にその余分な4を単純に追加しました。
-[[->-<],>+<]>++.
いくつかの完全に意図的な(試行:試行錯誤)ループトリックを使用して、プログラムを-で開始すると、2つの興味深い結果につながります。
1 + 10 + 2 = 13で、元の答えになります。
振り返ってみると、これはおそらくこのような単純なBrainfuckプログラムの過剰な評価です。
このソリューションについてもう少し考えた後、2バイトを削減することができました。
私は前のステップについて何かを明確にしたかった:
ループに入るマイナスは事実上 1を追加しますが、実際に行っているのは2番目のセルから255を減算することです(結果は1)。
振り返ってみると明らかですが、最初のセルから1を引くことは、2番目のセルに1を加えることと同じです(最初のセルのすべてが2番目のセルから減算されるため)。
-[-[->-<],]>++.
最初のループの先頭に「-」を追加することで、「> + <」を削除できました。「> + <」があった場所ではなく、そこに行かなければなりません。プログラムがそうでなければ無限にループするからです。
477-Tr@ToCharacterCode@#&
入力として文字列を取り、整数を返す純粋な関数。Mathematicaには長いコマンド名があり、文字列と整数の間の変換に消極的であるため、この課題では特に問題があります。私が見つけた最高のものは、Level River StのRuby answerのアルゴリズムで、入力文字列のASCIIコードの合計に基づいて計算を行いました。Mathematicaでは、これは1つの長いコマンド名のみを使用します。
<?=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
興味深いチェックサムアプローチを使用する短い 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
不足している数字。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
A,sq-
A, e# The range from 0 to 9: [0 1 2 3 4 5 6 7 8 9]
s e# Cast to a string: "0123456789"
q e# The input
- e# Remove all characters from the range that are in the input
e# Implicit output
+1を含む -r
s/$/0123456789/
:
s/(.)(.*)\1/\2/
t
s/$/0123456789/ # Append 0123456789
: # Start loop
s/(.)(.*)\1/\2/ # remove a duplicate character
t # loop if something changed
ẹ:Ị↔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
実装は古くてかなりバグが多いため、必要ẹ
です。
¬∋ℕ
ではないことを具体的にプログラミングしない限り、そのような作業をPrologで行うことさえできませんnot in
。¬
Brachylog \+
ではProlog と同等であり、その意味は「これを検証しないものすべてに選択ポイントを与えて」(ほぼ常に無限の数である)というよりも、「閉世界の仮定の下では証明できない」という意味です)
(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から減算すると、入力から欠落していた数字が返されます。
入力はcellに入力され
A1
ます。
コード:
=REGEXEXTRACT(4&2^29,"[^"&A1&"]")
Steve Kassのおかげで6バイト節約されました。
前のコード:
=REGEXEXTRACT("0123456789","[^"&A1&"]")
結果:
=REGEXEXTRACT(0&49^9,"[^"&A1&"]")
同様のロジックを考えると、これも有効なソリューションです。更新された回答。
プログラムを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を逆にする必要があります)。~
しかし、正常に動作します。
#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
param($n)0..9|?{$n-notmatch$_}
入力を受け取り$n
、範囲0..9
(つまり0, 1, 2 ... 9
)を構築してから、Where-Object
句(|?{...}
)を使用してregexを実行する数値を引き出し-notmatch
ます。それはパイプラインに残っており、出力は暗黙的です。
-jkUT
-jkUT
T # 10
U # The unary range of ten: [0,1,..,9]
jk # join that on the empty string
- # set minus
「-jUT」も機能しますが、すべてのintに対して改行を生成します。