排序无用字符


21

TidB给出的非常好的答案激发了这一挑战。


在TidB的答案,每八个字符是正确的顺序:gnilwoB edoCCode Bowling向后)。但是,其他字符串的排列顺序却奇怪的,随机的。

您的挑战是解决此问题。

以一个(非空)字符串和一个正整数n作为输入。该字符串将包含范围为32-126(空格到波浪号)的ASCII字符。

您必须按升序对字符串进行排序(根据ASCII码值从左看),但是n从字符串的末尾开始跳过每个字符。例如,让我们以字符串abcdABC123作为输入,然后n=4,我们将得到:

abcdABC123   <- Input string. (n=4)
_b___B___3   <- These will not be sorted (every 4th starting from the end)
1_2AC_acd_   <- The remaining characters, sorted
1b2ACBacd3   <- The final string (the output)

另一个例子:

9876543210   <- Input string (n=2)
_8_6_4_2_0   <- These will not be sorted
1_3_5_7_9_   <- The remaining characters, sorted
1836547290   <- The final string (the output)

输入字符串可以采用可选格式(字符串,字符列表,单个字符串列表...)。输入整数也可以采用可选格式。

测试用例:

格式为n=__,然后在下一行输入字符串。输出在下面的行中。

n=1   (All elements will stay in place)
nafgaksa1252#"%#
nafgaksa1252#"%#    

n=214  (The last character will stay in place. All other are sorted. 
&/lpfAVD
&/AVflpD  

n=8
g7L9T E^n I{><#ki XSj!uhl y= N+|wA}Y~Gm&o?'cZPD2Ba,RFJs% V5U.W;1e  0_zM/d$bH`@vKoQ 43Oq*C
g       n !#$%&'i*+,./01l234579;w<=>?@ADoEFGHIJKBLMNOPQR STUVWXYeZ^_`abcdhjkmqsuovyz{|}~C

Answers:


7

MATL15 14字节

ttfiX\qgP)S5M(

输入是用单引号和数字括起来的字符串。字符串中的单引号符号应通过复制进行转义(例如在MATLAB和Octave中)。

在线尝试!验证所有测试用例

说明

考虑输入'abcdABC123'4

tt     % Implicitly input string. Duplicate twice
       % STACK: 'abcdABC123', 'abcdABC123', 'abcdABC123'
f      % Find: indices of nonzero elements: gives [1 2 ... n] where n is input length
       % STACK: 'abcdABC123', 'abcdABC123', [1 2 3 4 5 6 7 8 9 10]
i      % Input n
       % STACK: 'abcdABC123', 'abcdABC123', [1 2 3 4 5 6 7 8 9 10], 4
X\     % 1-based modulo
       % STACK: 'abcdABC123', 'abcdABC123', [1 2 3 4 1 2 3 4 1 2 3 4]
qg     % Subtract 1, convert to logical: gives true (1) for 1, false (0) otherwise
       % STACK: 'abcdABC123', 'abcdABC123', [0 1 1 1 0 1 1 1 0 1]
P      % Flip
       % STACK: 'abcdABC123', 'abcdABC123', [1 0 1 1 1 0 1 1 1 0]
)      % Use as logical index into the string
       % STACK: 'abcdABC123', 'acdAC12'
S      % Sort
       % STACK: 'abcdABC123', '12ACacd'
5M     % Push logical index again
       % STACK: 'abcdABC123', '12ACacd', [1 0 1 1 1 0 1 1 1 0]
(      % Write into original string as specified by the index. Implicitly display
       % STACK: 1b2ACBacd3

基于1的取模意味着mod([1 2 3 4 5], 3)给出[1 2 3 1 2]而不是通常的(基于0)[1 2 0 1 2]。为了n=1充分处理案件,这里需要这样做。


1
我希望05AB1E拥有最后一条命令...
mbomb007 '17

6

PHP,101字节

负字符串索引(PHP 7.1)节省21个字节-可能还有一天:

for([,$s,$n]=$argv;a&$c=$s[$i-=1];)$i%$n+1?$a[]=$c:0;for(sort($a);++$i;)echo$i%$n+1?$a[+$k++]:$s[$i];

用运行php -nr '<code>' '<string>' <N>

分解

for([,$s,$n]=$argv;     # import command line arguments to $s and $n
    a&$c=$s[$i-=1];)    # loop backward through string
    $i%$n+1?$a[]=$c:0;      # if index is not n-th, copy character to array
for(sort($a);           # sort array
    ++$i;)              # loop forward through string:
    echo$i%$n+1             # if index is not n-th
        ?$a[+$k++]              # print character from array
        :$s[$i]                 # else print character from string
    ;

为什么$i-=1和不$i--
约尔格Hülsermann

1
@JörgHülsermann $i--如果$i是的话,那是行不通的NULL
泰特斯

@JörgHülsermann...和--$i,我不需要。;)
Titus

我以前从未尝试过。感谢您的答案
约尔格Hülsermann

6

八度65 54字节

function s=f(s,n)
l=~~s;l(end:-n:1)=0;s(l)=sort(s(l));

在线尝试!

使用逻辑索引来创建“固定”和“排序”字符的数组。说明:

function s=f(s,n) % Create a function, taking a string `s` and the number `n`; the output is also named `s`.
l=~~s;             % Create logical array with the same size of the input string 
                  %    [equivalent to much more verbose true(size(s))].
l(end:-n:1)=0;    % Set the 'fixed' character positions. MATLAB/Octave automatically produces
                  %    the correct result even if n is larger than the string length.
s(l)=sort(s(l)) % Select the elements from `s` where `l` is true. Sort, and store in the corresponding positions in `s`.

我创建的方式l要求s非零,我认为这是一个合理的要求,因为许多语言都将其\0用作字符串结尾定界符。


如果您绕过l并直接使用索引号向量,则可以节省一些字节
Leo


@Leo,您的建议长8个字节吗?
Stewie Griffin

@StewieGriffin糟糕,我没有看到更新的解决方案
Leo

5

Python 2,191字节

是的,我确定这是一个糟糕的解决方案。

n,s=input()
s=s[::-1]
R=range(len(s)/n+1)
J=''.join
k=s[::n]
t=J(sorted(J(s[i*n+1:i*n+n]for i in R)))
n-=1
print J(j[::-1]for i in zip(k,[t[::-1][i*n:i*n+n][::-1]for i in R])for j in i)[::-1]

在线尝试

我不会去解释它。没事,直到我意识到它需要从头开始索引。现在,它是一个怪物。在这一点上,我很高兴它能起作用。


1
因“解释”而被投票。:P
Stewie Griffin's

4

JavaScript(ES6),100 93字节

以currying语法接受输入(s)(n)

s=>n=>s.replace(/./g,(c,i)=>(F=_=>(s.length-++i)%n)()?[...s].filter(F,i=0).sort()[j++]:c,j=0)

格式化和评论

s => n => s.replace(        // given a string s and an integer n
  /./g,                     // for each character c of s
  (c, i) => (               // at position i:
    F = _ =>                //   F = function that tests whether the
      (s.length - ++i) % n  //       character at position i is non-static
  )()                       //   call F() on the current position
  ?                         //   if the current character is non-static:
    [...s].filter(F, i = 0) //     get the list of non-static characters
      F, i = 0              //     by filtering all characters in s with F()
    )                       //
    .sort()[j++]            //     sort them and pick the next occurrence
  :                         //   else:
    c,                      //     let c unchanged
  j = 0                     //   initialize j = non-static character pointer
)                           //

