Posição girada de números inteiros

20

Desafio:

Entrada:

Uma lista classificada de números inteiros positivos.

Saída:

A quantidade de números inteiros que ainda estão exatamente no mesmo índice, depois de girar os dígitos em cada número inteiro, seu índice de vezes para a esquerda e classificar a lista modificada novamente.

Exemplo:

Entrada: [8,49,73,102,259,762,2782,3383,9217,37846,89487,7471788]
Saída (indexação baseada em 0): 6
Saída (indexação baseada em 1):5

Por quê?

Indexação baseada em 0:

After rotating each: [8,94,73,102,592,276,8227,3338,9217,63784,89487,7887471]
Sorted again:        [8,73,94,102,276,592,3338,8227,9217,63784,89487,7887471]

Input indices:        0  1  2   3   4   5    6    7    8     9    10      11
Original input-list: [8,49,73,102,259,762,2782,3383,9217,37846,89487,7471788]
Modified list:       [8,73,94,102,276,592,3338,8227,9217,63784,89487,7887471]
Modified indices:     0  2  1   3   5   4    7    6    8     9    10      11
Equal indices:        ^         ^                      ^     ^     ^       ^

So the output is: 6

Indexação baseada em 1:

After rotating each: [8,49,37,021,925,762,2278,3383,2179,37846,94878,8874717]
Sorted again:        [8,(0)21,37,49,762,925,2179,2278,3383,37846,94878,8874717]

Input indices:        1  2  3   4   5   6    7    8    9    10    11      12
Original input-list: [8,49,73,102,259,762,2782,3383,9217,37846,89487,7471788]
Modified list:       [8,21,37,49,762,925,2179,2278,3383,37846,94878,8874717]
Modified indices:     1  4  3  2   6   5    9    7    8    10    11      12
Equal indices:        ^     ^                               ^     ^       ^

So the output is: 5

Regras do desafio:

  • A lista de entrada é garantida para conter apenas números inteiros positivos.
  • A lista de entrada é garantida para ser classificada do menor para o maior.
  • A lista de entrada é garantida para conter pelo menos dois itens.
  • Como você pode ver acima, a indexação com base em 0 e em 1 é permitida. Indique em sua resposta qual dos dois você usou, pois os resultados podem diferir de acordo!
  • Os 0s iniciais após a rotação são ignorados, o que pode ser visto no exemplo com base em 1 acima, onde o número inteiro 102se torna 021após a rotação e é tratado como 21.
  • Os números inteiros são garantidos exclusivos na lista de entrada e permanecem únicos após a conclusão das rotações.
  • Observe que apenas observamos as posições dos números inteiros rotacionados em correlação com as posições da entrada, e não com os valores da lista de entradas. Para esclarecer o que quero dizer com isso: com a lista de entrada [1234,3412]e a indexação baseada em 1, a lista torna-se [2341,1234]após a rotação de cada número inteiro, a quantidade de vezes que é o índice e, em seguida, quando a classificação se torna [1234,2341]. Embora a lista de entrada original e a lista girada contenham o número inteiro 1234na posição inicial, elas não são as mesmas! O rodado 1234foi 3412antes. A saída indexada em 1 para esta lista de entrada é 0, portanto , uma vez que os dois números inteiros trocaram suas posições.
  • A entrada é flexível. Pode ser uma lista / fluxo / array de números inteiros / strings / matrizes de dígitos, etc. Por favor, indique o que você usou se não aceitar as entradas como números inteiros.

Regras gerais:

  • Isso é , então a resposta mais curta em bytes vence.
    Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação.
  • As regras padrão se aplicam à sua resposta com as regras de E / S padrão , para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
  • As brechas padrão são proibidas.
  • Se possível, adicione um link com um teste para o seu código (ou seja, TIO ).
  • Além disso, é altamente recomendável adicionar uma explicação para sua resposta.

Casos de teste:

Input: [8, 49, 73, 102, 259, 762, 2782, 3383, 9217, 37846, 89487, 7471788]
0-based output: 6
1-based output: 5

Input: [1234, 3412]
0-based output: 2
1-based output: 0

Input: [2349, 2820, 17499, 21244, 29842, 31857, 46645, 56675, 61643, 61787]
0-based output: 3
1-based output: 0

Input: [4976, 11087, 18732, 22643, 52735]
0-based output: 2
1-based output: 3

Input: [4414, 5866, 7175, 8929, 14048, 16228, 16809, 19166, 24408, 25220, 29333, 44274, 47275, 47518, 53355]
0-based output: 4
1-based output: 4

