Так же просто, как один-два-три


35

Напишите программу или функцию, которая принимает положительное целое число. Вы можете предположить, что ввод действителен и может принимать его как строку. Если номер любой из

123
234
345
456
567
678
789

затем выведите истинное значение. В противном случае выведите ложное значение. Например, входы

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

все должно привести к ложному выводу. (Входные данные не будут иметь начальных нулей, поэтому вам не нужно беспокоиться о таких вещах, как 012.)

Самый короткий код в байтах побеждает.


О, строки разрешены? Как насчет цифровых массивов?
Деннис

@ Денис Нет. Давайте держать это в простых строках или простых целочисленных значениях.
Увлечения Кэлвина

6
Если я беру строковый ввод, я должен обработать 012?
Линн

1
@ Линн Нет. 012Будет ложно, но вы можете предположить, что это не вход.
Увлечения Кэлвина

1
@ BradGilbertb2gills Нет. Это должно просто удовлетворять связанному определению правды / фальши - meta.codegolf.stackexchange.com/questions/2190/…
Увлечения Calvin's

Ответы:


46

Python, 24 байта

range(123,790,111).count

Анонимная функция, которая выводит 0 или 1. Она создает список [123, 234, 345, 456, 567, 678, 789]и подсчитывает, сколько раз вводится.

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

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

Не могли бы вы удалить байт, начав с 12 вместо 123?
var firstName

1
Это не должно включать 12.
xnor

Но мы можем предположить, что это не будет вход? Я в замешательстве
var firstName

1
Если вы говорите о комментариях, они говорят, что если вы берете ввод как строку (что не является), вы можете ожидать, что числа не будут иметь начальных нулей, поэтому 12 будет дано как "12", а не " 012" .
xnor

34

Python, 24 байта

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

Просто много условий цепочки.


Возможность сравнивать диапазон, который легко превосходит любой язык, который я уже знаю. Я должен был посмотреть, как это работает.
GuitarPicker

Ого, если бы не было слова, lambdaя бы даже не догадался, что это Python. Это ужасно
Стив Беннетт

25

Haskell, 22 байта

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

Анонимная функция. Создает равномерно распределенный список [123, 234, 345, 456, 567, 678, 789]и проверяет, является ли ввод элементом.


1
Ни за что! Это волшебство!
МСК

12

Брахилог , 9 байт

h:2j:12+?

Попробуйте онлайн! или Проверьте все контрольные примеры.

Кредиты Денису за алгоритм .

По-английски: «(докажите, что) первая цифра входа, соединенная с ним дважды, добавьте 12, по-прежнему является входом».


1
Это великолепно!
Датагод


8

Brain-Flak 76 + 3 = 79 байт

Этот ответ - гольф этого ответа. На самом деле я не совсем понимаю, как работает мой ответ, но DJMcMayhem дает хорошее объяснение в своем первоначальном ответе, и мой ответ является его модификацией.

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

Он запускается с флагом -a ascii, добавляющим 3 байта.

Пояснение (сортов)

Начиная с оригинального рабочего решения:

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

Я запускаю это через простой алгоритм игры в гольф, который я написал, и получаю:

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

Отсюда я вижу раздел, который по <({}[()()()])>{}существу умножается на единицу, что делает его равным {}[()()()]уменьшению всего кода до:

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

Наконец негативы могут быть объединены:

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

14
«На самом деле я не совсем понимаю, как работает мой ответ», вы выигрываете Интернет
Leaky Nun


@LeakyNun Я не верю, что режим Ascii работает, попробуйте онлайн. Вы собираетесь получить версию GitHub.
Волшебник Пшеницы

1
Режим @WheatWizard ASCII определенно работает на TIO. Вы можете убедиться в этом, добавив 48 ('0') к вершине стека . Дрянная монахиня права, алгоритм ( мой алгоритм) неверен, потому что он просто проверяет, равна ли сумма разностей 2 (что работает, если разница равна +3 и -1). К сожалению, оба наших ответа неверны.
DJMcMayhem

1
@WheatWizard Этот ответ не является действительным. Попробуйте онлайн! (Мой оригинальный ответ тоже не был)
DJMcMayhem


7

Желе , 6 байт

DI⁼1,1

Попробуйте онлайн! или проверьте все контрольные примеры .

Как это работает

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 не возвращает false, хотя фактически ничего не возвращает ...
Джейми Баркер

Ввод должен быть целым числом. Что ast.literal_evalкасается, 012не представляет собой целое число .
Денис

7

