| Bytes | Lang | Time | Link |
|---|---|---|---|
| 047 | Ruby | 250427T172137Z | Jordan |
| 097 | JavaScript Node.js | 230703T073803Z | l4m2 |
| 002 | Nekomata | 230701T020650Z | alephalp |
| 046 | Arturo | 230212T074458Z | chunes |
| 036 | Factor + grouping.extras | 210811T220154Z | chunes |
| 024 | K ngn/k | 201215T190004Z | coltim |
| 065 | R | 201215T124804Z | Dominic |
| 056 | R | 201215T161611Z | Giuseppe |
| 004 | Japt g | 201215T113930Z | Shaggy |
| 088 | PowerShell for Windows | 201215T100916Z | mazzy |
| 005 | 05AB1E | 201215T074218Z | ovs |
| 005 | Jelly | 201215T071848Z | caird co |
| 004 | Husk | 201215T061808Z | Razetime |
| 069 | Perl 5 MListUtil=pairkeys | 190528T224729Z | Xcali |
| 006 | Brachylog | 190528T091533Z | Unrelate |
| 204 | C# | 160501T200557Z | downrep_ |
| 065 | Clojure | 161226T203714Z | NikoNyrh |
| 031 | J | 160704T203245Z | miles |
| 025 | APL | 160624T125953Z | lstefano |
| 074 | Retina | 160502T092706Z | Leaky Nu |
| 113 | JavaScript ES6 | 160502T105622Z | Neil |
| 106 | JavaScript ES6 | 160502T095835Z | edc65 |
| 120 | Python 2 | 160502T081114Z | user4594 |
| 016 | Jelly | 160501T161014Z | Leaky Nu |
| nan | Pyth | 160501T161451Z | FryAmThe |
| 015 | MATL | 160502T002853Z | David |
| 303 | Python 2.x | 160501T222501Z | hyperneu |
| 038 | Haskell | 160501T195116Z | nimi |
| 024 | Mathematica | 160501T155850Z | LegionMa |
JavaScript (Node.js), 97 bytes
x=>eval(`[[${x}]]`.replace(/\b(\d+),(?!\1\b)/g,'$1],[')).filter((t,_,x)=>!x.some(y=>t[y.length]))
Factor + grouping.extras, 36 bytes
[ [ ] group-by values all-shortest ]
[ ] group-by valuesSplit a sequence into groups of contiguous equal elements.all-shortestTake all the shortest groups.
[ stable-slices all-shortest ] would work except it doesn't have the right behavior for 1-element inputs.
K (ngn/k), 24 bytes
{{x=&/x:#'x}#(&~=':x)_x}
(&~=':x)_xsplit the input on indices where the values change{x=&/x:#'x}#filter down to items of the minimum length
R, 70 65 bytes
Edit: -5 bytes thanks to Giuseppe
function(x)(y=split(x,diffinv(!!diff(x))))[min(l<-lengths(y))==l]
This feels rather clunky, so I won't be surprised if there's a much slicker R way to do this... Edit: there is...
function(x) # x is vector of values;
(y= # define y as
split(x, # groups of values of x that share the same
cumsum( # cumulative sum of
x!=c(0,x)))) # 1 if different to the next element;
[ # now, get element(s) of y
(l=lengths(y)) # whose length(s)
==min(l[l>0])] # equal the smallest non-zero lengths of y
R, 56 bytes
function(x,r=rle(x),l=min(r$l))lapply(r$v[r$l==l],rep,l)
-2 bytes thanks to Dominic van Essen. Uses rle and rep to collapse and reconstruct the array.
Japt -g, 4 bytes
Outputs a 2D-array.
òÎüÊ
òÎüÊ :Implicit input of array
ò :Partition between elements where
Î : The sign of their difference is truthy (not 0)
ü :Group and sort by
Ê : Length
:Implicit output of first element
PowerShell for Windows, 88 bytes
$h=@{}
$args|%{$i+=$p-ne$_;$h.+$i+=,$p=$_}
($g=@($h|% v*|sort c*))|? c*t -eq $g[0].count
The script uses the Powershell alias sort that should be sort-object with Linux.
Less golfed:
$hashTable=@{}
$args|foreach-object{
$i += ($prev -ne $_)
$prev = $_
$hashTable.+$i += ,$prev
}
$groups=@($hashTable|foreach-object Values|sort-object Count)
$groups|where-object count -eq $groups[0].count
05AB1E, 5 bytes
γé¬gù
Commented:
γ # split into chunks of equal adjacent elements
é # sort the chunks by length
¬ # get the shortest (first) chunk without popping the list
g # take the length of that chunk
ù # keep all chunks with this length
Perl 5 -MList::Util=pairkeys,min -a, 69 bytes
map$r{y/ //}.="[ $_]",pairkeys"@F "=~/((\d+ )\2*)/g;say$r{min keys%r}
Brachylog, 6 bytes
ḅlᵒlᵍh
Input through the input variable and output through the output variable.
ḅ The list of runs of consecutive equal elements of
the input
lᵒ sorted by length
lᵍ and grouped by length
has the output variable
h as its first element.
Although, unlike ḅ, ᵍ groups non-consecutive equal elements, the lᵒ is still necessary to find the group with the shortest lengths, and it works because the order of groups in the output from ᵍ is determined by the position of the first element of each group, so that ᵍhᵐ could function as sort of a deduplicate by pseudo-metapredicate.
C#, 204 bytes
void f(string o){var r=Regex.Matches(o,@"([0-9])\1{0,}").Cast<Match>().OrderBy(x=>x.Groups[0].Value.Length);foreach(var s in r){foreach(var z in r)if(s.Length>z.Length)return;Console.WriteLine(s.Value);}}
I don't know if using a string is fair considering all the golfing esolangs get their input in the same way but he requested array input.
ungolfed:
public static void f(string inp)
{
var r = Regex.Matches(inp, @"([0-9])\1{0,}").Cast<Match>().OrderBy(x => x.Groups[0].Value.Length);
foreach (Match s in r)
{
foreach (Match z in r)
if (s.Length > z.Length)
return;
Console.WriteLine(s.Value);
}
}
I need a way to get the smallest matches for the match array, most of my bytes are wasted there, help appreciated. I'm trying to get into LINQ and lambda stuff.
Clojure, 65 bytes
#(let[G(group-by count(partition-by + %))](G(apply min(keys G))))
Uses + as identity function as (+ 5) is 5 :) The rest should be obvious, G is a hash-map used as a function and given a key it returns the corresponding value.
J, 31 bytes
[:(#~[:(=<./)#@>)]<;.1~1,2~:/\]
Input is an array of values. Output is an array of boxed arrays.
Usage
f =: [:(#~[:(=<./)#@>)]<;.1~1,2~:/\]
f 1 1 2 2 3 3 4
┌─┐
│4│
└─┘
f 3 3 3 4 4 4 4 5 5 4 4 3 3 4 4
┌───┬───┬───┬───┐
│5 5│4 4│3 3│4 4│
└───┴───┴───┴───┘
Explanation
[:(#~[:(=<./)#@>)]<;.1~1,2~:/\] Input: s
] Identity function, get s
2 The constant 2
\ Operate on each overlapping sublist of size 2
~:/ Check if each pair is unequal, 1 if true else 0
1, Prepend a 1 to that list
] Identity function, get s
<;.1~ Using the list above, chop s at each true index
[:( ) Operate on the sublists
#@> Get the length of each sublist
[:( ) Operate on the length of each sublist
<./ Get the minimum length
= Mark each index as 1 if equal to the min length else 0
#~ Copy only the sublists with min length and return
APL, 25 chars
{z/⍨(⊢=⌊/)≢¨z←(1,2≠/⍵)⊂⍵}
In English:
- put in z the argument split where a number is different than the one preceding;
- compute the length of each subarray
- compare the minimum with each of the lengths producing a boolean...
- ... that is used to reduce z
Retina, 91 85 80 79 77 76 75 74 bytes
M!`\b(\d+)(,\1\b)*
(,()|.)+
$#2:$&
O#`.+
s`^(.*\b(.+:).*)¶(?!\2).+
$1
.+:
<empty-line>
Explanation
The input is 1,1,10,10,10,100,100.
The first line matches groups with same terms:
M!`\b(\d+)(,\1\b)*
The input becomes:
1,1
10,10,10
100,100
The following two lines prepend the number of commas to the line:
(,()|.)+
$#2:$&
The input becomes:
1:1,1
2:10,10,10
1:100,100
Then they are sorted by this line, which looks for the first number as index:
O#`.+
The input becomes:
1:1,1
1:100,100
2:10,10,10
Then these two lines find the place where the length is different, and remove everything onwards:
s`^(.*\b(.+:).*)¶(?!\2).+
$1
The input becomes:
1:1,1
1:100,100
Then the numbers are removed by these two lines:
.+:
<empty-line>
Where the input becomes:
1,1
100,100
JavaScript (ES6), 113 bytes
a=>a.map(n=>n==c[0]?c.push(n):b.push(c=[n]),c=b=[])&&b.sort((a,b)=>a[l]-b[l],l='length').filter(e=>e[l]==b[0][l])
JavaScript (ES6), 106
a=>(a.map((v,i)=>v==a[i-1]?g.push(v):h.push(g=[v]),h=[]),h.filter(x=>!x[Math.min(...h.map(x=>x.length))]))
Test
f=a=>(a.map((v,i)=>v==a[i-1]?g.push(v):h.push(g=[v]),h=[]),h.filter(x=>!x[Math.min(...h.map(x=>x.length))]))
console.log=x=>O.textContent+=x+'\n'
;[[1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1]
, [3, 3, 3, 4, 4, 4, 4, 5, 5, 4, 4, 3, 3, 4, 4]
, [1, 1, 2, 2, 3, 3, 4]
, [1]
, [1, 1, 10, 10, 10, 100, 100]]
.forEach(t=>console.log(t+' -> '+f(t).join` `))
<pre id=O></pre>
Python 2, 120 bytes
import re
r=[x.group().split()for x in re.finditer(r'(\d+ )\1*',input())]
print[x for x in r if len(x)==min(map(len,r))]
Takes input as a string of space-separated integers with a trailing space, and outputs a list of lists of strings. The strategy is to find groups using the regex (\d+ )\1* (which matches one or more space-separated integers, with a trailing space), then split them on spaces into lists of integers, and print those groups whose length is equal to the minimum group length.
Jelly, 22 17 16 bytes
I0;œṗ¹L=¥ÐfL€Ṃ$$
I0;œṗ¹L=¥ÐfL€Ṃ$$ Main link. List: z = [a,b,c,...]
I Compute [b-a, c-b, d-c, ...]
0; Concatenate 0 in front: [0, b-a, c-b, d-c, ...]
œṗ Split z where the corresponding item in the above array is not zero.
L=¥Ðf Filter sublists whose length equal:
L€Ṃ$ the minimum length throughout the list.
¹ $ (grammar stuffs)
Pyth, 14 12 11
mM_MmhbrQ8
2 bytes thanks to Jakube! And 1 byte thanks to isaacg!
Unfortunately, run length decoding doesn't quite do what we want it to do, but it will work with a minor workaround, but that makes it slightly longer than the manual implementation:
mr]d9.mhbrQ8
Credit to Jakube for finding this out.
MATL, 15 bytes
Y'tX<tb=bw)wTX"
Input is a vector, like [1 2 3 4], and output is a matrix where each column is one of the smallest groups, e.g.:
1 100
1 100
for the third test case.
Explanation:
Y' %// Run length encoding, gives 2 vectors of group-lengths and values
t %// Duplicate group lengths
X< %// Minimum group length
tb %// Duplicate and get vector of group lengths to the top
= %// Find which group lengths are equal to the minimum
bw) %// And get the values of those groups
wTX" %// Repeats the matrix of minimum-length-group values by the minimum group length
Python 2.x, 303 bytes
x=input()
r=[q[2]for q in filter(lambda l:(len(l[2])>0)&((l[0]<1)or(x[l[0]-1]!=x[l[0]]))&((l[1]>len(x)-1)or(x[l[1]]!=x[l[1]-1]))&(len(filter(lambda k:k==l[2][0],l[2]))==len(l[2])),[(a,b,x[a:b])for a in range(0,len(x))for b in range(0,len(x)+1)])]
print filter(lambda k:len(k)==min([len(s)for s in r]),r)
Ugliest. Code. Ever.
Input: An array in the format r'\[(\d,)*(\d,?)?\]'
In other words, a python array of numbers
Output: An array of arrays (the smallest groups), in the order that they appear in the input array
Additional Coincidental Features (Features that I did not intend to make):
- The input can be an empty array; the output will be an empty array.
- By changing
mintomax, it will return an array of the largest groups. - If you just do
print r, it will print all of the groups in order.
Haskell, 38 bytes
import Data.Lists
argmins length.group
Usage example: argmins length.group $ [3,3,3,4,4,4,4,5,5,4,4,3,3,4,4] -> [[4,4],[3,3],[4,4],[5,5]].
Build groups of equal elements and find those with minimal length.
Mathematica, 24 bytes
MinimalBy[Length]@*Split
This is a composition of two functions that can be applied to a list. Split takes all groups of consecutive numbers, and MinimalBy[Length] selects those with minimal length.