Input: [11205, 16820, 63494]
0-based output: 1
1-based output: 3

Sinta-se à vontade para gerar mais casos de teste aleatórios com (ou inspirar-se) neste programa 05AB1E não usado , em que a entrada é do tamanho da lista aleatória (NOTA: a saída deste gerador pode não estar em conformidade com a regra "Os números inteiros são garantidos exclusivamente em a lista de entrada e é garantido que permaneça único após a conclusão das rotações ", lembre-se disso ao usá-lo.)

Kevin Cruijssen
fonte
Podemos assumir que a entrada possui pelo menos 2 elementos?
Robin Ryder
2
@RobinRyder Hmm, meu primeiro pensamento seria não, mas como não tenho casos de teste com itens únicos e isso não adicionará muito ao desafio, por que não? Vou adicionar uma regra que garante que a lista de entrada contenha pelo menos 2 itens.
Kevin Cruijssen
Podemos aceitar entrada como uma lista de strings?
Modalidade de ignorância
1
@ Shaygy Eu notifiquei as respostas que eu pensava que se beneficiariam com isso. Se você vir algum que também possa se beneficiar, sinta-se à vontade para notificá-lo também.
Kevin Cruijssen
1
Pelo exemplo, parece que a saída deve ser "A quantidade de números inteiros que ainda estão exatamente no mesmo índice, depois de girar os dígitos em cada número inteiro sua quantidade de índice de vezes para a esquerda e classificar a matriz novamente "?
qwr

Respostas:

11

R , 114 107 bytes

-5 bytes graças a Giuseppe.

Superado por digEmAll.

function(l){for(j in seq(l))l[j]=rep(l[j]%/%(e=10^(b=nchar(l[j]):1-1))%%10,j+1)[j+0:b]%*%e
sum(sort(l)==l)}

Experimente online!

Indexado a 0.

Versão não destruída:

function(l) {
  n = length(l)                         # size of input
  for (j in 1:n) {  
    b = nchar(l[j]) -1                  # number of digits in l[j] -1
    e = 10 ^ (b:0) 
    d = l[j] %/% e %% 10                # convert to vector of digits
    l[j] = rep(d, j + 1)[j + 0:b] %*% e # rotate digits and convert back to an integer
  }
  sum(sort(l) == l)                     # number of integers which are in the same position
}

Para girar os bdígitos de um número inteiro por jposições, o código repete os dígitos várias vezes e, em seguida, leva os dígitos nas posições j+1para j+b. Por exemplo, para girar 1024 vezes, mantenha os valores marcados com um x(posições 5 a 7):

102102102102
    xxx

então o resultado é 021.

Robin Ryder
fonte
111 bytes
Giuseppe
@Giuseppe Thanks! Eu preciso lembrar seq(a=...). Espero que exista alguma Mapmágica para executar, mas minhas tentativas deixaram a contagem de bytes inalterada na melhor das hipóteses.
Robin Ryder
Mappode ser um pouco caro, já que o functionpadrão é de pelo menos 9 bytes, mas se você alternar para a indexação 0, podemos fazer 109 bytes
Giuseppe
1
Boa descoberta! Abaixo de 107, percebendo que seq(a=l)pode ser seq(l)o tempo que a entrada tiver pelo menos 2 elementos (perguntei se isso está OK).
Robin Ryder
6

05AB1E , 9 bytes

ΣN._ï}-_O

Experimente online!

Usa indexação baseada em 0.

Explicação:

Σ    }       # sort the input by
 N._         # each number rotated its index to the left
    ï        # then cast to int (otherwise the sort is alphabetic)
      -      # subtract the input from the result
       _O    # then count the 0s
Grimmy
fonte
6

Japonês -x , 10 9 bytes

Baseado em 0

í¶UñÈséYn

Tente

í¶UñÈséYn     :Implicit input of integer array U
í             :Interleave with
  Uñ          :U sorted by
    È         :Passing each integer at 0-based index Y through the following function
     s        :  Convert to string
      é       :  Rotate right by
       Yn     :    Y negated
 ¶            :Reduce each pair by testing for equality
              :Implicit output of sum of resulting array
Shaggy
fonte
4

Geléia , 9 bytes

Dṙ"JḌỤ=JS

Experimente online!

Link monádico que pega uma lista de números inteiros e retorna um número inteiro indicando o número de números inteiros que permanecem no local após a execução da rotação usando a indexação 1.

Explicação

