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

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
XNOR
источник
Не могли бы вы удалить байт, начав с 12 вместо 123?
var firstName
1
Это не должно включать 12.
xnor
Но мы можем предположить, что это не будет вход? Я в замешательстве
var firstName
1
Если вы говорите о комментариях, они говорят, что если вы берете ввод как строку (что не является), вы можете ожидать, что числа не будут иметь начальных нулей, поэтому 12 будет дано как "12", а не " 012" .
xnor
34

Python, 24 байта

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

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

Sp3000
источник
Возможность сравнивать диапазон, который легко превосходит любой язык, который я уже знаю. Я должен был посмотреть, как это работает.
GuitarPicker
Ого, если бы не было слова, lambdaя бы даже не догадался, что это Python. Это ужасно
Стив Беннетт
25

Haskell, 22 байта

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

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

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

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

h:2j:12+?

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

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

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

Дрянная Монахиня
источник
1
Это великолепно!
Датагод
11

Python 2, 25 байт

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

Проверьте это на Ideone .

Деннис
источник
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]

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

Emigna
источник
Я использовал 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
DJMcMayhem
источник
Возможно 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? 
}
Geobits
источник
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
Брэд Гилберт b2gills
источник
6

Сетчатка , 26

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

Выходы 1 для правды и 0 для фальси.

Попробуйте онлайн (добавлена ​​первая строка, позволяющая запускать несколько тестовых случаев).

Цифровая травма
источник
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) для фальсификации

DJMcMayhem
источник
Попытайтесь избавиться от неэффективности толчка популярности. Я вижу кучу в вашем коде. Они похожи, ...)({}но различаются. Если вы нажмете и выскочит без использования значения, вы можете сжать его в одну вещь. Я могу связать вас с версией вашего кода со всеми этими играми в гольф, если хотите.
Пшеничный волшебник
Вот мой 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. Обратите внимание, что :предшествует, *поэтому умножение происходит после генерации последовательности.

JDL
источник
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-только.
Loxx
источник
1
Добро пожаловать в PPCG! Вы можете сохранить несколько байтов, опустив фигурные скобки и returnключевое слово: 30 байтов
Кирилл Л.
1
23 , также 23
только ASCII
1
Хорошая первая подача!
Воплощение Невежества
3

Brainfuck, 43 байта

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

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

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

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

Линн
источник
Какой смысл [>>]<? Разве это не может быть просто >?
DJMcMayhem
Я хочу повернуть программу в сбой (выбрасывая ее с пути), если ячейка под указателем не равна нулю в этой точке.
Линн
42 байта
Утренняя монахиня
@ 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)
dulrich
источник
Не 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

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


источник
3

CJam, 13 9 байтов

A,s3ewqe=

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

объяснение

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.
Бизнес Кот
источник
5
не работает, если число похоже2345
Maltysen
@Maltysen Fixed
Business Cat
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

Dyalog APL , 10 байт

Принимает строковый аргумент.

1 1≡¯2-/⍎¨

1 1≡ {1, 1} идентично

¯2-/ обратная попарная разница

⍎¨ каждый символ принят как число?

Попробуй APL онлайн! ( был эмулирован в eцелях безопасности.)

Адам
источник
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
AdmBorkBork
источник
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>

мохнатый
источник