05AB1E , 5 байтов

¥XX‚Q

объяснение

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

Попробуйте онлайн


Я использовал 2Å1вместо XX,, просто для чертовски меньше команд (4 вместо 5).
Эрик Outgolfer

@ErikGolfer and リ ッ ク ゴ ル フ ァ ー: и Åдоступен для записи на моей клавиатуре (в отличие от ), что является преимуществом :)
Emigna

(не тот, который ,я использовал) также не имеет последовательности клавиш для составления, в то время Åкак oAна клавиатуре en-US.
Эрик Outgolfer

6

MATL , 8 байт

d1=tn2=*

Попробуйте онлайн!

Это будет печатать 1 1для достоверного ввода, и массив с 0в нем для ложного значения, так как это ложно в MATL.

Объяснение:

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

Возможно d1=Ep4=(я не проверил полностью)
Луис Мендо

1
Или dTTX=для 5 байтов
Луис Мендо

@luismendo аааа? Как это вообще работает? Я не могу найти документацию поT
DJMcMayhem

Tэто буквальное trueи Fесть false. Соседние Tи Fслипаются, так что TTесть [true true], что для этих целей эквивалентно [1 1]. См. Раздел 4.3 спецификации
Луис Мендо

6

Java 7, 46 байт

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

После нескольких попыток с Leaky Nun в чате, это кажется самым коротким. Иногда вам просто нужно делать вещи простым способом: /

Объяснение:

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 байт

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

Объяснение:

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

Использование:

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

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

say (  *∈(123,234...789)  )( 789 ); # True


5

Рубин, 32 30 25 + 2 = 27 байт

+2 байта для -nlфлагов.

Принимает ввод на STDIN и печатает trueили false.

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

Смотрите его на repl.it: https://repl.it/DBn2/2 (Нажмите ▶ ️, а затем введите ввод в консоли ниже.)


Ваши тесты показывают, что 12 собирается стать правдой.
xnor

@xnor Ой. Это научит меня играть в гольф после сна. Исправлена!
Джордан

Я думал -aделает split, не chop? Кроме того, что делает &? Я использую более старый Ruby, который выдает ошибку. Во всяком случае, он прекрасно работает на 26 байтов без него.
xsot

Ой, я имел в виду -l, нет -a. &.является оператором "безопасной навигации", добавлен в Ruby 2.3. Без этого вводы вроде 19, которые не являются подстроками, если "123456789", вызовут ошибку NoMethodError.
Джордан

@ Джордан Я не получаю ошибку в 2.2. Может быть, он тоже новый в 2.3?
xsot

5

Brain-Flak , 99 байтов

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

Попробуйте онлайн!

Это 98 байт кода +1для -aфлага.

Это печатает 1для правды, и либо 0или ничего (что эквивалентно 0) для фальсификации


Попытайтесь избавиться от неэффективности толчка популярности. Я вижу кучу в вашем коде. Они похожи, ...)({}но различаются. Если вы нажмете и выскочит без использования значения, вы можете сжать его в одну вещь. Я могу связать вас с версией вашего кода со всеми этими играми в гольф, если хотите.
Пшеничный волшебник

Вот мой 76-байтовый гольф вашей программы. Я в значительной степени проверил мой оптимизатор мозговых ошибок над вашим кодом с несколькими пользовательскими настройками.
Пшеничный Волшебник


4

Brain-Flak , 114 байт

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

Попробуйте онлайн!

Правильная версия (в духе вопроса): принимает целое число в качестве входных данных, выводит 0 для фальси и 1 для истинного.

Это не чистый стек.

Алгоритм

Пусть вход будет n.

Вывод правдив, если (n-123)(n-234)(n-345)(n-456)(n-567)(n-678)(n-789)=0.

Я вычислил эти семь чисел, сначала вычтя 12, а затем вычти 111 7 раз, а затем вычислил логическое двойное НЕ из этих семи чисел и сложил их.

Для достоверных результатов сумма равна 6; для результатов фальси сумма равна 7.

Затем я вычитаю сумму из 7 и вывожу ответ.


Я не понимаю код, но алгоритм умный, поэтому +1.
Cyoce

4

R, 30 22 байта

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

Не особенно захватывающе; проверьте, находится ли вход в последовательности, заданной 12 + 111k, где k - каждый от 1 до 7. Обратите внимание, что :предшествует, *поэтому умножение происходит после генерации последовательности.


4

C # (интерактивный компилятор Visual C #) , 41 30 23 байта

Первая подача кода на гольф, будьте нежнее :)

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