D         | Convert to decimal digits
 ṙ"J      | Rotate left by index
    Ḍ     | Convert back to integer
     Ụ    | Index in sorted list
      =J  | Check if equal to index in original list
        S | Sum
Nick Kennedy
fonte
4

Python 2 , 104 100 97 93 bytes

b=[int((s*-~i)[i:i+len(s)])for i,s in enumerate(input())]
print map(cmp,b,sorted(b)).count(0)

Experimente online!

Indexação baseada em 0.

Primeiro gira cada número e depois compara o resultado com o resultado, mas classificado.


Salvou:

  • -3 bytes, graças a Erik, o Outgolfer
  • -4 bytes, graças a Kevin Cruijssen (e sua mudança de regra)
TFeld
fonte
-3 como um programa completo .
Erik the Outgolfer
@eriktheoutgolfer obrigado, eu estava muito ocupado tentando fazer um lambda, que eu esqueci input():)
TFeld
É por isso que primeiro tento fazer um programa completo ...: D Sério, se você tentar fazer um programa completo, verá claramente se vale a pena converter ou não um lambda. Não comece defimediatamente (eles são bastante inúteis no Python 2, ao contrário do Python 3).
Erik the Outgolfer
Eu permiti a lista de entrada como strings agora, para que você possa soltar 4 bytes removendo os graves acentos ao redor dos .
Kevin Cruijssen
4

R , 90 88 85 bytes

function(x)sum(rank(as.double(substr(strrep(x,L<-sum(x|1)),y<-1:L,y+nchar(x)-1)))==y)

Experimente online!

Código desenrolado com explicação:

function(x){
    L=sum(x|1)                         # store the length of x

    R=strrep(x,L)                      # repeat each string of vector x L times

    S=substring(R,1:L,1:L+nchar(x)-1)) # for each string of R, extract a substring of the same 
                                       # length of the original number starting from index 1 
                                       # for the 1st element, index 2 for the 2nd and so on
                                       # (this basically rotates the strings )

    Y=as.double(S)                     # convert the strings to numbers

    sum(rank(Y)==1:L)                  # return the number of times the ranks of Y
                                       # match with their original positions
}
digEmAll
fonte
3

J , 28 26 bytes

-2 bytes graças a Jonah

1#.i.@#=[:/:#\".@|.&>":&.>

Experimente online!

Galen Ivanov
fonte
1
Agradável. Parece que você pode perder o "0( Experimente on-line! ), Mas fora isso, não vi uma maneira de jogar golfe.
Jonah
@Jonah Obrigado! Não sei por que não tentei sem ele.
Galen Ivanov
2

Stax , 11 10 bytes

ìát'óJ♣á◄·

Execute e depure

Este programa usa a indexação baseada em 0 e recebe a entrada como uma matriz de seqüências de caracteres. Salvei um byte aproveitando a oportunidade dos novos esclarecimentos.

recursivo
fonte
2

Perl 5 -pa , 80 bytes

