Existem dois novos xerifes na cidade - Identificando pares de DJMcMego!


60

Temos alguns novos moderadores de xerife na cidade, Mego e DJMcMayhem . Precisamos de um desafio para honrá-los adequadamente por suas novas posições, então vamos lá.

Aqui está algo que chamou minha atenção ao passar o mouse sobre seus perfis - seus IDs de usuário são e . Se você executar uma subtração em dígitos, notará algo bastante emocionante (é claro, considerando as diferenças absolutas):459413171645941

3|1|7|1|6
4|5|9|4|1
-+-+-+-+- (-)
1|4|2|3|5

O número gerado pelo algoritmo acima é . Há algo de especial nesse número inteiro: ele consiste apenas em dígitos consecutivos , classificados em ordem crescente, mas exatamente um dos dígitos não está colocado corretamente - .4142354

Chamaremos um par de números inteiros positivos um par DJMcMego se as diferenças absolutas em dígitos forem números inteiros consecutivos, classificados em ordem crescente, mas exatamente um deles não é o seu lugar. Ou seja, é possível mover exatamente um dígito do resultado da subtração digitada para outra posição, de modo que o número inteiro obtido tenha apenas dígitos consecutivos, classificados em ordem crescente.(uma,b)

No exemplo acima, o par é um par DJMcMego , porque se é movido entre e , o resultado é , que atende aos critérios. Observe que os dígitos do número resultante não precisam começar em , eles devem ser consecutivos. Quando alguém não tem certeza sobre qual decisão deve tomar, sempre pode contar com a ajuda do outro para resolver as coisas.4 3 5 12345 1(31716,45941)435123451 1

Sua tarefa é gerar um valor de verdade / falsidade, dependendo se um par de números inteiros positivos fornecido como entrada é um par DJMcMego.

  • Está garantido que e terá o mesmo número de dígitos, sempre pelo menos 4.bumab

  • Você pode pegar os números inteiros em qualquer formato razoável (por exemplo, números inteiros nativos, seqüências de caracteres, listas de dígitos, etc.)

  • Você pode competir em qualquer linguagem de programação e pode receber e fornecer saída por qualquer método padrão , observando que essas brechas são proibidas por padrão. Isso é , então a submissão mais curta (em bytes) para todos os idiomas vence.

Casos de teste

a, b -> Output

31716, 45941 -> Truthy
12354, 11111 -> Truthy
56798, 22222 -> Truthy
23564, 11111 -> Truthy
1759,  2435  -> Truthy
12345, 11111 -> Falsy
3333,  2101  -> Falsy
22354, 22222 -> Falsy
31717, 45941 -> Falsy
14325, 11111 -> Falsy
89789, 78865 -> Falsy
14954, 61713 -> Falsy
25631, 11114 -> Falsy

Ou, em outro formato .


Podemos produzir verdade para pares não-DJMcMego e falsidade para pares DJMcMego? Os valores de verdade / falsidade também precisam ser consistentes?
— dylnan

6
@Blacksilver Acho que venci ele : P
— DJMcMayhem

2
@ Mr.Xcoder "Trocar os valores de verdade / falsidade é permitido por padrão" Isso é realmente uma coisa?
— Martin Ender

2
@ Mr.Xcoder Claro, muitos desafios permitem, mas dizer "é permitido por padrão" implica em mim que há um meta post sobre isso em algum lugar.
— Martin Ender

11
Talvez adicione 25631, 11114como exemplo. As diferenças são o 14523que confunde vários dos programas atuais
— Ton Hospel

Respostas:


7

05AB1E , 18 bytes

αDæIg<ùʒD{Q}gĀ*{¥P

Experimente online!


Você provavelmente deve adicionar uma nota que 1seja o único número de verdade em 05AB1E; se o Sr. Xcoder não tivesse me informado sobre esse fato, eu teria questionado a validade dessa solução. Você poderia adicionar uma explicação também quando tiver tempo?
— Shaggy

@ Shaggy Enquanto isso, você pode dar uma olhada na explicação da minha solução: não é tão eficiente quanto a da Enigma, mas estamos usando as mesmas funções.
— Kaldo

@Shaggy: Não tenho tempo para adicionar uma explicação quando eu postei isso, buty é feito agora :)
— Emigna

