Tão fácil quanto um-dois-três

35

Escreva um programa ou função que receba um número inteiro positivo. Você pode assumir que a entrada é válida e pode tomá-la como uma sequência. Se o número for qualquer um

123
234
345
456
567
678
789

em seguida, imprima um valor de verdade . Caso contrário, imprima um valor falso . Por exemplo, as entradas

1
2
3
12
122
124
132
321
457
777
890
900
1011
1230
1234

todos devem resultar em saída falsa. (A entrada não terá zeros à esquerda, portanto você não precisa se preocupar com coisas assim 012.)

O código mais curto em bytes vence.

Passatempos de Calvin
fonte
Oh, cordas são permitidas? E as matrizes de dígitos?
Dennis
@ Dennis No. Vamos mantê-lo em strings simples ou ints simples.
Hobbies de Calvin
6
Se eu receber entrada de string, devo lidar 012?
Lynn
11
@ Lynn No. 012seria falso, mas você pode assumir que não é uma entrada.
Hobbies de Calvin
11
@ BradGilbertb2gills Não. Ele deve apenas satisfazer a definição ligada de truthy / Falsas - meta.codegolf.stackexchange.com/questions/2190/...
de Calvino Hobbies

Respostas:

46

Python, 24 bytes

range(123,790,111).count

Uma função anônima que gera 0 ou 1. Cria a lista [123, 234, 345, 456, 567, 678, 789]e conta quantas vezes a entrada aparece.

f=range(123,790,111).count

f(123)
=> 1
f(258)
=> 0
xnor
fonte
Não foi possível remover um byte iniciando às 12 em vez de 123?
Página
11
Ele precisa não incluir 12. #
214
Mas podemos assumir que não seria uma entrada? Estou confuso
var first)
11
Se você está falando sobre os comentários, eles estão dizendo que, se você receber a entrada como uma string (o que não é esse), você pode esperar que os números não tenham zeros à esquerda, então 12 será dado como "12" e não " 012 ".
Xnor
34

Python, 24 bytes

lambda n:n%111==12<n<900

Apenas um monte de encadeamento de condições.

Sp3000
fonte
Ser capaz de comparar um intervalo que supera facilmente qualquer idioma que eu já conheça. Eu tive que procurar para ver como funcionava.
GuitarPicker
Uau, se não fosse pela palavra, lambdaeu nem imaginaria que era Python. Isso é horrível.
Steve Bennett
25

Haskell, 22 bytes

(`elem`[123,234..789])

Uma função anônima. Gera a lista com espaçamento uniforme [123, 234, 345, 456, 567, 678, 789]e verifica se a entrada é um elemento.

xnor
fonte
11
De jeito nenhum! Isso é mágico!
YSC
11

Python 2, 25 bytes

lambda n:`n-12`==`n`[0]*3

Teste em Ideone .

Dennis
fonte
8

Flacidez cerebral 76 + 3 = 79 bytes

Esta resposta é um golfe desta resposta. Na verdade, eu não sei bem como minha resposta funciona, mas DJMcMayhem fornece uma boa explicação em sua resposta original e minha resposta é uma modificação na dele.

([]<>)<>({}[({})]<>)<>(({}[({})()()()()()]<>{}{}<(())>)){{}{}(((<{}>)))}{}{}

É executado com o sinalizador -a ascii adicionando 3 bytes.

Explicação (das sortes)

Começando com a solução de trabalho original:

([]<>)<>({}[({})]<>)<>({}[({})]<>)({}{}[()()])({}<({}[()()()])>)(({}{}<(())>)){{}{}(((<{}>)))}{}{}

Eu corro isso através de um algoritmo simples de golfe que escrevi e recebo:

([]<>)<>({}[({})]<>)<>(({}[({})]<>{}[()()]<({}[()()()])>{}<(())>)){{}{}(((<{}>)))}{}{}

A partir daqui, vejo a seção que se <({}[()()()])>{}multiplica essencialmente por uma que torna igual a {}[()()()]redução de todo o código para:

([]<>)<>({}[({})]<>)<>(({}[({})]<>{}[()()]{}[()()()]<(())>)){{}{}(((<{}>)))}{}{}

Por fim, os negativos podem ser combinados:

([]<>)<>({}[({})]<>)<>(({}[({})()()()()()]<>{}{}<(())>)){{}{}(((<{}>)))}{}{}
Assistente de Trigo
fonte
14
"Eu realmente não sei bem como funciona a minha resposta" você ganhar na internet
Leaky Nun
Não .
Freira vazada
@LeakyNun Não acredito que o modo Ascii funcione para experimentá-lo online. Você precisará obter a versão do github.
Assistente de trigo
11
O modo ASCII do @WheatWizard definitivamente funciona no TIO. Você pode verificar isso adicionando 48 ('0') ao topo da pilha . Freira com vazamento está certa, o algoritmo ( meu algoritmo) está errado, porque apenas verifica se a soma das diferenças é 2 (o que funciona se a diferença for +3 e -1). Infelizmente, ambas as nossas respostas estão erradas.
DJMcMayhem
11
@WheatWizard Esta resposta não parece ser válida. Experimente online! (Minha resposta original também não foi)
DJMcMayhem
7

Gelatina , 6 bytes

DI⁼1,1

Experimente online! ou verifique todos os casos de teste .

Como funciona

DI⁼1,1  Main link. Argument: n (integer)

D       Decimal; convert n to base 10.
 I      Increments; compute the differences of all pairs of adjacent digits.
   1,1  Yield [1, 1].
  ⁼     Test the results to both sides for equality.
Dennis
fonte
012 não retorna falso, embora ele realmente não retornar nada ...
Jamie Barker
A entrada deve ser um número inteiro. No que diz ast.literal_evalrespeito, 012não representa um número inteiro .
Dennis
7

05AB1E , 5 bytes

¥XX‚Q

Explicação

¥      # deltas
    Q  # are equal to
 XX‚   # [1,1]

Experimente online

Emigna
fonte
Eu usei em 2Å1vez de XX,, apenas para os pedaços de menos comandos (4 em vez de 5).
Erik the Outgolfer
@ErikGolfer エ リ ッ ク ゴ ル フ ァ: e Åé gravável no meu teclado (ao contrário de ), o que é um benefício :) #
1189 Emigna
(não o que ,eu usei) também não possui uma sequência de teclas de composição, enquanto Åestiver oAem um teclado americano.
Erik the Outgolfer
6

MATL , 8 bytes

d1=tn2=*

Experimente online!

Isso imprimirá 1 1 para uma entrada verdadeira e uma matriz com uma 0para um valor falso, já que isso é falso no MATL.

Explicação:

d           % Calculate the difference between consecutive digits
 1=         % Push an array of which elements equal one
   t        % Duplicate this array
    n       % Push the length of this array
     2=     % Push a one if the length is 2, and a zero otherwise
            % Now, if we have a truthy input, the stack looks like:
            %   [1 1]
            %   1
            % And if we have a falsy input, the stack looks something like this:
            %   [1 0]
            %   1
            % Or this:
            %   [1 1]
            %   0
       *    % Multiply the top two elements
DJMcMayhem
fonte
Talvez d1=Ep4=(eu não tenha testado exaustivamente)
Luis Mendo
11
Ou dTTX=por 5 bytes
Luis Mendo
@luismendo whaaa? Como isso funciona? Não consigo encontrar a documentação emT
DJMcMayhem
Té o literal truee Fé false. Vizinho Te Fficar juntos, assim TTé [true true], que para esses fins é equivalente a [1 1]. Veja a seção 4.3 da especificação
Luis Mendo
6

Java 7, 46 bytes

boolean f(int a){return a>12&a<790&a%111==12;}

Depois de tentar várias coisas com a Freira Furada no bate-papo, isso parece ser o mais curto. Às vezes, você só precisa fazer as coisas da maneira direta: /

Explicação:

boolean f(int a){
    return a>12         Is it more than 12? (stupid edge case)
           &
           a<790        Is it in range the other way? 
           &
           a%111==12;   Is it 12 more than a multiple of 111? 
}
Geobits
fonte
6

Perl 6 ,  35 29 24 21  19 bytes

{.chars==3&&'0123456789'.index: $_}
{$_ (elem) (123,*+111...789)}
{$_∈(123,*+111...789)}
*∈(123,*+111...789)
*∈(123,234...789)

Explicação:

# Whatever lambda ( the parameter is 「*」 )
*

 # is it an element of:

# this sequence
(
  123,
  234,

  # deduce rest of sequence
  ...

  # stop when you generate this value
  789
)

Uso:

my &code = *∈(123,234...789);

