Tan fácil como uno, dos, tres


35

Escriba un programa o función que tome un entero positivo. Puede suponer que la entrada es válida y puede tomarla como una cadena. Si el número es cualquiera de

123
234
345
456
567
678
789

luego genera un valor verdadero . De lo contrario, genera un valor falso . Por ejemplo, las entradas

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

todo debe dar como resultado una salida falsa. (La entrada no tendrá ceros a la izquierda, por lo que no debe preocuparse por cosas como 012).

El código más corto en bytes gana.


Oh, las cuerdas están permitidas? ¿Qué pasa con las matrices de dígitos?
Dennis

@ Dennis No. Vamos a mantenerlo en cadenas simples o entradas simples.
Aficiones de Calvin

66
Si tomo la entrada de cadena, ¿debo manejar 012?
Lynn

1
@Lynn No. 012sería falso, pero puede suponer que no es una entrada.
Aficiones de Calvin

1
@ BradGilbertb2gills No. Simplemente debería satisfacer la definición vinculada de verdad / falsedad - meta.codegolf.stackexchange.com/questions/2190/…
Hobbies de Calvin

Respuestas:


46

Python, 24 bytes

range(123,790,111).count

Una función anónima que genera 0 o 1. Crea la lista [123, 234, 345, 456, 567, 678, 789]y cuenta cuántas veces aparece la entrada.

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

f(123)
=> 1
f(258)
=> 0

¿No podría eliminar un byte haciendo el inicio a las 12 en lugar de 123?
var firstName

1
No debe incluir 12.
xnor

¿Pero podemos suponer que no sería una entrada? Estoy confundido
var firstName

1
Si está hablando de los comentarios, están diciendo que si toma la entrada como una cadena (que no es así), puede esperar que los números no tengan ceros a la izquierda, por lo que 12 se dará como "12" y no " 012 ".
xnor

34

Python, 24 bytes

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

Solo muchas condiciones encadenando.


Poder comparar un rango que supera fácilmente cualquier idioma que ya conozco. Tuve que buscarlo para ver cómo funcionaba.
GuitarPicker

Wow, si no fuera por la palabra lambda, ni siquiera habría adivinado que era Python. Eso es horrible
Steve Bennett

25

Haskell, 22 bytes

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

Una función anónima. Genera la lista espaciada uniformemente [123, 234, 345, 456, 567, 678, 789]y comprueba si la entrada es un elemento.


1
¡De ninguna manera! Eso es magia!
YSC



8

Brain-Flak 76 + 3 = 79 bytes

Esta respuesta es un golf de esta respuesta. En realidad no sé cómo funciona mi respuesta, pero DJMcMayhem da una buena explicación en su respuesta original y mi respuesta es una modificación de la suya.

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

Se ejecuta con el indicador -a ascii que agrega 3 bytes.

Explicación (de algún tipo)

Comenzando con la solución de trabajo original:

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

Ejecuté esto a través de un algoritmo de golf simple que escribí y obtengo:

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

Desde aquí veo la sección que <({}[()()()])>{}esencialmente se multiplica por uno, lo que hace que sea igual {}[()()()]reducir todo el código a:

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

Por último, los negativos se pueden combinar:

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

14
"En realidad no sé cómo funciona mi respuesta" ganas en Internet
Leaky Nun


@LeakyNun No creo que el modo Ascii funcione en probarlo en línea. Tendrás que obtener la versión de github.
Wheat Wizard

1
El modo ASCII @WheatWizard definitivamente funciona en TIO. Puede verificar esto agregando 48 ('0') en la parte superior de la pila . Leaky nun tiene razón, el algoritmo ( mi algoritmo) está mal, porque solo comprueba si la suma de las diferencias es 2 (lo que funciona si la diferencia es +3 y -1). Lamentablemente, nuestras dos respuestas son incorrectas.
DJMcMayhem

1
@WheatWizard Esta respuesta no parece ser válida. Pruébalo en línea! (Mi respuesta original tampoco era)
DJMcMayhem


7

Jalea , 6 bytes

DI⁼1,1

Pruébalo en línea! o verificar todos los casos de prueba .

Cómo 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.

012 no devuelve falso, aunque en realidad no devuelve nada ...
Jamie Barker

La entrada tiene que ser un número entero. En lo que ast.literal_evalrespecta, 012no representa un número entero .
Dennis

7

05AB1E , 5 bytes

¥XX‚Q

Explicación

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

Pruébalo en línea


Utilicé en 2Å1lugar de XX,, solo por el heck de menos comandos (4 en lugar de 5).
Erik the Outgolfer