map$d{$_.substr$_,0,$b%y///c,''}=$b++,@F;$\+=$d{$_}==$r++for sort{$a-$b}keys%d}{

Experimente online!

Recebe entrada como números separados por espaço no STDIN; dá um resultado baseado em 1.

Xcali
fonte
2

Pitão , 15 bytes

sqVSJ.ev.<`bkQJ

Experimente online! Usa indexação baseada em 0.

sqVSJ.ev.<`bkQJ   Implicit: Q=eval(input())
     .e      Q    Map elements of Q, as b and with index k, using:
          `b        Convert b to string
        .<  k       Rotate the above left k places
       v            Convert back to integer
    J             Store the above as J
   S              Sort the above
 qV           J   Vectorised equality check with the unsorted list
s                 Sum, implicit output
Sok
fonte
@FryAmTheEggman Agora eu permiti uma lista de strings como entrada, então é válida agora.
Kevin Cruijssen
@FryAmTheEggman Você provavelmente está certo, eu não tinha considerado a classificação lexográfica vs a classificação inteira ao omitir a s- a versão original do código teve vo mesmo efeito. Vou editá-lo de volta
Sok
Ah, como Kevin aponta agora, você pode soltar o backtick e usar a entrada como uma lista de strings para salvar um byte.
FryAmTheEggman
2

APL + WIN, 23, 21 19 bytes

2 bytes salvos inserindo os números inteiros como um vetor aninhado de caracteres

+/i=⍋⍎¨(i←⍳⍴v)⌽¨v←⎕

1 indexado.

v←⎕ prompt for input. 

(i←⍳⍴v)⌽¨ rotate each set of characters by input indices.

⍋⍎¨ convert characters to integers and get sorted indices.

+/i= sum where original and sorted indices are the same.

Experimente online! Cortesia de Dyalog Classic

Graham
fonte
Não tenho certeza se isso salvaria bytes, mas eu permiti a entrada como uma lista de cadeias ou lista de dígitos agora.
Kevin Cruijssen
@KevinCruijssen Obrigado por apontar isso. Introduzir um vetor aninhado de strings economiza 2 bytes
Graham
2

JavaScript (Node.js) , 107 99 95 bytes

-8 bytes Obrigado @Shaggy por aceitar a matriz de strings. Mais golfed 4 bytes disto. Não acionará erro de memória neste momento.

a=>[...b=a.map(F=(x,i)=>i--?F(x.slice(1)+x[c=0],i):x)].sort((p,q)=>q-p).map(x=>c+=x==b.pop())|c

Experimente online!

JavaScript (Node.js) , 111 107 bytes

-4 bytes Obrigado @Arnauld!

a=>[...b=a.map((x,i)=>"".padEnd(x+i,x+=c='').substr(i,x.length))].sort((p,q)=>q-p).map(x=>c-=x==b.pop())|-c

Experimente online!

JavaScript (Node.js) , 113 111 bytes

a=>[...b=a.map((x,i)=>"".padEnd(x+i,x).substr(i,`${x}`.length))].sort((p,q)=>p-q).map((x,i)=>x-b[i]||c++,c=0)|c

Experimente online!

Indexado a 0. Pode acionar erro de memória para entradas muito grandes.

Shieru Asakoto
fonte
2
99 bytes , tendo a entrada como uma matriz de seqüências de caracteres inteiras.
Shaggy
@Shaggy Obrigado, e agora é 95 bytes;)
Shieru Asakoto
2

Perl 6 , 50 bytes

{sum ^$_ Z==sort {+[~] rotate .[$^i].comb,$i},^$_}

Experimente online!

Indexação baseada em 0. Também expôs um bug do Rakudo .

Explicação

{                                                }  # Anonymous block
            sort                              ^$_   # Sort indices 0..n
                 {                          },  # by
                              .[$^i]            # element at index i
                                    .comb       # split into chars
                       rotate            ,$i    # rotated i times
                   [~]  # joined
                  +     # converted to number
     ^$_ Z==  # Pairwise equal to original indices 0..n
 sum   # Sum of equal indices
Nwellnhof
fonte
2

PHP ,159 141 134 130 bytes

function($a){foreach($a as$x){for($j=$i;$j--;$x=substr($x,1).$x[0]);$b[$x]=$i++;}ksort($b);foreach($b as$z)$y+=++$j==$z;return$y;}

Experimente online!

Indexação baseada em zero.

Ungolfed:

function( $a ) { 
    // iterate through digits
    foreach( $a as $x ) {
        // rotate the digits the number of times based on their index
        for( $j = $i; $j--; ) {
            // move first digit to last digit
            $x = substr( $x, 1 ) . $x[0];
        }
        // the new number is used as key for sort, value is the original index
        $b[ $x ] = $i++;
    }
    // sort by the new numbers
    ksort( $b );
    // iterate sorted array
    foreach( $b as $z ) {
        // if new index matches original index, increment count ($y)
        if ( ++$j == $z ) {
            $y++;
        }
    }
    return $y;
}
  • -4 bytes usando a entrada como matriz de strings, thx para @KevinCruijssen por apontar isso.
640KB
fonte
Eu não sei muito bem o PHP, mas eu permito uma lista de strings em vez de números inteiros agora, então acho que você pode remover o .=''?
Kevin Cruijssen
@KevinCruijssen você está correto. Tomando como uma matriz de seqüências de caracteres irá remover isso de ser necessário. Vou atualizar em conformidade.
640KB
2

K (Kona) , 25 21bytes

-4 bytes graças a ngn!

{+/t=<.:'(t:!#x)!'$x}

Experimente online!

Galen Ivanov
fonte
1
{.:y!x}'[$x;t:!#x]->.:'(t:!#x)!'$x
ngn
@ngn Obrigado, está muito melhor agora!
Galen Ivanov
2

Consulta T-SQL, 99 bytes

O sql não tem método rotativo, então tive que implementar minha própria sintaxe, já que essa é uma consulta, que tinha que ser feita sem loop.

Indexação baseada em 0.

Usando uma variável de tabela como entrada.

SELECT-sum(1/~(z*3))FROM(SELECT~i+rank()over(order by
substring(n+n,i%len(n)+1,len(n))*1)z FROM @)c

Experimente online

t-clausen.dk
fonte
1

Ícone , 141 bytes

procedure f(l)
n:=0
b:=[]
t:=l[k:=1to*l]&m:=k%*t&t:=t[m+1:0]||t[1:m+1]&put(b,[+t,l[k]])&\x
l[i:=1to*l]=sortf(b,1)[i,2]&n+:=1&\x 
return n
end

Experimente online!

Indexação baseada em 1

Galen Ivanov
fonte
1

Perl 5 , 104 bytes

sub f{my$i;grep/\d+$/&&$i++==$&,sort{$a<=>$b}map{my$n=shift;map$n=~s/(.)(.+)/$2$1/,1..$_;"$n.$_"}0..$#_}

Experimente online!

Indexação baseada em 0 no Perl. Ungolfed e comentou:

sub f {
  my $i;                            #index counter
  grep /\d+$/ && $i++==$&,          #keep/return elems where $i matches original index stored as decimals
  sort { $a<=>$b }                  #sort rotated elems numerically (<=> is the numerical comparison op
  map {                             #loop through input
    my $n = shift;                  #shift(@_) got elem from input array @_
    map $n=~s/(.)(.+)/$2$1/, 1..$_; #rotate left times current index 
    "$n.$_"                         #use rotated number with original index number as decimals (to dont affect sort)
  }
  0..$#_
}
Kjetil S.
fonte
1

Ruby -ap , 77 bytes

1 indexado. O temp foi excluído anteriormente porque perdi parte das especificações.

-plê uma linha de STDIN e sai $_no final. -adivide essa linha de leitura por espaços e a salva como $F.

i=0
$_=$F.zip($F.sort_by{|s|s.chars.rotate(i+=1).join.to_i}).count{|a,b|a==b}

Experimente online!

Value Ink
fonte
você pode salvar 2 bytes substituindo [...].join.to_iporeval [...]*''
Maçaneta da porta
1
@ Doorknob infelizmente não ... existem casos extremos em que, se um número é girado para ter um zero à esquerda, evalo interpretará como um número base-8, o que pode atrapalhar nossas contagens ...
Value Ink
1

Wolfram Language (Mathematica) , 65 bytes

o=Ordering
g=Count[o@MapIndexed[FromDigits@*RotateLeft,#]-o@#,0]&

Experimente online!

Baseado em 1. Tomamos a entrada como uma lista de listas de dígitos, o que funciona porque o Mathematica ordena as listas por comprimento e, em seguida, lexicograficamente, ou seja, exatamente como os números originais.

lirtosiast
fonte
1

Bash , 204 201 bytes

A única coisa interessante aqui (possivelmente) é o uso de eval. O algoritmo também é desajeitado, pois cria uma lista classificada e a lê para determinar índices / índices alterados.

Solução baseada em 1. Meus agradecimentos a @RobinRyder pelo algoritmo de rotação útil.

for((i=1;i<$#+1;i++));do eval s=\${$i};for((j=0;j<i;j++));do eval s=${s}\${$i};done;eval n=\${s:$i:\${#$i}};echo $n $i;done|sort -nk1,1|{ i=1;c=0;while read d j;do((i==j))&&((c++));((i++));done;echo $c; }

Experimente online!

Código revisado após os comentários de Kevin; Experimente online!

PJF
fonte
Não conheço o Bash muito bem, mas acho que você pode remover o último espaço entre eles ;}. Além disso, você pode alterar seu primeiro loop para for((i=0;++i<=$#;));.
Kevin Cruijssen
@KevinCruijssen - geralmente eu acho que Bash e seus amigos precisam desse espaço para analisar a linha de comando. Nesta ocasião, você está correto, pode ser removido. Boa idéia para re-base e pré-incremento. 202 bytes.
PJF
1

Scala , 200 160 bytes

def f(a:Seq[String])=
  a.zipWithIndex
   .map(x=>{val r=x._2%x._1.size;x._1.drop(r)+x._1.take(r)->x._2})
   .sortBy(_._1.toInt)
   .zipWithIndex
   .filter(x=>x._1._2==x._2)
   .size

Experimente online!

Indexado a 0. 160 caracteres após remover recuo e novas linhas. Isso imprime 6:

println( f(Seq("8","49","73","102","259","762","2782","3383","9217","37846","89487","7471788")) )
Kjetil S.
fonte