箭头那些变量!


29

挑战

罗宾喜欢用箭头来声明变量。他的做法如下:

  • 输入任意数量的字符串
  • 按长度顺序排列
  • 将它们按中间顺序输出,大致形成一个负箭头,如下所示(以顺序最好的一个为佳):

    5  or  4
    3      2
    1      1
    2      3
    4      5
    

测试用例

输入:

bow
arrows
sheriffOfNottingham
kingRichard
maidMarian
princeJohn
sherwoodForest

输出:

sheriffOfNottingham
kingRichard
maidMarian
bow
arrows
princeJohn
sherwoodForest

输入:

a
bb
cc

输出(均有效):

bb
a
cc

cc
a
bb

输入:

one
four
seven
fifteen

可能的输出(唯一有效的输出是其垂直镜像):

seven
one
four
fifteen

笔记

  • 字符串在camelCase中,没有数字或特殊字符,只有小写和大写字母。

  • 输入可以是您喜欢的任何内容:逗号分隔为一个字符串,数组等。允许任何I / O格式。

  • 在相同长度的字符串之间,可以接受任何顺序。

我觉得以前也遇到过类似的挑战...但是欢迎来到PPCG!
Giuseppe

@Giuseppe是的,这就是我发布后的想法,以前从来没有做过。既然您已经回答了,我可以删除它吗?
传送山羊

1
好吧,我一直在寻找骗子,但我的搜索能力不是很好...我们确实有一个沙盒,用于发布挑战,这些挑战通常可以捕获类似的信息。如果您担心它是骗子,可以删除它,我完全可以。
朱塞佩

1
没关系,我们都从头开始:-)
朱塞佩

1
您能否添加一个带有偶数个字符串的测试用例?
Sherlock 9

Answers:


15

Python 2,47个字节

lambda l:l.sort(key=len)or l[1::2][::-1]+l[::2]

在线尝试!


您需要重新排列一些内容,但是您可以[::-2]直接使用它来节省5个字节。
Sherlock 9

@ Sherlock9我尝试过,但是后来我不得不检查长度,因为长度均匀/不均匀的列表必须以不同的方式处理。
ovs

也适用于Python3。是否可以删除“ lambda l:”和“ or”并使其在2行上保存11个字节,因为“允许任何I / O格式”仍然可以接受吗?
土豆

9

R63 48字节

function(L)c(rev(o<-L[order(nchar(L))]),o)[!0:1]

在线尝试!

按字符串长度排序,然后将反向列表与排序列表组合,最后,从基于1的索引1开始,获取每个第二个元素。