@ErikGolfer エ リ ッ ク ゴ ル フ ァ ー: y Åse puede escribir en mi teclado (en lugar de ) lo cual es un beneficio :)
Emigna

(no el ,que usé) no tiene una secuencia de teclas compuestas también, mientras Åestá oAen un teclado en-US.
Erik the Outgolfer

6

MATL , 8 bytes

d1=tn2=*

Pruébalo en línea!

Esto imprimirá 1 1para una entrada veraz y una matriz con un0 valor falso, ya que eso es falso en MATL.

Explicación:

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

Tal vez d1=Ep4=(no lo he probado a fondo)
Luis Mendo

1
O dTTX=por 5 bytes
Luis Mendo

@luismendo whaaa? ¿Cómo funciona eso? No puedo encontrar documentación sobreT
DJMcMayhem

Tes el literal truey Fes false. Vecinos Ty Funidos, así TTes [true true], lo que para estos propósitos es equivalente a [1 1]. Vea la sección 4.3 de la especificación
Luis Mendo

6

Java 7, 46 bytes

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

Después de probar varias cosas con Leaky Nun en el chat, esta parece ser la más corta. A veces solo tienes que hacer las cosas de la manera más sencilla: /

Explicación:

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? 
}

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)

Explicación:

# 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


5

Ruby, 32 30 25 + 2 = 27 bytes

+2 bytes para -nlbanderas.

Toma entrada en STDIN e imprime trueo false.

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

Véalo en repl.it: https://repl.it/DBn2/2 (Haga clic en ▶ ️ y luego escriba input en la consola a continuación).


Sus pruebas muestran que 12 va a ser verdad.
xnor

@xnor Vaya. Eso me enseñará a jugar golf después de dormir. ¡Fijo!
Jordan

Pensé que -ahace un split, no chop? Además, ¿qué hace el& ? Estoy usando un Ruby más antiguo que arroja un error. De todos modos, funciona perfectamente a 26 bytes sin él.
xsot

Vaya, quise decir -l, no -a. &.es el operador de "navegación segura", agregado en Ruby 2.3. Sin él, las entradas como 19, que no son subcadenas si "123456789", generarán un NoMethodError.
Jordan

@ Jordania No obtengo un error en 2.2. ¿Quizás es nuevo en 2.3 también?
xsot

5

Brain-Flak , 99 bytes

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

Pruébalo en línea!

Esto es 98 bytes de código +1para la -abandera.

Esto imprime 1para la verdad, y una 0o ninguna (que es equivalente a 0) para la falsedad


Trata de deshacerte de las ineficiencias de push pop. Puedo ver un montón en tu código. Parecen ...)({}pero varían. Si presiona y explota sin usar el valor, puede condensarlo en una sola cosa. Puedo vincularlo a una versión de su código con todos estos juegos de golf si lo desea.
Wheat Wizard

Aquí está mi 76 byte de golf de su programa. Prácticamente ejecuté mi optimizador Brain Flak sobre su código con algunas configuraciones personalizadas.
Wheat Wizard


4

Brain-Flak , 114 bytes

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

Pruébalo en línea!

Versión correcta (en el espíritu de la pregunta): toma el entero como entrada, salida 0 para falsey y 1 para verdadero.

Esto no es una pila limpia.

Algoritmo

Deje que la entrada sea n.

La salida es veraz iff (n-123)(n-234)(n-345)(n-456)(n-567)(n-678)(n-789)=0.

Calculé esos siete números restando primero 12 y luego restando 111 7 veces, y luego calculé el NOT lógico doble de esos siete números y los sumé.

Para resultados verdaderos, la suma es 6; para los resultados de falsey, la suma es 7.

Luego, resto la suma de 7 y envío la respuesta.


No entiendo el código, pero el algoritmo es inteligente, así que tenga un +1.
Cyoce

4

R, 30 22 bytes

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

No particularmente emocionante; compruebe si la entrada está en la secuencia dada por 12 + 111k, donde k es cada uno de 1 a 7. Tenga en cuenta que :precede a *la multiplicación después de que se genera la secuencia.


4

C # (compilador interactivo de Visual C #) , 41 30 23 bytes

Primera presentación de código de golf, sé amable :)

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

Pruébalo en línea!

  • -11 bytes gracias a Kirill L.
  • Otros -7 bytes gracias a ASCII-only.

1
Bienvenido a PPCG! Puede guardar algunos bytes soltando las llaves y la returnpalabra clave: 30 bytes
Kirill L.


1
Buena primera presentación!
Encarnación de la ignorancia

3

Brainfuck, 43 bytes

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

Bah, no soy bueno en esto. Salidas \x01Si la salida es una de las cadenas 123, 234, ..., 789; salidas de lo \x00contrario.

