给定一个有限序列,其每个元素都有第一次出现。您的任务是输出序列中第一次出现次数最少的符号。如果元素代表一段时间内的 meme 帖子和转发,我们希望看到最新的meme!
例子
输入: A-BANAL-BANANA-LAB
A
首次出现在位置 0(出现在位置 0,3,5,9,11,13,16)-
首次出现在位置 1B
首次出现在位置 2N
首次出现在位置 4L
首次出现在位置 6
max(0,1,2,4,6) = 6,所以
输出: L
输入/输出格式
您可以假设输入序列非空,并且是可打印的非空白 ASCII 字符的字符串或任何合理形式的非负整数列表(您选择)。您将输出输入序列的一个元素。
而且当然
这是,因此每种语言中最短的解决方案获胜。
\endgroup
1
26 个解决方案
26
JavaScript(ES6),24 字节
请注意,它之所以有效是因为Set
它保证维持其元素的插入顺序。
s=>[...new Set(s)].pop()
评论
s => // s = input string
[... // turn into an array ...
new Set(s) // ... the set generated from s
// e.g. "BANANA" -> Set {'B','A','N'}
] //
.pop() // return the last element
\endgroup
|
,26 字节
lambda s:max(s,key=s.find)
以字符串作为输入。输出字符出现的s.find(c)
第一个索引,因此用作键返回在中第一次出现的字符。s
c
s.find
max
s
\endgroup
|
,2 个字节
⊇∪
⊇
最后∪
一个唯一
\endgroup
|
Google 表格,36 字节
=chooserows(unique(tocol(A:A,1)),-1)
64字节:
=+let(β,A:A,γ,sort(row(β)),sort(β,1=countifs(β,β,γ,"<="&γ),,γ,))
…或者:
=chooserows(filter(A:A,1=map(A:A,lambda(β,countif(A1:β,β)))),-1)
将数组放在列中A1:A
,将公式放在单元格中B1
。
\endgroup
3
-
\begingroup
对于 35,你可以使用 明确说明元素范围=INDEX(A:A,MAX(XMATCH(A1:A17,A:A)))
,如果我们假设不会有无限的字符串,那么对于 27=CHOOSEROWS(UNIQUE(A:A),-2)
\endgroup
–
-
\begingroup
@JvdV 是的…但我不想对范围进行硬编码,也不假设数据永远不会填满整个工作表直到最后一行。
\endgroup
– -
\begingroup
是的,你这样肯定会感觉更好。👍
\endgroup
–
|
,57 字节
k;f(char*s){for(int v[128]={};*s;s++)k=v[*s]++?k:*s;k=k;}
\endgroup
|
,2字节
Ut
t # last
U # unique element
\endgroup
1
-
\begingroup
当问题被浏览 1 次时回答 😀
\endgroup
–
|
,3字节
⊢⇌◴
⊢⇌◴
◴ # deduplicate
⊢⇌ # last
\endgroup
|
,27 个字节
($args|% *ay|select -u)[-1]
未打高尔夫:
($args | ForEach-Object -Member ToCharArray | Select-Object -Unique)[-1]
通过调用字符串的成员“ToCharArray”,将输入字符串转换为字符数组,然后仅选择唯一的字符并挑选最后一个字符。
\endgroup
|
字节
D`.
!`.$
以字符串形式输入。说明:
D`.
仅保留每个重复字符的第一个字符。
!`.$
保留最后剩下的字符。
\endgroup
|
+ ,5 个字节
gj<nb
解释
Nub 并获取最后一个元素。
解析器,16字节
gk$(h'>~nxy)<*h'
由于使用普通库来完成这个挑战非常简单,所以我想尝试仅使用解析器的版本。
解释
我们创建一个解析器,它可以匹配所有前面没有其自身副本的字符。
h'
:获取一些前缀。nxy
:解析前缀中不存在的字符。h'
:解析一些字符。gk
:获取最高优先级的解析。
这里的优先级是由h'
最长的解析具有最高优先级来确定的。
反射
常规版本无法进行合理的改进。可以基于解析器版本进行改进,但它永远无法与此任务的其他版本相提并论。
gk
获取第一个完整的解析。应该有一个解析器消费者只获取第一个解析。这将使<*h'
此操作变得不必要,并节省大量字节。(h'*>)
并且可能可以使用快捷方式。我(<*h')
使用前者。这将被上面的改进所取代,但从长远来看可能会有用。- 我使用
(h'>~)
这里和以及非常相似的(h_>~)
和(后者现在已被取代(h_<~)
)。这里有某种常见的模式,似乎可能会继续出现。我应该为这些变体设置快捷方式。
我还注意到有些事情在这里不会节省字节但应该做。
nχ
并且nxy
可以使用预先用my
和组合的版本so
。
\endgroup
|
,2 个字节
dt
,2字节
ul
更多无聊平庸的小尾部解决方案。
\endgroup
|
Vyxal 3,2 字节
ut
t
最后u
独特元素- 输入
\endgroup
|
3,36 字节
f=lambda x:list({a:0for a in x})[-1]
\endgroup
1
-
5\begingroup
这里不需要,f=
因为它不是递归的。使用列表展开保存三个(list(...)
->[*...]
),另一个由与自身配对的元素序列形成字典({a:0for a in x}
->{a:a for a in x}
->dict(zip(x,x))
) –
\endgroup
–
|
,8字节
§θ⌈Eθ⌕θι
链接是代码的详细版本。说明:结果是 @xnor 答案的移植版。
θ Input string
E Map over characters
⌕ Index of
ι Current character
θ In input string
⌈ Take the maximum
§ Index into
θ Input string
Implicitly print
\endgroup
|
,3个字节
uJ)
解释
% Implicitly fetch input
u % Find unique elements
J) % Get the last element
% Print implicitly
\endgroup
|
Excel ms365,22 字节
=@TAKE(UNIQUE(A:A),-2)
\endgroup
|
v2.0a0,1字节
â
\endgroup
|
,58 45 38 字节
s=>[...s].map(a=e=>a[e]?0:a[e]=b=e)&&b
\endgroup
1
-
1\begingroup
您可以使用回调函数作为您的对象()。
\endgroup
–
|
,65字节
gniomh(s){le i idir(fad@s-1,-1)ma i<=aimsigh@s(s[i]) toradh s[i]}
\endgroup
|
-MList::Util=uniq -pF
5,15 字节
$_=(uniq@F)[-1]
\endgroup
|
,15字节
$=>[last∪<=&]
解释
$=>[] ; a function where input is assigned to &
last ; last element of...
∪ ; union between...
<=& ; input and itself
这比 短两个字节last unique&
,但需要 的最新版本∪
,因此它还不能在线工作。
\endgroup
|
,4字节
最后一个*|
独特?
元素。
*|?:
\endgroup
|
,2
QṪ
接受列表并产生最新元素的单子链接。
如何?
QṪ - Link: list, A
Q - deduplicate {A}
Ṫ - tail {that}
\endgroup
|
字节
\(x)tail(unique(x),1)
将 utf-8 代码点向量作为输入。其实并不花哨,基本上只是(以及其他几个答案)的一个移植。
虽然 Rbase::unique()
没有文档说明如何保证插入顺序,但会保证。它会按顺序循环遍历向量的每个值,并检查它是否之前出现过,并将任何之前没有出现过的值附加到新向量中。虽然我认为这个实现可能不会永远存在,但它将在 R 4.4.0 中工作。此外,git 表明这已成为 R 源代码的一部分 26 年了 – 我不认为它会在未来版本中轻易改变。
\endgroup
|
+ -0513pF
,22 字节
-3 字节感谢!
$\=chop;/${\}/&&redo}{
\endgroup
2
-
\begingroup
稍微短一点,并且不使用像我发布的答案那样的附加模块:
\endgroup
– -
\begingroup
哦,太棒了,谢谢!你的解决方案也非常聪明,太棒了 – +1!
\endgroup
–
|
Java 21,35 字节
s->new LinkedHashSet<>().getLast()
Function<List<T>, T>
对于某些人来说是A。需要 Java 21,但在“在线试用”或“在线尝试”T
上似乎尚未提供。
\endgroup
|
我投了反对票,因为这个问题的简单解决方案几乎与从列表中删除重复项的任务相同,这已经是此网站上的任务了。(并不是说这是唯一的方法,但它是最简单且通常是最短的方法。)
\endgroup
–
|