1
o<-L[...另一种“箭头变量”。除了次要的,pryr::f(...)这里的价格为46。可以在线尝试!
CriminallyVulgar

@CriminallyVulgar使用其他库会将其转换为一种独立的语言,R + pryr这就是为什么我通常避免这样做,除非有充分的理由-像数论问题一样,numbers是必不可少的。
朱塞佩

7

Javascript 77字节

将输入作为字符串数组,将箭头排序的字符串数组输出。

s=>s.sort((a,b)=>a.length-b.length).reduce((m,x,i)=>i%2?[...m,x]:[x,...m],[])

说明

s =>                                 // take input as an array of strings s
  s.sort((a,b)=>a.length-b.length)   // sort input by string length
  .reduce(                           // reduce
    (m,x,i)=>i%2?[...m,x]:[x,...m],  // if index is even, stick string x at the end of the memo
                                     // array, else at the beginning
    []                               // memo initialized to empty array
  )

1
我认为你不必数数f=77
dana

从我所见,这与js代码中的高尔夫球提交不一致。如果不算在内,我很乐意将其排除。
asgallant

2
我认为这取决于您的函数是否使用递归。即f=x=>x?f(x-1)。如果是这样,则需要包含f它,因为您正在函数中对其进行调用。但是,由于您没有使用递归,因此不必包含f。Meta中有几篇文章,这一篇似乎解释得更好。codegolf.meta.stackexchange.com/a/9032/8340
dana

那可以解释我所看到的不一致之处。
asgallant


5

K(ok),24个字节

解:

x(<#:'x)(|&~w),&w:2!!#x:

在线尝试!

说明:

产生 6 4 2 0 1 3 5序列,使用它来索引输入的递增长度,并使用它来索引原始数组:

x(<#:'x)(|&~w),&w:2!!#x: / the solution
                      x: / save input as x
                     #   / count (#) of x
                    !    / range 0 to ...
                  2!     / modulo 2
                w:       / save as w
               &         / indices where true
              ,          / join with
        (    )           / do this together
           ~w            / not (~) w
          &              / indices where true
         |               / reverse
 (     )                 / do this together
   #:'x                  / count (#:) of each (') x
  <                      / indices to sort ascending
x                        / index into x



5

05AB1E6 5字节

由于节省了1个字节 Kevin Cruijssen

I / O是字符串列表。
修改了链接,以换行符分隔的I / O,以便于测试。

éι`Rì

在线尝试!

说明

é       # sort by length ascending
 ι      # uninterleave into 2 parts, both sorted ascending
   `    # push the 2 parts separately to the stack
    R   # reverse the second part
     ì  # and append it to the first

您可以删除第一个R并替换«i以保存一个字节,因为第三个项目符号规则允许两种版本的解交织。
Kevin Cruijssen

@KevinCruijssen:哦,是的,谢谢!
Emigna

5

J,11个字节

,~`,/@\:#&>

在线尝试!

我们先将其分类。

然后,我们从右到左缩小列表形式,但交替放置新元素在哪一侧。做完了


非常好!不过,您在末尾还有一个空格,请将其删除11个字节:)
Galen Ivanov

1
谢谢盖伦。固定!
约拿

4

PowerShell,66字节

1..($a=$args|sort l*).count|?{$_%2}|%{$a[-$_];$x=,$a[-++$_]+$x};$x

在线尝试!

通过splatting获取输入,该显示在TIO上为单独的命令行参数。 sort上的s l,将其存储到中$a,并构造从输入字符串1到的最大范围count。然后,我们仅取出奇数个,?{$_%2}并将它们送入循环|%{...}。每次迭代时,我们将“ last”放进去,然后将“ last from第三位”放进去,以此类推$a[-$_]。另外,我们还将累积到$x“倒数第二个”,“倒数第四个”等。从循环中取出并冲洗管道(以便输出这些元素),然后输出$x。在这两种情况下,默认输出都会自动为我们提供项目之间的换行符。


4

的PHP144 141字节

function($a){usort($a,function($b,$c){return strlen($b)-strlen($c);});$e=[];foreach($a as$d)(array_.[unshift,push][++$i%2])($e,$d);return$e;}

在线尝试!

-3个字节,感谢@Ismael Miguel


好东西。在哪里可以了解更多信息[array_unshift,array_push][++$i%2]($e,$d)
abhig10

2
@ abhig10当然。这是与两个函数名称的数组['array_push','array_unshift'][++$i%2]作为之间的交替阵列的索引01所以每次将评估对其他功能。PHP的“变量函数”使您可以为函数分配变量,并通过用圆括号(ex:$f='array_push'; $f($e,$d);== array_push($e,$d))调用来执行,因此,($e,$d)然后可以调用数组的计算元素。只是一种较短的方法if (++$i%2) array_push($e,$d); else array_unshift($e,$e);。猜猜毕竟还有一些PHP语法糖!
640KB

好吧,我花了一些时间来理解这一点。太棒了
abhig10

1
替换[array_unshift,array_push][++$i%2]($e,$d)为可以节省3个字节(array_.[unshift,push][++$i%2])($e,$d)。我要做的是删除重复的array_,串联的,然后将结果传递给调用。
Ismael Miguel

1
@IsmaelMiguel太棒了。谢谢!
640KB

4

MATLAB,87字节

function f(y);[B,I]=sort(cellfun(@(x)length(x),y));{y{flip(I(1:2:end))},y{I(2:2:end)}}'

将输入作为字符串的单元格数组,输出字符串列(不确定这是否合法)

> s = {'qweq qwe qw','qweqw','12132132131231231','asdasdasda','qwe','w'};
> f(s)
> >> 
> ans =
> 
>   6×1 cell array
> 
>     {'qweq qwe qw'      }
>     {'qweqw'            }
>     {'qwe'              }
>     {'1234'             }
>     {'asdasdasda'       }
>     {'12132132131231231'}

PS:感谢Sanchises指出带有奇数长度输入的错误


这在输入字符串为奇数时失败,例如f({'loooooooong','medium','short'})
Sanchises

还有一些一般的打高尔夫球技巧:end是的可选function。使用function x=f(y);x={...}'比短function f(y);disp({...}')
桑契斯


@Sanchises感谢您指出错误。我确实像您一样修复了它。我的问题disp是我不确定输出规则是什么。应该是纯文字吗?还是disp({...})可以的,甚至x={...}按照您的建议
aaaaa说要恢复莫妮卡

1
八度中可以是58个字节
朱塞佩

3

APL(Dyalog Unicode),18 字节SBCS

{⍵[⍋-@(2∘|)⍋⍋≢¨⍵]}

在线尝试!

修复了由于@ngn而导致的错误。

说明:

{⍵[⍋-@(2∘|)⍋⍋≢¨⍵]}
{                }  Function. Takes a single argument: ⍵, list of strings
             ≢¨⍵    The length of each element in the list
           ⍋⍋       Sort the lengths
    -@(2∘|)         At (@) elements divisible by 2 (|), negate (-)
                        gives -1 2 -3 4 -5
                   Sort this list again, gives the indices of that list ^ sorted
 ⍵[             ]   Use these indices to index into the argument

¹


1
≢¨×¯1*⍳∘⍴-> (⊢∘-\≢¨)如果将其转换为dfn,它会变得更短
ngn

1
但是,我不确定该算法是否正确。我们应该按其排序顺序取反其他所有字符串的长度,而不要按它们来自输入的顺序取反
ngn

2

APL + WIN,31 38字节

见亚当斯评论

⊃n[(⍳⍴n)~a],⌽n[a←2×⍳⌊.5×⍴n←n[⍒∊⍴¨n←⎕]]

在线试用Dyalog Classic!

提示输入字符串的嵌套向量


APL +是否没有替代Monadic的“理货” ∊⍴
亚当

1
失败'12' '1234' '1234' '1234' '1234' '12345678' '12345678' '12345678' '12345678'。显然,其结果应该是'12345678' '12345678' '1234' '1234' '12' '1234' '1234' '12345678' '12345678'
亚当

@Adám我的古代APL +版本没有≢。同意您的第二条评论,我明天再看。
格雷厄姆

2

视网膜,26字节

N$`
$.&
*\,2,^A`.+
,2,G`.+

在线尝试!说明:

N$`
$.&

以长度的升序对行进行排序($.&返回行的长度)。

*\,2,^A`.+

临时删除备用行并以相反顺序输出其余行。

,2,G`.+

保留仅被临时删除的行并输出。


2

盖亚 10字节

el∫v:v+2%ụ

在线尝试!

e		| eval as Gaia code (list of strings)
 l∫		| ∫ort by lengths (ascending)
   v:v		| reverse, dup, reverse
      +		| concatenate lists
       2%	| take every other element
         ụ	| join by newlines and output

4
我喜欢您在解开代码中的注释形成了一个字符串箭头
aaaaa说,恢复莫妮卡



2

T-SQL,84个字节

输入是一个表变量

SELECT a FROM(SELECT*,row_number()over(order by len(a))r
FROM @)x order by(r%2-.5)*r

在线尝试



1

Javascript 95字节

s=>s.sort((x,y)=>x.length-y.length).reduce((a,e,i)=>{i%2?a.push(e):a.unshift(e);return a;},[]);

-1 s.sort()按字典顺序对字符串排序,而不是按字符串长度排序。
asgallant

正确,(x,y)=> x.length-y.length可以解决此问题。
somsom



1

C(gcc)136128字节

S(a,b)int**a,**b;{a=strlen(*b)-strlen(*a);}f(l,s,o,i,b,e)int**s,**o;{qsort(s,l,8,S);e=l-1;for(i=b=0;i-l;)o[i++%2?b++:e--]=s[i];}

在线尝试!

-8字节,感谢ceilingcat。

The function f is the solution. It takes the number of strings, the strings themselves, and the output buffer as arguments (plus four more used internally).


Why is ./.bin.tio in the output?
Teleporting Goat

@TeleportingGoat Probably because their footer is using all of argv, which includes the filename
Jo King

Exactly, it was just a quick test. One can construct any data that takes appropriate format. I'll update the TIO link later.
LambdaBeta

haha, the problem with these short variable names: you forget what you hat t for in the first place and keep it around even when you don't need it!
LambdaBeta


0

Japt, 8 bytes

Input as an array of lines, output as an array of 2 arrays of lines, one for each half of the list.

ñÊó
hUÎÔ

Try it (Additional code to allow for I/O as newline separated string)

ñÊó      :Implicit input of array U
ñ        :Sort by
 Ê       :  Length
  ó      :Uninterleave

hUÎÔ     :Newline reassigns to U
h        :Set the first element in U to
 UÎ      :  The first element in U
   Ô     :  Reversed

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.