Попробуйте онлайн!

  • -11 байт благодаря Кириллу Л.
  • Еще -7 байт благодаря ASCII-только.

1
Добро пожаловать в PPCG! Вы можете сохранить несколько байтов, опустив фигурные скобки и returnключевое слово: 30 байтов
Кирилл Л.


1
Хорошая первая подача!
Воплощение Невежества

3

Brainfuck, 43 байта

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

Бах, я не очень хорош в этом. Выходы , \x01если выход является одной из строк 123, 234..., 789; выводит \x00иначе.

(Я бью Java 7, хотя ...)

Попробуйте онлайн!


Какой смысл [>>]<? Разве это не может быть просто >?
DJMcMayhem

Я хочу повернуть программу в сбой (выбрасывая ее с пути), если ячейка под указателем не равна нулю в этой точке.
Линн


@ LeakyNun Это выглядит совершенно иначе; не стесняйтесь размещать это как отдельный ответ
Линн


3

JavaScript ES6, 26 байт

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

Это использует тот факт, что я использую побитовые логические операторы для того, что по сути является логическим (которые основаны на битах!)

Спасибо Титу за спасение 2.


1
два байта: (n-12)иn>99
Тит

@ Титус О, очень мило, +1 тебе!
WallyWest

1
=> это ES6, а не ES5.
Нил

1
Я полагаю, что в мета было решено, что вам не нужно считать «f =», делающим это 26 байтов
Чарли Уинн

1
@WallWest Я думаю, это потому, что необязательно иметь «f =», чтобы использовать функцию в каждом случае, так зачем же вам она нужна для этого случая? Люди умнее меня решили, что все в порядке, поэтому я просто пойду с этим;)
Чарли Уинн

3

Excel - 62 57 35 31 байт

Основано на ответе Анастасии-Романовой, но возвращает TRUE/FALSEзначения Excel .

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

Далее мы можем добраться до

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

поскольку оба RIGHTи LEFTвозвращают один символ по умолчанию.

И, вдохновленный некоторыми решениями Python:

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

Спасибо Нейлу за еще 4 байта ...

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

Не N<900экономит байт, в этом случае вы также можете использовать N>99вместо LEN(N)=3.
Нил

1
21 байт: =REPT(LEFT(N),3)+12=Nгде Nнаходится имя ссылочной ячейки.
Инженер Тост

3

Брахилог (2), 7 байт

ẹ~⟦₂-_2

Попробуйте онлайн!

объяснение

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

Как полная программа, мы получаем правдивое возвращение, если все утверждения верны, ложное возвращение в случае неудачи.



2

Excel - 104 байта

=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"))

Объяснение:

Синтаксис формулы IF в Excel:

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

Если длина ввода N, где это имя ссылочной ячейки, меньше 3, то она вернет Falsy . Иначе, если длина ввода Nравна 3, а разность второй цифры и первой цифры, а также разница третьей и второй цифры равна 1, возвращается значение « Истина» .


21 байт: =REPT(LEFT(N),3)+12=Nгде Nнаходится имя ссылочной ячейки.
Инженер Тост


2

Perl, 18 байт

Включает +1 для -p

Запустить с вводом на STDIN

123.pl <<< 123

123.pl:

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

2

PHP, 31 байт

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

Проверьте, является ли первая цифра (число минус 12) кратной 111


2

PowerShell v3 +, 24 байта

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

Использует тот же трюк «кратно 111 плюс 12», что и некоторые другие ответы, но идет в другом направлении. Принимает входные данные $args[0], вычитает 12, делит на 111и проверяет, является ли это -inдиапазон1..7 . Выводит логическое значение true / false. Требуется v3 + для -inоператора.

Тестовые случаи

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

Машинный код ARM, 18 байт

Шестнадцатеричный дамп (little endian):

3803 d105 6808 ebc0 2010 b280 f2a0 1001 4770

Эта функция принимает пару указателей длины для строки. Вывод в стиле bash, он выводит 0 для true и ненулевое значение для false. В Си функция будет объявлена ​​int oneTwoThree (длина size_t, строка char *). Кодировка команды - thumb-2, в которой есть 2- и 4-байтовые инструкции. Проверено на Raspberry Pi 3.

Неуправляемая сборка:

.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

Скрипт тестирования (также сборка):

.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 байта

И еще один вариант в JS. Принимает ввод как строку и выводит 0для falseи 1для true.

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

Смотрите мои другие решения здесь и здесь


Попытайся

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>

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.