(Pero vencí a Java 7 ...)

Pruébalo en línea!


¿De qué sirve [>>]<? ¿No podría ser eso >?
DJMcMayhem

Quiero desviar el programa al fracaso (desviándolo) si la celda debajo del puntero no es cero en ese punto.
Lynn


@LeakyNun Eso se ve completamente diferente; siéntase libre de publicarlo como una respuesta por separado
Lynn


3

JavaScript ES6, 26 bytes

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

Esto aprovecha el hecho de que estoy usando operadores lógicos de bits en lo que son esencialmente booleanos (¡que están basados ​​en bits!)

Gracias a Titus por salvar 2.


1
dos bytes: (n-12)yn>99
Tito

@Titus ¡Oh, muy amable, +1 para ti!
WallyWest

1
=> es ES6, no ES5.
Neil

1
Creo que se decidió en meta que no tenía que contar "f =" haciendo estos 26 bytes
Charlie Wynn

1
@WallyWest Creo que es porque no es necesario tener "f =" para usar la función en todos los casos, entonces, ¿por qué asumir que la necesita para este caso? Las personas inteligentes que yo decidieron que está bien, así que simplemente voy con eso;)
Charlie Wynn

3

Excel - 62 57 35 31 bytes

Basado en la respuesta de Anastasiya-Romanova, pero devolviendo los TRUE/FALSEvalores de Excel .

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

Además, podemos llegar a

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

ya que ambos RIGHTyLEFT devuelve un solo carácter por defecto.

Y, inspirado en algunas de las soluciones de Python:

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

Gracias a Neil por 4 bytes más ...

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

No le N<900ahorra un byte, en cuyo caso también puede usarlo en N>99lugar de LEN(N)=3.
Neil

1
21 bytes: =REPT(LEFT(N),3)+12=Ndonde Nestá el nombre de la celda de referencia.
Engineer Toast

3

Brachylog (2), 7 bytes

ẹ~⟦₂-_2

Pruébalo en línea!

Explicación

ẹ~⟦₂-_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 programa completo, obtenemos un verdadero retorno si todas las afirmaciones se mantienen, un falso retorno si alguno falla.


3

CJam, 13 9 bytes

A,s3ewqe=

Pruébalo en línea!

Explicación

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.

55
no funciona si el número es como2345
Maltysen

@Maltysen fijo
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"))

Explicación:

La sintaxis para la fórmula IF en Excel es:

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

Si la longitud de la entrada N, donde es un nombre de la celda de referencia, es menor que 3, entonces devolverá Falsy . De lo contrario, si la longitud de entrada Nes 3 y la diferencia entre el segundo dígito y el primer dígito y la diferencia entre el tercer dígito y el segundo dígito son iguales a 1, entonces devolverá Verdad .


21 bytes: =REPT(LEFT(N),3)+12=Ndonde Nestá el nombre de la celda de referencia.
Engineer Toast

2

Dyalog APL , 10 bytes

Toma un argumento de cadena.

1 1≡¯2-/⍎¨

1 1≡ Es {1, 1} idéntico a

¯2-/ la diferencia inversa en pares de

⍎¨ cada personaje tomado como un número?

TryAPL en línea! ( ha sido emulado epor razones de seguridad).


2

Perl, 18 bytes

Incluye +1 para -p

Ejecutar con la entrada en STDIN

123.pl <<< 123

123.pl:

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

2

PHP, 31 bytes

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

Compruebe si el primer dígito de (número menos 12) es múltiplo de 111


2

PowerShell v3 +, 24 bytes

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

Utiliza el mismo truco "múltiplo de 111 más 12" que otras respuestas, pero va en la otra dirección. Toma entrada $args[0], resta 12, divide 111y comprueba si ese es -inel rango 1..7. Emite un valor booleano verdadero / falso. Requiere v3 + para-in operador.

Casos de prueba

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

2

Código de máquina ARM, 18 bytes

Hex dump (little endian):

3803 d105 6808 ebc0 2010 b280 f2a0 1001 4770

Esta es una función que toma un par de punteros de longitud para la cadena. La salida es de estilo bash, emite 0 para verdadero y un valor distinto de cero para falso. En C, la función se declararía int oneTwoThree (size_t length, char * string). La codificación de instrucciones es thumb-2, que tiene instrucciones de 2 y 4 bytes. Probado en una Raspberry Pi 3.

Asamblea sin golf:

.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 prueba (también ensamblado):

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

2

JavaScript (ES6), 34 bytes

Y una opción más en JS. Toma la entrada como una cadena y las salidas 0para falsey 1para true.

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

Vea mis otras soluciones aquí y aquí


Intentalo

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>

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.