say code 123; # True
say code 472; # False

say (  *∈(123,234...789)  )( 789 ); # True
Brad Gilbert b2gills
fonte
6

Retina , 26

.
$*: 
^(:+ ):\1::\1$

Saídas 1 para verdade e 0 para falsey.

Experimente on-line (primeira linha adicionada para permitir a execução de vários casos de teste).

Trauma Digital
fonte
5

Ruby, 32 30 25 + 2 = 27 bytes

+2 bytes para -nl sinalizadores.

Recebe entrada em STDIN e imprime trueou false.

p"123456789"[$_]&.size==3

Veja em repl.it: https://repl.it/DBn2/2 (Clique em ▶ ️ e digite entrada no console abaixo.)

Jordânia
fonte
Seus testes mostram 12 indo para verdade.
Xnor
@xnor Ops. Isso vai me ensinar a jogar golfe depois de dormir. Fixo!
Jordan
Eu pensei que -asim split, não chop? Além disso, o que &faz? Estou usando um Ruby mais antigo que gera um erro. Enfim, ele funciona perfeitamente em 26 bytes sem ele.
Xsot #
Opa, eu quis dizer -l, não -a. &.é o operador "navegação segura", adicionado no Ruby 2.3. Sem ele, entradas como 19, que não são substrings "123456789", gerarão um NoMethodError.
Jordan
@ Jordânia Não estou recebendo um erro no 2.2. Talvez seja novo no 2.3 também?
Xsot #
5

Brain-Flak , 99 bytes

([{}]({})<>)<>([{}]{}<>)(({})<([{}]{})((){[()](<{}>)}{})>)([{}]{})((){[()](<{}>)}{})<>{{{}}<>{}}<>

Experimente online!

São 98 bytes de código +1para o -asinalizador.

Isso imprime 1por verdade, e um 0ou nada (que é equivalente a 0) para falsificação

DJMcMayhem
fonte
Tente se livrar das ineficiências push pop. Eu posso ver um monte no seu código. Eles parecem, ...)({}mas variam. Se você pressionar e saltar sem usar o valor, poderá condensá-lo em uma coisa. Posso vincular você a uma versão do seu código com todas essas informações, se você quiser.
Wheat Wizard
Aqui está o meu golfe de 76 bytes do seu programa. Eu executei meu otimizador de ataques cerebrais no seu código com algumas configurações personalizadas.
Wheat Wizard
Não .
Freira vazada
4

Flacidez Cerebral , 114 bytes

([((()()()){}){}]{})(((()()()){}())<>)<>{({}<(({}[(((((()()()){}()){}){}){}){}]())){(<{}>)<>({}[()])<>}{}>[()])}<>

Experimente online!

Versão correta (no espírito da pergunta): pega o número inteiro como entrada, gera 0 para falsey e 1 para verdade.

Isso não é pilha limpa.

Algoritmo

Deixe a entrada ser n.

A saída é verdadeira se (n-123)(n-234)(n-345)(n-456)(n-567)(n-678)(n-789)=0.

Calculei esses sete números primeiro subtraindo 12 e depois subtraí 111 7 vezes, e depois calculei o NÃO duplo lógico desses sete números e os somei.

Para resultados de verdade, a soma é 6; para resultados de falsey, a soma é 7.

Então, subtraio a soma de 7 e produzo a resposta.

Freira Furada
fonte
Eu não entendo o código, mas o algoritmo é inteligente, então tenha um +1.
Cyoce 4/09/16
4

R, 30 22 bytes

scan()%in%(12+1:7*111)

Não é particularmente emocionante; verifique se a entrada está na sequência fornecida por 12 + 111k, onde k é cada um de 1 a 7. Observe que :precede *que a multiplicação ocorra após a geração da sequência.

JDL
fonte
4

C # (compilador interativo do Visual C #) , 41 30 23 bytes

Primeiro envio de código-golfe, seja gentil :)

a=>{return a>12&&a<790?a%111==12:false;};
a=>a>12&&a<790?a%111==12:false
a=>a>12&a<790&a%111==12

Experimente online!

  • -11 bytes graças a Kirill L.
  • Outros -7 bytes, graças apenas ao ASCII.
Loxx
fonte
11
Bem-vindo ao PPCG! Você pode salvar alguns bytes eliminando os chavetas e a returnpalavra-chave: 30 bytes
Kirill L.
11
23 , também 23
somente ASCII
11
Boa primeira apresentação!
Modalidade de ignorância
3

