\begingroup

给定一个有限序列,其每个元素都有第一次出现。您的任务是输出序列中第一次出现次数最少的符号。如果元素代表一段时间内的 meme 帖子和转发,我们希望看到最新的meme!

例子

输入: A-BANAL-BANANA-LAB

  • A首次出现在位置 0(出现在位置 0,3,5,9,11,13,16)
  • -首次出现在位置 1
  • B首次出现在位置 2
  • N首次出现在位置 4
  • L首次出现在位置 6

max(0,1,2,4,6) = 6,所以

输出: L

输入/输出格式

您可以假设输入序列非空,并且是可打印的非空白 ASCII 字符的字符串或任何合理形式的非负整数列表(您选择)。您将输出输入序列的一个元素。

而且当然

这是,因此每种语言中最短的解决方案获胜。

\endgroup

1

  • 1
    \begingroup
    我投了反对票,因为这个问题的简单解决方案几乎与从列表中删除重复项的任务相同,这已经是此网站上的任务了。(并不是说这是唯一的方法,但它是最简单且通常是最短的方法。)
    \endgroup


    – 



26 个解决方案
26

\begingroup

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

\begingroup

,26 字节

lambda s:max(s,key=s.find)

以字符串作为输入。输出字符出现的s.find(c)第一个索引,因此用作返回在中第一次出现的字符scs.findmaxs

\endgroup

\begingroup

,2 个字节

⊇∪

最后一个唯一

\endgroup

\begingroup

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


    – 

\begingroup

,57 字节

k;f(char*s){for(int v[128]={};*s;s++)k=v[*s]++?k:*s;k=k;}

\endgroup

\begingroup

,2字节

Ut

 t # last
U  # unique element

\endgroup

1

  • \begingroup
    当问题被浏览 1 次时回答 😀
    \endgroup


    – 

\begingroup

,3字节

⊢⇌◴

⊢⇌◴­⁡​‎‎⁡⁠⁣‏‏​⁡⁠⁡‌⁢​‎‎⁡⁠⁡‏⁠‎⁡⁠⁢‏‏​⁡⁠⁡‌­
  ◴  # ‎⁡deduplicate
⊢⇌   # ‎⁢last

\endgroup

\begingroup

,27 个字节

($args|% *ay|select -u)[-1]

未打高尔夫:

($args | ForEach-Object -Member ToCharArray | Select-Object -Unique)[-1]

通过调用字符串的成员“ToCharArray”,将输入字符串转换为字符数组,然后仅选择唯一的字符并挑选最后一个字符。

\endgroup

\begingroup

字节

D`.
!`.$

以字符串形式输入。说明:

D`.

仅保留每个重复字符的第一个字符。

!`.$

保留最后剩下的字符。

\endgroup

\begingroup

+ ,5 个字节

gj<nb

解释

Nub 并获取最后一个元素。

解析器,16字节

gk$(h'>~nxy)<*h'

由于使用普通库来完成这个挑战非常简单,所以我想尝试仅使用解析器的版本。

解释

我们创建一个解析器,它可以匹配所有前面没有其自身副本的字符。

  • h':获取一些前缀。
  • nxy:解析前缀中不存在的字符。
  • h':解析一些字符。
  • gk:获取最高优先级的解析。

这里的优先级是由h'最长的解析具有最高优先级来确定的。

反射

常规版本无法进行合理的改进。可以基于解析器版本进行改进,但它永远无法与此任务的其他版本相提并论。

  • gk获取第一个完整的解析。应该有一个解析器消费者只获取第一个解析。这将使<*h'此操作变得不必要,并节省大量字节。
  • (h'*>)并且可能可以使用快捷方式。我(<*h')使用前者。这将被上面的改进所取代,但从长远来看可能会有用。
  • 我使用(h'>~)这里和以及非常相似的(h_>~) (后者现在已被取代(h_<~))。这里有某种常见的模式,似乎可能会继续出现。我应该为这些变体设置快捷方式。

我还注意到有些事情在这里不会节省字节但应该做。

  • 并且nxy可以使用预先用my和组合的版本so

\endgroup

\begingroup

,2 个字节

dt

,2字节

ul

更多无聊平庸的小尾部解决方案。

\endgroup

\begingroup

Vyxal 3,2 字节

ut

  • t最后
  • u独特元素
  • 输入

\endgroup

\begingroup

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


    – 


\begingroup

,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

\begingroup

,3个字节

uJ)

解释

     % Implicitly fetch input
u    % Find unique elements 
J)   % Get the last element
     % Print implicitly 

\endgroup

\begingroup

Excel ms365,22 字节

=@TAKE(UNIQUE(A:A),-2)

\endgroup

\begingroup

v2.0a0,1字节

â

\endgroup

\begingroup

58 45 38 字节

s=>[...s].map(a=e=>a[e]?0:a[e]=b=e)&&b

\endgroup

1

  • 1
    \begingroup
    您可以使用回调函数作为您的对象()。
    \endgroup


    – 


\begingroup

,65字节

gniomh(s){le i idir(fad@s-1,-1)ma i<=aimsigh@s(s[i]) toradh s[i]}

\endgroup

\begingroup

-MList::Util=uniq -pF 5,15 字节

$_=(uniq@F)[-1]

\endgroup

\begingroup

,15字节

$=>[last∪<=&]

解释

$=>[]  ; a function where input is assigned to &
last   ; last element of...
∪      ; union between...
<=&    ; input and itself              

这比 短两个字节last unique&,但需要 的最新版本,因此它还不能在线工作。

\endgroup

\begingroup

,4字节

最后一个*|独特?元素。

*|?:

\endgroup

\begingroup

,2

QṪ

接受列表并产生最新元素的单子链接。

如何?

QṪ - Link: list, A
Q  - deduplicate {A}
 Ṫ - tail {that}

\endgroup

\begingroup

字节

\(x)tail(unique(x),1)

将 utf-8 代码点向量作为输入。其实并不花哨,基本上只是(以及其他几个答案)的一个移植。

虽然 Rbase::unique()没有文档说明如何保证插入顺序,但会保证。它会按顺序循环遍历向量的每个值,并检查它是否之前出现过,并将任何之前没有出现过的值附加到新向量中。虽然我认为这个实现可能不会永远存在,但它将在 R 4.4.0 中工作。此外,git 表明这已成为 R 源代码的一部分 26 年了 – 我不认为它会在未来版本中轻易改变。

\endgroup

\begingroup

+ -0513pF,22 字节

-3 字节感谢

$\=chop;/${\}/&&redo}{

\endgroup

2

  • \begingroup
    稍微短一点,并且不使用像我发布的答案那样的附加模块:
    \endgroup


    – 

  • \begingroup
    哦,太棒了,谢谢!你的解决方案也非常聪明,太棒了 – +1!
    \endgroup


    – 

\begingroup

Java 21,35 字节

s->new LinkedHashSet<>().getLast()

Function<List<T>, T>对于某些人来说是A。需要 Java 21,但在“在线试用”“在线尝试”T上似乎尚未提供

\endgroup