Isso falha no novo caso de teste, 14325, 11111 (falso).
— Dennis

@ Dennis: Obrigado, deve ser corrigido por enquanto (ao custo de muitos bytes). Terá que tentar jogar golfe depois.
— Emigna

7

C (GCC) , 259 258 254 253 250 248 233 222 bytes

  • Agradecimentos a Stan Strum por manter um byte de golfe.
  • Economizou quatro bytes manipulando algumas inicializações variáveis.
  • Salva um byte jogando golfe for(...;l++)b*=B[l]==-~B[l-1];em for(...;b*=B[l]==-~B[~-l++]);(provavelmente dependendo de um comportamento indefinido, pois requer avaliação inicial B[l]seguida por -~B[~-l++]).
  • Salvo três cinco bytes.
  • Economizou quinze vinte e seis bytes graças ao ceilingcat .
j,k,l,L,r,b;f(char*A,char*B){for(j=r=0;k=A[L=j];)A[j++]=-~abs(A[j]-B[j]);for(;k-L;k++)for(j=~0;L-++j;r|=!b)if(k-j)for(bcopy(B-~l,strcpy(B,A)+l,strlen(A+l)),bcopy(B+j,B-~j,L+~j),B[j]=A[k],l=b=0;B[++l];b|=B[l]+~B[~-l]);A=r;}

Experimente online!

Explicação (versão de 248 bytes)

j,k,l,L,r,b;                            // global variables
f(char*A,char*B){                       // function takes two strings
 for(j=r=0;A[j];L=j)                    // loop through A, compute array length L
  A[j++]=-~abs(A[j]-B[j]);              // set every entry in A to the absolute
                                        // difference of A and B at that position
                                        /* Test out all possible movements of        *
                                         * characters and see if any one             *
                                         * results in a sorted list => DJMcMego pair */
 for(j=0;j-L;j++)                       // loop through array
  for(k=~0;L-++k;r|=!b)                 // loop through array
   if(j-k){                             // j is not equal to k
    for(l=0;A[l];B[l++]=A[l]);          // copy A to B
    for(l=j;A[l];B[~-l]=B[++l]);        // shift part of B
    for(l=L;l-k;B[-~l]=B[--l]);         // shift part of B
    B[k]=A[j];                          // insert character at correct position
    for(l=b=0;B[++l];b|=B[l]+~B[~-l]);} // test if B is sorted
 A=r;}                                  // return if there was a DJMcMego pair found

Experimente online!


Para loops que executam apenas uma vez, você pode pular j=0como no 41º caractere
— Stan Strum

@ StanStrum Estou bastante certo de que você confia em jter o valor 0que não é necessariamente o caso após várias chamadas. Uma função, no entanto, deve ser arbitrariamente frequentemente solicitável e ainda resolver o desafio ( meta post relevante ).
— Jonathan Frech 23/02

@StanStrum Você pode, no entanto, definir jcomo zero antes do loop e, assim, salvar um byte.
— Jonathan Frech 23/02

