Classificar caracteres inúteis

21

Este desafio é inspirado por esta resposta muito boa do TidB.


Na resposta do TidB, cada oito caracteres está na ordem correta: gnilwoB edoC( Code Bowlingpara trás). As outras strings, porém, estão em uma ordem estranha e aleatória.

Seu desafio é consertar isso.

Pegue uma string (não vazia) e um número inteiro positivo ncomo entrada. A sequência conterá caracteres ASCII no intervalo: 32-126 (espaço para til).

Você deve classificar a sequência em ordem crescente (vista da esquerda, com base no valor do código ASCII), mas pule cada ncaractere, começando no final da sequência. Como exemplo, vamos pegar a string abcdABC123como entrada e n=4, em seguida, obteremos:

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)

Outro exemplo:

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)

A sequência de entrada pode ser obtida em um formato opcional (sequência, lista de caracteres, lista de sequências de caracteres únicas ...). O número inteiro de entrada também pode ser obtido em um formato opcional.

Casos de teste:

O formato será n=__, seguido pela sequência de entrada na próxima linha. A saída está na linha abaixo.

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
Stewie Griffin
fonte

Respostas:

7

MATL , 15 14 bytes

ttfiX\qgP)S5M(

As entradas são uma cadeia de caracteres entre aspas simples e um número. Os símbolos de aspas simples na string devem ser escapados duplicando (como no MATLAB e no Octave).

Experimente online! Ou verifique todos os casos de teste .

Explicação

Considere entradas 'abcdABC123'e 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

Módulo baseado em 1 significa que mod([1 2 3 4 5], 3)dá em [1 2 3 1 2]vez do habitual (baseado em 0) [1 2 0 1 2]. Isso é necessário aqui para lidar com o caso n=1adequadamente.

Luis Mendo
fonte
11
Eu gostaria que 05AB1E tivesse esse último comando ... #
mbomb007 15/03
6

PHP, 101 bytes

índices de string negativos (PHP 7.1) economizam 21 bytes - e possivelmente o dia:

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];

Corra com php -nr '<code>' '<string>' <N>.

demolir

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
    ;
Titus
fonte
porque $i-=1e não $i--?
Jörg Hülsermann 15/03/19
11
@ JörgHülsermann Porque $i--não funciona se $iestiver NULL.
Titus
@ JörgHülsermann ... e --$i, o que eu precisaria também não. ;)
Tito
Eu nunca tentei isso antes. Obrigado pela sua resposta
Jörg Hülsermann 15/03
6

Oitava , 65 54 bytes

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

Experimente online!

Usa indexação lógica para criar uma matriz de caracteres 'fixos' e 'classificados'. Explicação:

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`.

A maneira como eu criei lexige que sseja diferente de zero, o que eu acho que é um requisito razoável, já que muitos idiomas usam \0como delimitador de fim de cadeia.

Sanchises
fonte
Você pode salvar alguns bytes se você ignorar le usar um vetor de números de índice diretamente
Leo
@ Leo, sua sugestão não é mais 8 bytes?
Stewie Griffin
@StewieGriffin gritos, eu não vi a solução atualizados
Leo
5

Python 2, 191 bytes

Sim, tenho certeza que esta é uma solução terrível.

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]

Experimente online

Não vou me incomodar em explicar isso. Tudo bem até eu perceber que ele precisa ser indexado a partir do final. Agora é um monstro. Neste ponto, estou feliz que funcione.

mbomb007
fonte
11
Votado por causa da "explicação". : P
Stewie Griffin
4

JavaScript (ES6), 100 93 bytes

Recebe entrada na sintaxe de 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)

Formatado e comentado

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
)                           //

Casos de teste

Arnauld
fonte
2

Perl 5 , 94 bytes

88 bytes de código + -F -plsinalizadores.

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

Experimente online!

Na minha opinião, é muito longo, mas já não é tão feio ... Ainda estou tentando jogar golfe de qualquer maneira.

dada
fonte
2

Geléia , 14  13 bytes

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

Programa completo que imprime a string para saída STD *.

Experimente online!

Quão?

Ṛ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

Não posso deixar de pensar que existe uma maneira de usar o fato de modificar sua entrada

* para uma função com a qual se deseja achatar a saída em uma única lista F.
Por exemplo, uma entrada de "abcdABC123", 4produz: em
[[['1'],['b']],[['2','A','C'],['B']],[['a','c',',d'],['3']]]
vez de:
['1','b','2','A','C','B','a','c',',d','3']

Jonathan Allan
fonte
1

Python + NumPy , 115 114 bytes

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

Pega uma lista regular de Python como entrada (não tinha certeza se pegar uma matriz seria considerado kosher); retorna uma matriz NumPy contendo o resultado.

Funciona ocultando os índices relevantes e classificando o restante.

Julian Wolf
fonte
1

Python 2, 119 113 bytes

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]

Cria uma lista de todos os caracteres a serem classificados, os classifica e os mescla para impressão, evitando parte da reversão por meio de indexação negativa.

moooeeeep
fonte
11
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]salva 5 bytes
TidB 16/03/19
@ TidB Obrigado, quase eliminou a barra de rolagem! (Aparentemente havia um final de linha envolvido em minha contagem anterior, portanto, parece ser 113 agora em vez de 114.)
moooeeeep
0

Ruby, 64 bytes

Usa regex para capturar todos os caracteres irrelevantes, tanto para substituição quanto para classificação.

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

Experimente online

Value Ink
fonte