Brainfuck, 43 bytes

,>,>,>,[>>]<[[-<-<->>]<+[>>]<++[>>->]<+<]>.

Bah, eu não sou bom nisso. Saídas \x01Se a saída for uma das cordas 123, 234, ..., 789; saídas \x00caso contrário.

(Eu venci o Java 7, no entanto ...)

Experimente online!

Lynn
fonte
Qual o sentido disso [>>]<? Isso não poderia ser apenas >?
DJMcMayhem
Quero transformar o programa em falha (jogando-o fora da pista) se a célula sob o ponteiro não for zero nesse ponto.
Lynn
42 bytes
Freira vazada
@LeakyNun Isso parece completamente diferente; fique à vontade para postá-lo como uma resposta em separado
Lynn
@Lynn Done.
Freira vazada
3

JavaScript ES6, 26 bytes

n=>1>(n-12)%111&n>99&n<790

Isso tira vantagem do fato de eu estar usando operadores lógicos em bits no que são essencialmente booleanos (que são baseados em bits!)

Agradecimentos a Titus por salvar 2.

WallyWest
fonte
11
dois bytes: (n-12)en>99
Titus
@ Titus Oh, muito bom, +1 para você!
precisa saber é o seguinte
11
=> é ES6, não ES5.
Neil
11
Eu acredito que foi decidido na meta que você não precisava contar "f =" criando esses 26 bytes #
Charlie Wynn
11
@WallyWest Eu acho que é porque não é necessário ter "f =" para usar a função em todos os casos, então por que supor que você precise para este caso? As pessoas mais espertas do que eu decidiram que está tudo bem, então eu apenas a uso;)
Charlie Wynn
3

Excel - 62 57 35 31 bytes

Com base na resposta de Anastasiya-Romanova, mas retornando os TRUE/FALSEvalores do Excel .

=AND(LEN(N)=3,MID(N,2,1)-MID(N,1,1)=1,MID(N,3,1)-MID(N,2,1)=1)

Além disso, podemos chegar a

=AND(LEN(N)=3,MID(N,2,1)-LEFT(N)=1,RIGHT(N)-MID(N,2,1)=1)

desde que ambos RIGHTeLEFT retornam um único caractere por padrão.

E, inspirado por algumas das soluções Python:

=AND(LEN(N)=3,MOD(N,111)=12,N<>900)

Obrigado a Neil por mais 4 bytes ...

=AND(N>99,MOD(N,111)=12,N<900)
Dulrich
fonte
Não N<900economiza um byte; nesse caso, você também pode usar em N>99vez de LEN(N)=3.
Neil
11
21 bytes: =REPT(LEFT(N),3)+12=Nonde Né o nome da célula de referência.
Engenheiro Toast
3

Braquilog (2), 7 bytes

ẹ~⟦₂-_2

Experimente online!

Explicação

ẹ~⟦₂-_2
ẹ        Split into digits
 ~⟦₂     Assert that this is an increasing range; take its endpoints
    -_2  Assert that the starting minus ending endpoint is -2

Como um programa completo, obtemos um retorno verdadeiro, se todas as afirmações se mantiverem, um retorno falsey, se houver alguma falha.


fonte
3

CJam, 13 9 bytes

A,s3ewqe=

Experimente online!

Explicação

A,s        e# Push "0123456789".
   3ew     e# Split it into contiguous length-3 chunks: ["012" "123" "234" ... "789"].
      q    e# Push the input.
       e=  e# Count the number of times the input appears in the array.
Gato de negócios
fonte
5
não funciona se o número é como2345
Maltysen
@Maltysen Fixed
Business Cat
2

Excel - 104 bytes

=IF(LEN(N)<3,"Falsy",IF(AND(LEN(N)=3,MID(N,2,1)-MID(N,1,1)=1,MID(N,3,1)-MID(N,2,1)=1),"Truthy","Falsy"))

Explicação:

A sintaxe da fórmula SE no Excel é:

IF( condition, [value_if_true], [value_if_false] )

Se o comprimento da entrada N, onde é o nome da célula de referência, for menor que 3, ele retornará o Falsy . Caso contrário, se o comprimento da entrada Nfor 3 e a diferença do segundo e do primeiro dígito e a diferença do terceiro e do segundo dígitos forem iguais a 1, retornará Truthy .