Você pode raspar um byte com f(char*A,char*B){-> f(A,B)char*A,*B;{.
— LambdaBeta 11/06

@LambdaBeta Esses dois trechos têm o mesmo comprimento.
— Jonathan Frech

4

JavaScript (ES6), 130 bytes

Recebe a entrada como duas matrizes de dígitos na sintaxe de currying (a)(b). Retorna um booleano.

a=>b=>a.some((_,i)=>a.some((_,j)=>i-j&&!(A=a.map((v,i)=>Math.abs(v-b[i]))).some(v=>v-A[~k--]-1,A.splice(i,0,A.splice(j,1)[k=0]))))

Experimente online!


4

SWI-Prolog, 157 bytes

Não é muito curto, mas o problema parecia particularmente adequado para predicados declarativos, ligação e recursão variáveis, ou seja, Prolog :)

n(T,Y):-s(T,Q,I,J),s(Y,W,I,J),m(Q,W).
s(T,Q,I,J):-nth0(I,T,X,R),nth0(J,Q,X,R),I\=J.
m([A,B|T],[C,D|Y]):-1 is abs(B-D)-abs(A-C),m([B|T],[D|Y]).
m([_],[_]).

Ligue com, por exemplo, n([3,1,7,1,6],[4,5,9,4,1]).

Explicação: mova um elemento nas duas listas para uma nova posição (usando o SWI-Prolog interno nth0) e verifique se a diferença das novas listas é consecutiva.

s(T,Q,I,J)    % switch (yet unbounded) index I and J in list T, store in Q
s(Y,W,I,J)    % switch (now bounded) I and J in list Y
m(Q,W)        % check new lists
s(T,Q,I,J) :- nth0(I,T,X,R) % X (unbounded) is the I-th (unbounded) element 
                            % of list T with rest R (=prefix+postfix) 
nth0(J,Q,X,R) % the same X is the J-th element in list Q with the same rest R
I\=J          % I and J are unequal
m([A,B|T],[C,D|Y]) :-  % consider first two elements of both lists
1 is abs(B-D)-abs(A-C) % check if differences are consecutive                          
m([B|T],[D|Y])         % recursion starting with the second element
m([_],[_]).            % stop recursion at last element in the list

4

J , 27 bytes

−8 bytes graças ao FrownyFrog

1"0(-:(2-/\|\:|),1#.2>/\|)-

Experimente online!

Solução inicial:

J , 35 bytes

[:((1=[:*/2-/\\:~)*1=1#.0<2-/\])|@-

Experimente online!

Explicação

Leva listas de dígitos como entrada

|@- encontra a diferença absoluta entre os dígitos das listas

1=1#.0<2-/\]Verifica se apenas um dígito está fora de seu lugar. Primeiro, encontro as diferenças entre todos os pares de dígitos adjacentes e verifico se apenas um deles é positivo.

* Multiplique o resultado do teste acima (1 ou 0) com o seguinte teste:

1=[:*/2-/\\:~Todos os dígitos são consecutivos? Classifico a lista, pego as diferenças de todos os pares de dígitos adjacentes, multiplico-os e verifico se é igual a 1


Falhar por 25634 11111(como fazem muitas outras submissões)
— Ton Hospel

@ Ton Hospel - Sim, você está certo. Vou verificar como você conserta.
— Galen Ivanov

Não consertei, apenas joguei golfe.
— FrownyFrog

@FrownyFrog Obrigado! Eu esqueci esse problema.
— Galen Ivanov

4

Gelatina , 14 bytes

ạµṢ_JEċ@Œ¿-Ƥ%L

Experimente online!

Como funciona

ạµṢ_JEċ@Œ¿-Ƥ%L  Main link. Arguments: A, B (digit arrays)

ạ               Take the elementwise absolute difference. Call the result R.
 µ              New chain. Argument: R
  Ṣ             Sort R.
    J           Indices; yield [1, ..., len(R)].
   _            Take the elementwise difference.
     E          Test if all differences are equal.
                The result is 1 if R consists of consecutive digits, 0 otherwise.
          -Ƥ    For all outfixes of R, generated by dropping one of its elements:
        Œ¿        Get its permutation index (1 if sorted, higher if not).
      ċ@        Count the number of times the Boolean from the left appears in the
                array to the right. If the Boolean is 1, the count represents the
                number of ways a single digit can be deleted to yield a sorted
                array. The count has to be positive for a DJMcMego pair, but less
                than the length of R, since R may not be sorted.
            %L  Take the result modulo len(R), mapping len(R) to 0.

3

Japonês , 18 bytes

Estou discutindo se devo postar isso ou não por algumas horas. Cheguei com ele rapidamente tarde da noite passada, mas não tive tempo de testá-lo adequadamente ( e pensei que poderia ser muito longo!). Desde então, Oliver postou uma solução semelhante (que era, quando esta foi postada originalmente, inválida); portanto, se ele ou a comunidade sentirem que isso é muito parecido, eu vou excluí-lo com prazer.

Recebe entradas como matrizes de 2 dígitos, saídas 0para trueou qualquer outro número para false.

íaV
ä> x*Un än × É

Experimente ou verifique todos os casos de teste


Explicação

                   :Implicit input of digit arrays U and V               :[3,1,7,1,6],[4,5,9,4,1]
í V                :Interleave V with U                                  :[[3,4],[1,5],[7,9],[1,4],[6,1]]
 a                 :Get the absolute difference of each pair             :[1,4,2,3,5]
\n                 :Assign that new array to variable U
ä>                 :Is each element greater than the next?               :[false,true,false,false]
     Un            :Sort U                                               :[1,2,3,4,5]
        än         :Get the deltas                                       :[1,1,1,1]
           ×       :Reduce by multiplication                             :1
    *              :Multiply each element in the boolean array by that   :[0,1,0,0]
   x               :Reduce by addition                                   :1
             É     :Subtract 1                                           :0

E, para percorrer esse processo em mais alguns casos de teste:

---------------------------------------------------------------
| U   | [2,3,5,6,4] | [1,2,3,4,5] | [3,1,7,1,7] | [1,4,9,5,4] |
| V   | [1,1,1,1,1] | [1,1,1,1,1] | [4,5,9,4,1] | [6,1,7,1,3] |
|-----|-------------|-------------|-------------|-------------|
| íaV | [1,2,4,5,3] | [0,1,2,3,4] | [1,4,2,3,6] | [5,3,2,4,1] |
|-----|-------------|-------------|-------------|-------------|
| ä>  | [F,F,F,T]   | [F,F,F,F]   | [F,T,F,F]   | [T,T,F,T]   |
|-----|-------------|-------------|-------------|-------------|
| Un  | [1,2,3,4,5] | [0,1,2,3,4] | [1,2,3,4,6] | [1,2,3,4,5] |
| än  | [1,1,1,1]   | [1,1,1,1]   | [1,1,1,2]   | [1,1,1,1]   |
| ×   | 1           | 1           | 2           | 1           |
|-----|-------------|-------------|-------------|-------------|
| *   | [0,0,0,1]   | [0,0,0,0]   | [0,2,0,0]   | [1,1,0,1]   |
| x   | 1           | 0           | 2           | 3           |
| É   | 0           | -1          | 1           | 2           |
---------------------------------------------------------------

2
Falhar por 25634 11111(como fazem muitas outras submissões)
— Ton Hospel

2

Perl, 121 118 bytes

($a,$b)=map[split//],@ARGV;
$s+=$l>$_,$l=$_ for@c=map abs($$a[$i]-$$b[$i++]),@$a;
@c=sort@c;
say$s==1&&$c[-1]-$c[0]==$#$a

Teste no bash:

function golf {
   perl -E'($a,$b)=map[split//],@ARGV;$s+=$l>$_,$l=$_ for@c=map abs($$a[$i]-$$b[$i++]),@$a;@c=sort@c;say$s==1&&$c[-1]-$c[0]==$#$a' $1 $2
}
golf 31716 45941       #says 1, true
golf 12354 11111       #says 1, true
golf 56798 22222       #says 1, true
golf 46798 22222       #says nothing, false
golf 22354 22222       #says nothing, false
golf 1759 2435         #says 1, true
golf 12345 11111       #says nothing, false
golf 89789 78865       #says nothing, false
golf 14954 61713       #says nothing, false

Falhar por 25634 11111(como fazem muitas outras submissões)
— Ton Hospel

2

Java 8 , 245 227 223 194 188 Bytes

Agradecimentos a Kevin por salvar ~ 29 bytes

Graças a Kevin novamente por mais 6 bytes

 z->{int l=z.length/2,c[]=new int[l],i=0,j=0;for(;i<l;)c[i]=Math.abs(z[i]-z[i+++l]);java.util.Arrays.sort(z=c.clone());for(i=0;i<l-1;j+=z[i]-z[i-1]!=1?1:0)j+=c[i]-c[++i]>0?1:0;return j==1;}

Seguiu o mesmo padrão que Galen criou para sua resposta em J.

Experimente online!


11
Você pode jogar mais algumas coisas como essa ( 194 bytes ): z->{int l=z.length/2,c[]=new int[l],i=0,j=0,d[];for(;i<l;)c[i]=Math.abs(z[i]-z[i+++l]);java.util.Arrays.sort(d=c.clone());for(i=0;i<l-1;j+=d[i+1]-d[i++]!=1?1:0)j+=c[i]-c[i+1]>0?1:0;return j==1;}eu combinei o inte int[]no início; usado l=z.length/2uma vez e reutilizar em lvez de 4 vezes; mudou if(...)j++para j+=...?1:0para que eles possam ser colocados dentro dos loops e os suportes e o segundo ponto e vírgula podem ser removidos; removeu oe i++faça ++diretamente no último ino loop; etc.
— Kevin Cruijssen 23/02

11
188 bytes : z->{int l=z.length/2,c[]=new int[l],i=0,j=0;for(;i<l;)c[i]=Math.abs(z[i]-z[i+++l]);java.util.Arrays.sort(z=c.clone());for(i=0;i<l-1;j+=z[i]-z[i-1]!=1?1:0)j+=c[i]-c[++i]>0?1:0;return j==1;}. Removida d[]e reutilizada a entrada que zvocê não precisa mais; Alterado j+=c[i]-c[i+1]?1:0;e j+=d[i+1]-d[i++]!=1?1:0para j+=c[i]-c[++i]?1:0;e j+=z[i]-z[i-1]?1:0. 1 de mim, no entanto. Boa resposta! :)
— Kevin Cruijssen 23/02

11
Obrigado @Kevin, Toda vez que você comentava, eu encontrava apenas uma ou duas das várias maneiras pelas quais você já jogava golfe: P Você é muito mais rápido que eu! Muito obrigado pela ajuda!
— DevelopingDeveloper

2
Hehe :) Tudo vem com experiência, eu acho. Já estou jogando golfe em Java há quase dois anos. Quanto mais você faz, mais fácil vê esse tipo de coisa. E até minhas respostas são analisadas por OlivierGrégoire, Nevay e algumas outras o tempo todo. Ah, você provavelmente já os viu, mas Dicas para Golfe em Java e Dicas para Golfe em <todas as línguas> são bastante interessantes de se ler.
— Kevin Cruijssen 23/02

2
Falhar por 25634 11111(como fazem muitas outras submissões)
— Ton Hospel

2

Retina , 102 bytes

+`(.)(.*¶)(.)(.*)
$2$4;$1,$3
\d
*
(_*),\1
_
L$w`(;_+\b)(.*)(;_+\b)
$%`$2$3$1$%"$3$1$2$'
m`(^;_+|\1_)+$

Experimente online! O link inclui casos de teste. Retorna o número de maneiras que os dígitos podem ser movidos para obter uma sequência ascendente, que é 2 para uma troca direta, pois um dos dígitos pode ser movido além do outro nesse caso. Explicação:

+`(.)(.*¶)(.)(.*)
$2$4;$1,$3

Emparelhe os dígitos.

\d
*

Converta para unário.

(_*),\1
_

Faça a diferença, mas adicione 1 porque trabalhar com zero no Retina é difícil ™.

L$w`(;_+\b)(.*)(;_+\b)
$%`$2$3$1$%"$3$1$2$'

Liste todas as seqüências de dígitos obtidas movendo exatamente um dígito.

m`(^;_+|\1_)+$

Verifique se há dígitos consecutivos.


2

Perl 5 , -F 87 84 83 bytes

Contagem de estilos antigos: 86 bytes ( +3para -F)

Dê a ele números como 2 linhas em STDIN, a última linha sem uma nova linha à direita.

Imprime a sequência de diferenças até 2 vezes para true, nada para false

A A0123456789corda longa é realmente irritante.

#!/usr/bin/perl -F
$_=<>;s%.%abs$&-$F[pos]%eg;s%%"'$`$''=~s:|:A0123456789=~/\$`$&\$'/>//&&say:reg"%eeg

Experimente online!

Eu sou usure se isso 79conta como válido:

$_=<>;s%.%abs$&-$F[pos]%eg;s,,$a=$&;"$`$'"=~s:|:A0123456789=~/$`$a$'/%//:reg,eg

Trava para um par válido, para que você obtenha um código de saída diferente de zero. Ele não faz nada se não um par e sai com o código de saída 0. Eu sei que é permitido retornar o resultado via código de saída, mas eles são realmente verdadeiros e falsos ou de fato invertidos (pois o shell 0é verdadeiro)?



1

Pyt , 20 18 bytes

ą←ą-ÅĐʁ>Ʃ1=⇹ş₋Π1=∧

Experimente online!

Explicação:

       Implicitly get the first number
ą      Convert to list of digits
←      Get the second number
ą      Convert to list of digits
-Å     Take the absolute value of the differences of the lists element-wise
Đ      Duplicate the list of differences
ʁ>     Reduce by greater than
Ʃ1=    Is the sum of that array equal to 1
⇹      Swap the top two items on the stack
ş      Sort the top of the stack ascending
₋      Reduce by subtraction (from the right)
Π1=    Is the product of the array equal to 1
∧      bitwise-AND (in this case, also logical AND) the top two items on the stack
       Implicit print

2
Fracassa em 25634 11111(como acontece com muitos outros envios)
— Ton Hospel 27/02

1

Adicionar ++ , 105 bytes

D,w,@~,Ñ_€|BSVcGbU1b]2b]+º=
D,k,@,BPB*
L,BcB_€|B]dBkbUBSVcGbU£>sVcGB]VBKB#BKBcB_0º>b]GBK{w}b]++b*1=BK{k}*

Experimente online!

Define uma função lambda que recebe duas listas de dígitos como entrada. Emite um número inteiro positivo divisível por 24 1 para pares DJMcMego, 0 caso contrário.

1: Se for muito restritivo, ele também gera um número inteiro positivo para os pares DJMcMego e 0, caso contrário

Como funciona

Aqui, realizamos 4 verificações para determinar se a entrada é válida. As partes do código que fazem essas verificações são

BcB_€|B]dBkbUBSVcGbU£>sVcGB]V

Aqui, pegamos a lista de diferenças absolutas de dígitos e contamos o número de pares sobrepostos que são classificados em ordem decrescente. Todo par DJMcMego produz um resultado de 1 , mas eles não são exclusivos nesse aspecto. Também armazenamos as diferenças absolutas de dígitos das entradas, para salvar os bytes posteriormente. Essa matriz será chamada de A por toda parte.

BKB#BKBcB_0º>b]

Em seguida, analisamos as diferenças elementares entre A e A antes de afirmar que pelo menos uma dessas diferenças é negativa.

D,w,@~,Ñ_€|BSVcGbU1b]2b]+º=
GBK{w}b]

Em terceiro lugar, podemos verificar se o par [1, 2] está contido nos incrementos de frente de Uma . Isso verifica se, em pelo menos uma posição de A , ele é classificado, o que é um critério para os pares DJMcMego.

D,k,@,BPB*
BK{k}

Como nossa última verificação, afirmamos que o segundo elemento de A nunca é 0 . Para que um par, X e Y , seja um par DJMcMego, podemos assumir que seu A é sempre único, pois uma matriz com duplicatas nunca pode ser tornada consecutiva trocando um valor único por outro.

Finalmente, verificamos que os três primeiros desses testes retornaram 1 e que o quarto retornou um valor x tal que x ≠ 0

Um passo a passo do código é o seguinte

D,w,		; Define a function w;
		;   This takes an array of integers
		;   Returns whether the pair [1, 2] appears in the absolute forward differences
		;
	@	; Take one argument
	~,	; Splat that argument to the stack
		;   Example argument:		[1 4 2 3 5]
		;
	Ñ_	; Increments;		STACK = [3 -2 1 2]
	€|	; Magnitudes;		STACK = [3 2 1 2]
	BSVcGbU	; Overlapping pairs;	STACK = [[3 2] [2 1] [1 2]]
	1b]2b]+	; Push [1 2];		STACK = [[3 2] [2 1] [1 2] [1 2]]
	º=	; Any equal [1 2];	STACK = [1]

; ============= ;

D,k,		; Define a function k;
		;   This function takes an array of integers
		;   Returns whether the second element is 0;
		;
	@,	; Take one argument and push to the stack
		;   Example argument:		[[1 4 2 3 5]]
		;
	BP	; Behead;		STACK = [[4 2 3 5]] 
	B*	; Product;		STACK = [120]
		;
		; In DJMcMego pairs, A may begin with a 0
		; For example, 12354 and 11111, so we need to remove the first element
		; Taking the product yields 0 if any element is 0
		; However, in order to be a DJMcMego pair, two digits at the same index
		;   cannot be the same, otherwise their digit-wise difference will be 0

; ============= ;

L,		; Define a lambda function
		;
		; This lambda function takes two arrays of digits as input
		; Returns an integer to determine if those digits represent a DJMcMego pair
		;
		; A lambda function is shorter to define than a normal function
		; However, when called inside functions with the ] command,
		;   they consume the entire stack as arguments, meaning that using functions
		;   allows us to preserve important values
		;
		; Example arguments:		[[3 1 7 1 6] [4 5 9 4 1]]
		;
		; First check:
		;
	BcB_	; Digit differences;	STACK = [-1 -4 -2 -3 5]
	€|	; Magnitudes;		STACK = [1 4 2 3 5]
	B]dBkbU	; Save a copy, A	STACK = [1 4 2 3 5]			A: [1 4 2 3 5]
	BSVcGbU	; Overlapping pairs;	STACK = [[1 4] [4 2] [2 3] [3 5]]
	£>	; Sorted descendingly?	STACK = [0 1 0 0]
	sVcG	; How many?		STACK = [1]
	B]V	; Save a copy;		STACK = []				Register: [1]
		;
		; Second check:
		;
	BK	; Retrieve A;		STACK = [[1 4 2 3 5]]
	B#	; Sort;			STACK = [[1 2 3 4 5]]
	BK	; Retrieve A;		STACK = [[1 2 3 4 5] [1 4 2 3 5]]
	BcB_	; Element differences;	STACK = [0 -2 1 1 0]
	0º>b]	; Any negatives;	STACk = [[1]]
		;
		; Third and fourth checks:
		;
	G	; Retrieve register;	STACK = [[1] [1]]
	BK	; Retreive A;		STACK = [[1] [1] [1 4 2 3 5]]
	{w}b]	; Run w;		STACK = [[1] [1] [1]]
	++	; Concatenate;		STACK = [[1 1 1]]
	b*1=	; Product = 1;		STACK = [1]
	BK{k}	; Run k;		STACK = [1 120]
	*	; Multiply;		STACK = [120]

		; To force output as 1 and 0 values,
		;   append a ? to the end, to output the sign (forces boolean conversion)

1

R , 110106 84 bytes

function(x,y,z=abs(x-y),w=z-min(z)+1)adist(p(1:max(w)),p(w),c("s"=9))==2
p=intToUtf8

Experimente online!

@JayCe com um ridículo salvamento de 22 bytes!

O cavalo de batalha aqui é adist, o que fornece uma "distância de edição generalizada de Levenshtein" entre duas cordas. Por padrão, a distância é a contagem do número mínimo de inserções, exclusões e substituições necessárias para transformar uma sequência em outra. Mas adistpermite ponderar as coisas como você gosta - então, pesei cada substituição para adicionar 9 à distância, em vez de 1. Isso efetivamente força o algoritmo a procurar apenas inserções e exclusões.

Este código aceita vetores de números inteiros, calcula as diferenças absolutas entre elementos e converte o resultado para começar em 1, chamando-o w.

Em seguida, a distância de Levenshtein ponderada personalizada é calculada entre wcoladas para formar uma sequência e a sequência "1234..."(na verdade, utf-8 "\001\002\003\004...", mas adistnão se importa.) Com o mesmo número de caracteres que w.

A única maneira pela qual a string pode ter exatamente um dígito fora do lugar é se você fizer uma exclusão e uma inserção, dando uma distância de 2.


Isso falha no novo caso de teste, 14325, 11111 (falso).
— Dennis

Eu acho que paste0pode ser apenas pasteporque há apenas uma entrada.
— Giuseppe

p=intToUtf8 ?
— Jayce

Eu pensei que tinha um campo de golfe substituindo w=z-min(z)+1)adist(p(1:max(w))com w=z-min(z))adist(p(0:max(w)), mas ele não funciona desde que intToUtf8(\000)é NULL.
— Jayce

Esta é uma solução interessante que merece mais upvotes .... Eu acho que prever as upvotes em Codegolf é a próxima fronteira para AI :)
— Jayce

0

JavaScript, 137 136 135 134 132 132 123 bytes

Recebe entrada como duas matrizes de dígitos na sintaxe de curry, saídas 0para truee qualquer outro número para false.

a=>b=>(c=a.map((x,y)=>(x-=b[y])<0?-x:x)).map(x=>t+=x>c[++j]&(d=[...c].sort()).slice(i=0,-1).every(x=>d[++i]-x&1),t=j=0)|t^1

Casos de teste

f=
a=>b=>(c=a.map((x,y)=>(x-=b[y])<0?-x:x)).map(x=>t+=x>c[++j]&(d=[...c].sort()).slice(i=0,-1).every(x=>d[++i]-x&1),t=j=0)|t^1
o.innerText=`${l=`-`.repeat(21)}\n|   #1  |   #2  | f |${m=`\n|${`|`.padStart(8,`-`).repeat(2)}---|\n`}${[[31716,45941],[12354,11111],[56798,22222],[23564,11111],[1759,2435],[12345,11111],[3333,2101],[22354,22222],[31717,45941],[89789,78865],[14954,61713]].map(([x,y])=>`| ${JSON.stringify(x).padEnd(6)}| ${JSON.stringify(y).padEnd(6)}| ${f([...``+x])([...``+y])} |`).join(m)}\n`+l
<pre id=o></pre>


11
[...u].sort(y=0)é javascript inválido, o argumento para a classificação deve ser uma função
— edc65 23/02

@ edc65, isso já foi editado há muito tempo. Por mais inválido que seja, funcionou! ;)
— Shaggy

2
"Falha em 25634 11111(assim como muitas outras submissões)" - Ton Hospel
— Asone Tuhid 27/02/18

0

Python 2 , 116 119 106 bytes

Obrigado, Sr. Xcoder, pelo 116->84corte, mas descobri que perdi os critérios de "número consecutivo", então 26 bytes são adicionados para esse fim :(

Depois disso, -1 mais obrigado Sr. Xcoder e -13 obrigado ovs

def m(a,b):l=[abs(x-y)for x,y in zip(a,b)];print sum(e>f for e,f in zip(l,l[1:]))==1==len(l)-max(l)+min(l)

Experimente online!

Aquele abaixo corrige o 25634 - 11111problema, mas com comprimento duplo ( 211 206 145 142B) ... Golfe ...

def m(a,b):l=[abs(x-y)for x,y in zip(a,b)];r=[l[i]-i-min(l)for i in range(len(l))];print(sum(r)==0)&(len([x for x in r if abs(x)>1])<2)&any(r)

Experimente online!

E parabéns aos novos moderadores :)

Explicação:

l=[abs(x-y)for x,y in zip(a,b)]

Gera a lista de diferenças absolutas dos dígitos.

r=[l[i]-i-min(l)for i in range(len(l))]

Calcula o deslocamento da posição correta.

sum(r)==0

Se a sequência não for contínua, a soma deslocada "normalmente" não será 0. Mas, mesmo que seja igual a 0, as próximas as bloquearão.

len([x for x in r if abs(x)>1])<2

Apenas 0 ou 1 item terá deslocamento absoluto maior que 1 (aquele com posição incorreta e 0 é o caso 1,2,3,5,4)

any(r)

Bloqueia o caso quando todos os números estão nas posições corretas


Parece falhar para m([3,3,3,3],[2,1,0,1])(retorna True) Tio
— Asone Tuhid

@AsoneTuhid Corrigi o problema com base no seu golfe, porque quando enviei a resposta e ele jogou a minha resposta, esqueci o caso.
— Shieru Asakoto,

2
Falhar por 25634 11111(como fazem muitas outras submissões)
— Ton Hospel

@TonHospel Oh, isso é complicado. Estou pensando em métodos para corrigi-lo, mas parece que vai acrescentar bastante um monte de bytes para a resposta
— Shieru Asakoto

0

Haskell , 182 163 162 162 132 bytes

(#)=zipWith(-)
a&b|s<-abs<$>a#b=or[all(==1)$tail a#a|(x,h:y)<-p s,(q,r)<-p$x++y,a<-[q++h:r],a/=s]
p l=[splitAt k l|k<-[0..length l]]

Recebe a entrada como uma lista de dígitos. A função auxiliar pque oferece todas as formas possíveis de dividir uma lista em duas partes é usada para retirar um elemento e inseri-lo novamente em outro lugar.

Experimente online!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.