整数を指定するとn > 0
、バイナリ表現の、0
または1
そのバイナリ表現の最長連続シーケンスの長さが出力されます。
例
6
110
バイナリで書かれています。最長のシーケンスは11
なので、返す必要があります2
16
→10000
→4
893
→1101111101
→5
1337371
→101000110100000011011
→6
1
→1
→1
9965546
→100110000000111111101010
→7
整数を指定するとn > 0
、バイナリ表現の、0
または1
そのバイナリ表現の最長連続シーケンスの長さが出力されます。
例
6
110
バイナリで書かれています。最長のシーケンスは11
なので、返す必要があります2
16
→ 10000
→4
893
→ 1101111101
→5
1337371
→ 101000110100000011011
→6
1
→ 1
→1
9965546
→ 100110000000111111101010
→7
回答:
f=lambda n,k=1:`k`in bin(n^n/2)and-~f(n,k*10)
排他的論理和によりN及びN / 2(割る2、本質的に最後のビットをオフチョップ)、新たな整数取得Mその解除ビットに隣接するビットに一致示すnは。
たとえば、n = 1337371の場合、次のようになります。
n = 1337371 = 101000110100000011011₂
n/2 = 668685 = 10100011010000001101₂
m = 1989654 = 111100101110000010110₂
これにより、タスクの実行回数が減り、ゼロが最も長く実行されます。正の整数のバイナリ表現は常に1で始まるため、mのバイナリ表現に現れる最も長い10 *桁の文字列を見つけようとします。これは再帰的に実行できます。
kを1として初期化します。fが実行されるたびに、最初にkの10 進表現がmのバイナリ表現に現れるかどうかをテストします。存在する場合、kに10を掛けて、fを再度呼び出します。そうでない場合、右側のコードand
は実行されず、Falseを返します。
これを行うには、まずを計算しbin(k)[3:]
ます。この例でbin(k)
は'0b111100101110000010110'
、を返し、0b1
先頭のはで削除され[3:]
ます。
これで、-~
再帰呼び出しの前に、fが再帰的に呼び出されるたびにFalse / 0が増分されます。一旦10 {J} (1続くj個の反復0)のバイナリ表現に表示されていないK、にゼロの最長ランkは長有する1 - jは。以来、J - 1における連続するゼロkが示すJに隣接するビットに一致nは、所望の結果は、J我々はインクリメントし得るものであり、偽 / 0を合計j回。
BŒgL€Ṁ
BŒgL€Ṁ Main link. Argument: n
B Binary; convert n to base 2.
Œg Group adjacent, identical elements.
L€ Map length over the groups.
Ṁ Take the maximum.
f=(n,r=0,l=1,d=2)=>n?f(n>>1,d^n&1?1:++r,r>l?r:l,n&1):l
多くのビット操作を伴う再帰的ソリューション。n
入力をr
保存し、現在の実行l
の長さを保存し、最長の実行の長さをd
保存し、前の数字を保存します。
f=(n,r=0,l=1,d=2)=>n?f(n>>1,d^n&1?1:++r,r>l?r:l,n&1):l
for(var i of [0,1,2,3,4,5,6,7,8,9,16,893,1337371]) console.log(`f(${i}): ${f(i)}`)
f=(x,b,n,m)=>x?f(x>>1,x&1,n=x&1^b||-~n,m>n?m:n):m
#!perl -p
\@a[$a+=$_-1+($_>>=1)&1||-$a]while$_;$_=@a
シバングを1つとしてカウントすると、入力はstdinから取得されます。
-p
コスト1、Perlコマンドラインにとにかく引数(例:-e
または-M5.010
)があると仮定するp
と、ハイフンの1つの直後に挿入できます。#!perl
(不要なが)自由です。
同じ数字の実行を取得するためのより短い方法があるように思えます...
MX#*(TBa`1+|0+`)
入力をコマンドライン引数として受け取ります。オンラインでお試しください!
TBa 1st cmdline arg, To Binary
( `1+|0+`) Find all matches of this regex
#* Map length operator to that list
MX Get the maximum and autoprint it
{(.base(2)~~m:g/1+|0+/)».chars.max}
説明:
{ } # a lambda
.base(2) # convert the argument to base 2
~~m:g/ / # regex match, with global matching turned on
1+|0+ # match one or more 1, or one or more 0
( )».chars # replace each match by its length
.max # take the maximum number
maximum.map length.group.i
どこ
import Data.List
i 0=[]
i n=mod n 2:i(div n 2)
または、非ゴルフバージョンでは:
import Data.List
pcg :: Int -> Int
pcg = maximum . map length . group . intToBin
intToBin :: Int -> [Int]
intToBin 0 = []
intToBin n = n `mod` 2 : intToBin (n `div` 2)
intToBin
intを2進数のリストに変換します(lsbが最初)。group
に[1, 1, 0, 0, 0, 1]
なるような連続したシーケンスをグループ化します[[1, 1],[0, 0, 0],[1]]
。maximum . map length
各内部リストの長さを計算し、最長の長さを返します。
編集:バイトを保存してくれた@xnorと@Laikoniに感謝
group
デフォルトではPreludeにないので、import Data.List
使用する必要があります。
let
:i n|(q,r)<-n`quotRem`2=r:i q
。Haskellゴルフのヒントをご覧ください。quotRem
することができますdivMod
。i 0=[]
基本ケースとして使用できると思います。
div
andをmod
直接使用すると、さらに短くなりますi n=mod n 2:i(div n 2)
。
[:>./#:#;.1~1,2~:/\#:
[:>./#:#;.1~1,2~:/\#: Input: integer n
#: Binary digits of n
2 \ For each continuous subarray of 2 digits
~:/ Reduce it using not-equals
1, Prepend a 1 to those results
#: Binary digits of n
;.1~ Cut the binary digits at each location with a 1
# Get the length of each cut
[:>./ Reduce those lengths using maximum and return
MATLAB 71バイト
m=1;a=diff(int8(dec2bin(a)));while(any(a==0)),m=m+1;a=diff(a);end;m
これは、整数変数「a」をバイナリint8配列に変換し、結果にゼロがなくなるまで結果を微分する必要がある回数をカウントします。
私はここでは新人です。この種の入力とワンライナーは、PCGルールで許可されていますか?
a
でa=input('');
。また、いくつかのゴルフのアドバイス:の~a
代わりにa==0
。本当に必要int8
ですか?)
@(n)max(runlength(+dec2bin(n)))
これは私のMATL回答の翻訳です。私の最初の計画は、異なるアプローチでした@(n)max(diff(find(diff([0 +dec2bin(n) 0]))))
。しかし、Octaveにはrunlength
機能があることがわかりました(これについては、先ほど知りました)。デフォルトでは、ランレングスの配列のみを出力するため、目的の結果はmax
その配列の結果になります。およびdec2bin
を含む文字配列(文字列)であるの出力は、数値入力を想定しているため、を使用して数値配列に変換する必要があります。'0'
'1'
+
runlength
大幅な改善(23バイト!)を提供してくれた@DigitalTraumaに感謝します。
dc<<<`dc -e2o?p|fold -1|uniq -c|sort -n`rp
編集:
ゴルフ
dc -e2o$1p|grep -Po 1+\|0+|wc -L
説明した
#Convert to binary
>dc -e2o893p
1101111101
#Place each continuous run of 1es or 0es on its own line
>dc -e2o893p|grep -Po '1+|0+'
11
0
11111
0
1
#Output the length of the longest line
>dc -e2o893p|grep -Po '1+|0+'|wc -L
5
$b@b:lotl
$b List of binary digits of the input
@b Runs of consecutive identical digits in that list
:lo Order those runs by length
tl Output is the length of the last one
n=>{int l=1,o=0,p=0;foreach(var c in System.Convert.ToString(n,2)){o=c!=p?1:o+1;l=o>l?o:l;p=c;}return l;};
フォーマット済みバージョン:
System.Func<int, int> f = n =>
{
int l = 1, o = 0, p = 0;
foreach (var c in System.Convert.ToString(n, 2))
{
o = c != p ? 1 : o + 1;
l = o > l ? o : l;
p = c;
}
return l;
};
そして、空白を削除して、118バイトのインデックスで文字列にアクセスする代替アプローチ:
System.Func<int, int> f2 = n =>
{
var s = System.Convert.ToString(n, 2);
int l = 1, c = 1, i = 0;
for (; i < s.Length - 1; )
{
c = s[i] == s[++i] ? c + 1 : 1;
l = l < c ? c : l;
}
return l;
};
x=>Math.max(...x.toString(2).split(/(0+|1+)/g).map(y=>y.length))
コードのmanatworkに感謝します。
x.toString(2)
数値をバイナリ文字列に変換します。
split(/(0+|1+)/g)
異なる文字(0または1)ごとに分割します(この正規表現は空のスペースをキャプチャしますが、無視できます)
map(y=>y.length)
配列の各要素の長さを取得し、返された配列に入れます。
...
配列を引数のリストに変換します([1,2,3]-> 1,2,3)
Math.max()
引数から最大数を取得します。
x=>x.toString(2).split(/(0+|1+)/g).map(y=>y.length).sort().pop()
。または同じ長さ:x=>Math.max(...x.toString(2).split(/(0+|1+)/g).map(y=>y.length))
。
sort((a,b)=>b-a)
。デフォルトでは、ソート機能が置き10
の間に1
と2
。
@set/a"n=%1/2,d=%1%%2,r=1+(%3+0)*!(0%2^d),l=%4-(%4-r>>5)
@if not %n%==0 %0 %n% %d% %r% %l%
@echo %l%
@ edc65の回答のポート。%2
.. %4
は最初の呼び出しで空になるため、式がまだ機能するように式を記述する必要があります。最も一般的なケースは%3
、私がとして書かなければならなかったケースです(%3+0)
。%2
は8進数で同じ0
またはのみであるため、より簡単です。ここで動作します。差し引くだけでいいので、さらに簡単になりました。比較するために使用されるとバッチのは、として比較演算子を持っていません。1
0%2
%4
(%4-r>>5)
l
r
set/a
無名関数トレイン
⌈/∘(≢¨⊢⊂⍨1,2≠/⊢)2⊥⍣¯1⊢
⌈/∘(
...次の匿名関数トレインの結果の最大値...
≢¨
それぞれの集計
⊢⊂⍨
引数のパーティション。パーティションは、次のものによって決定されます。
1,
に追加されたもの
2≠/
ペアワイズ不等
⊢
引数
)
に適用されます
2⊥⍣¯1
from-base-2は負に1回適用されます(つまりto-base-2、1回)
⊢
引数
2o!q¢ c ml n gJ
オンラインでテストしてください!または、すべてのテストケースを一度に検証します。
// Implicit: U = input integer, J = -1
2o // Create the range [0...2), or [0,1].
! ¢ // Map each item Z in this range to U.s(2)
q // .q(Z).
// This returns the runs of 1's and 0's in the binary
// representation of U, respectively.
c // Flatten into a single list.
ml // Map each item Z to Z.length.
n gJ // Sort the result and grab the item at index -1, or the last item.
// This returns the largest element in the list.
// Implicit: output result of last expression
max(rle(miscFuncs::bin(scan()))$l)
@rturnbullと@plannapusのおかげで愚かな誤解を修正しました。
0
またはの最大実行を探していますか?1
0
([regex]::Matches([convert]::ToString("$args",2),'0+|1+')|% Le*|sort)[-1]
これらの.Netメソッド。
これは、正規表現を使用して1と0の連続したシーケンスを検索(および一致)し、結果の一致オブジェクトのLength
プロパティ(ForEach-Object
1バイトを保存するために、既知のほとんどのパラメーターセットを使用する新しいパターン)を取得します。それらをソートし、最後のもの(最大のもの)を出力します。
>./>#&.>((1,2~:/\[)<;.1])#:
マイルの答えに対するわずかに異なる(そして残念なことに長い)アプローチ。
使用法:
>./>#&.>((1,2~:/\[)<;.1])#:893
5
説明
>./>#&.>((1,2~:/\[)<;.1])#:
#: Convert to base 2
( ) A fork
] Previous result
(1,2~:/\[) Find where each new sequence begins
<;.1 Cut the string of integers based on where each sequence begins and box them
#&.> Count under open - open each box and count the items in it
>./> Open all the boxes and find the maximum value