Anastasiya-Romanova 秀
fonte
21 bytes: =REPT(LEFT(N),3)+12=Nonde Né o nome da célula de referência.
Engineer Toast
2

Dyalog APL , 10 bytes

Aceita argumento de string.

1 1≡¯2-/⍎¨

1 1≡ É {1, 1} idêntico a

¯2-/ a diferença inversa entre pares de

⍎¨ cada caractere tomado como um número?

TryAPL online! ( foi copiado epor motivos de segurança.)

Adão
fonte
2

Perl, 18 bytes

Inclui +1 para -p

Execute com a entrada em STDIN

123.pl <<< 123

123.pl:

#!/usr/bin/perl -p
$_=$_=/./.2==$_-$&x3
Ton Hospel
fonte
2

PHP, 31 bytes

<?=($n=$_GET[n])-12==$n[0]*111;

Verifique se o primeiro dígito de (número menos 12) é múltiplo de 111

Florin Chis
fonte
2

PowerShell v3 +, 24 bytes

($args[0]-12)/111-in1..7

Usa o mesmo truque "múltiplo de 111 mais 12" como algumas outras respostas, mas segue na outra direção. Recebe entrada$args[0] , subtrai 12, divide por 111e verifica se esse é -ino intervalo 1..7. Gera um valor booleano verdadeiro / falso. Requer v3 + para o-in operador.

Casos de teste

PS C:\Tools\Scripts\golfing> 123,234,345,456,567,678,789|%{.\easy-as-one-two-three.ps1 $_}
True
True
True
True
True
True
True

PS C:\Tools\Scripts\golfing> 1,2,3,12,122,124,132,321,457,777,890,900,1011,1230,1234|%{.\easy-as-one-two-three.ps1 $_}
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
AdmBorkBork
fonte
2

Código da máquina ARM, 18 bytes

Despejo hexadecimal (little endian):

3803 d105 6808 ebc0 2010 b280 f2a0 1001 4770

Essa é uma função que possui um par de ponteiros de comprimento para a sequência. A saída é no estilo bash, gera 0 para true e um valor diferente de zero para false. Em C, a função seria declarada int oneTwoThree (size_t length, char * string). A codificação da instrução é thumb-2, que possui instruções de 2 e 4 bytes. Testado em um Raspberry Pi 3.

Montagem não destruída:

.syntax unified
.text
.global oneTwoThree
.thumb_func
oneTwoThree:
    @Input: r0 - the number of characters in the string
    @r1 - A pointer to the (not necessarily NUL-terminated)
    @string representation of the number (char*)
    @Output: r1 - 0 if the number is in 123,234,...,789, else non-zero (bash-style)
    subs r0,r0,#3
    bne end @Return non-zero if r0!=3
    ldr r0,[r1] @Remember that this is little endian
    @So the first digit is the most siginificant byte
    @I.e. if the input was 123 then r0 contains 0xXY010203 where XY is garbage

    rsb r0,r0,r0,lsr #8 @r0=(r0>>8)-r0 (rsb is reverse subtract)
    uxth r0,r0 @r0&=((1<<16)-1) (mask off top half)
    @Now r0 is 0x0101 iff we have a matching number
    sub r0,r0,#0x101
    @Now r0 is 0 iff the string fit the specification

    end:
    bx lr @return

Script de teste (também montagem):

.syntax unified
.text
.global main
.thumb_func
main:
    push {r4,lr}
    ldr r4,[r1,#4] @r0=argv[1]
    mov r0,r4
    bl strlen
    @Now r0 is the length of the string argv[1]
    mov r1,r4
    bl oneTwoThree @oneTwoThree(strlen(argv[1]),argv[1])
    cmp r0,#0
    it ne
    movne r0,#1 @Output through return code, 1 if false
    pop {r4,pc}
Ian Chew
fonte
2

JavaScript (ES6), 34 bytes

E mais uma opção em JS. Recebe entrada como uma sequência e gera 0para falsee 1para true.

n=>++n[0]==n[1]&++n[1]==n[2]&!n[3]

Veja minhas outras soluções aqui e aqui


Tente

f=
n=>++n[0]==n[1]&++n[1]==n[2]&!n[3]
i.addEventListener("input",_=>o.innerText=f(i.value))
<input id=i type=number><pre id=o>

Shaggy
fonte