测试用例


2

Perl 5,94个字节

88个字节的代码+ -F -pl标志。

$_=join"",(map{(--$i%$n?"":$F[$#F-$i--]),$_}sort grep$i++%$n,reverse@F),chop if($n=<>)>1

在线尝试!

在我看来,这太长了,但还不算很丑。无论如何,我仍在尝试进一步打高尔夫球。


2

果冻14  13 字节

FṢṁ
ṚsṚµḢ€ż@Ç

将字符串输出到STD的完整程序*。

在线尝试!

怎么样?

ṚsṚµḢ€ż@Ç - Main link: string s, non-negative number n
Ṛ         - reverse s
 s        - split into chunks of size n
  Ṛ       - reverse the resulting list
   µ      - monadic chain separation (call that list x)
    Ḣ€    - head €ach - yield a list of the first entries of each of x and modify x
        Ç - call the last link (1) as a monad - get the sorted and re-split list
      ż@  - zip together (with reversed @rguments)

FṢṁ - link 1, sort and reshape like self: list of lists
F   - flatten into a single list
 Ṣ  - sort
  ṁ - mould the result like the input

我忍不住想出一种方法来使用修改其输入的事实

*对于一个函数,可能想用来将输出展平为一个列表F
例如的输入"abcdABC123"4产率:
[[['1'],['b']],[['2','A','C'],['B']],[['a','c',',d'],['3']]]
而不是:
['1','b','2','A','C','B','a','c',',d','3']


1

+ NumPy的115个 114字节

from numpy import *
def f(x,n):l=len(x);x=array(x);m=[1<2]*l;m[-1::-n]=[1>2]*len(m[0::n]);x[m]=sort(x[m]);return x

将常规的Python列表作为输入(不确定是否将数组视为原始);返回包含结果的NumPy数组。

通过掩盖相关索引并对其余索引进行排序来工作。


1

Python 2中,119个 113字节

n,l=input()
i=range(len(l))
print"".join(sorted(l[~a]for a in i if a%n)[-a+a/n]if a%n else l[~a]for a in i)[::-1]

建立所有要排序的字符的列表,对它们进行排序并合并以打印,同时避免通过负索引进行某些反转。


1
print"".join(sorted(l[~a]for a in i if a%n)[-a+a/n]if a%n else l[~a]for a in i)[::-1]保存5个字节
TidB

@TidB谢谢,几乎消除了滚动条!(据我先前的统计,大概有一个尾随的换行符,因此现在似乎是113,而不是114。)
moooeeeep

0

Ruby,64个字节

使用正则表达式获取所有不相关的字符,以进行替换和排序。

->i,s,j=-1{s.gsub(r=/.(?!(?=.{#{i}})*$)/){s.scan(r).sort[j+=1]}}

在线尝试

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.