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


35

Напишіть програму або функцію, яка приймає додатне ціле число. Ви можете припустити, що введення дійсне і може сприймати його як рядок. Якщо число будь-яке

123
234
345
456
567
678
789

потім виведіть значення " truthy" . В іншому випадку виведіть помилкове значення. Наприклад, входи

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

все повинно призвести до помилкового виходу. (Вхід не матиме провідних нулів, тому вам не потрібно турбуватися про такі речі 012.)

Виграє найкоротший код у байтах.


Ой, рядки дозволені? А що з цифровими масивами?
Денніс

@ Денніс Ні. Давайте будемо тримати це простими струнами або простими вставками.
Захоплення Кальвіна

6
Якщо я беру рядок введення, чи повинен я обробляти 012?
Лінн

1
@Lynn No. 012була б помилковою, але ви можете припустити, що це не вхід.
Захоплення Кальвіна

1
@ BradGilbertb2gills Ні. Це просто повинно задовольняти пов'язаному визначенню truthy / falesy
Хобі Кальвіна

Відповіді:


46

Пітон, 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

Пітон, 24 байти

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

Просто багато умов.


Вміючи порівнювати діапазон, який легко переможе будь-яку мову, яку я вже знаю. Мені довелося роздивитись, щоб побачити, як це працює.
GuitarPicker

Нічого собі, якби не слово, lambdaя б навіть не здогадувався, що це Пітон. Це жахливо.
Стів Беннетт

25

Хаскелл, 22 байти

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

Анонімна функція. Генерує рівномірно розташований список [123, 234, 345, 456, 567, 678, 789]і перевіряє, чи є вхідним елементом.


1
У жодному разі! Це магія!
YSC



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 не повертає помилки, хоча насправді нічого не повертає ...
Джеймі Баркер

Вхід повинен бути цілим числом. Що ast.literal_evalстосується, 012це не означає ціле число .
Денніс

7

05AB1E , 5 байт

¥XX‚Q

Пояснення

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

Спробуйте в Інтернеті


Я використовував 2Å1замість XX,, просто для чортовки менших команд (4 замість 5).
Ерік Аутгольфер

@ErikGolfer エ リ ッ ク ゴ ル フ ァ ー: і Åзаписується на моїй клавіатурі (на відміну від ), що є вигодою :)
Emigna

(не ,я, що я використовував) також не має послідовності клавіш із клавішею, хоча вона Åзнаходиться oAна клавіатурі en-US.
Ерік Аутгольфер

6

MATL , 8 байт

d1=tn2=*

Спробуйте в Інтернеті!

Це надрукується 1 1 для truthy введення та масив з a 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 whaaa? Як це навіть працює? Я не можу знайти документацію про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, які не є підрядками if "123456789", піднімуть NoMethodError.
Йорданія

@Jordan Я не отримую помилки в 2.2. Можливо, він теж новий у 2.3?
xsot

5

Мозок-Флак , 99 байт

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

Спробуйте в Інтернеті!

Це 98 байт коду +1для-a прапора.

Це відбитки 1для трити, або будь-якого 0або нічого (що еквівалентно 0) для хибної помилки


Спробуйте позбутися неефективності поп-попу. Я бачу купу у вашому коді. Вони схожі, ...)({}але змінюються. Якщо натиснути і попсувати, не використовуючи значення, ви можете конденсувати його в одне. Я можу прив’язати вас до версії вашого коду з усіма цими гольфами, якщо хочете.
Пшеничний майстер

Ось мій 76-байтний гольф вашої програми. Я в значній мірі провів оптимізатор моєго промальовування над вашим кодом з кількома спеціальними налаштуваннями.
Пшеничний майстер


4

Мозок-Флак , 114 байт

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

Спробуйте в Інтернеті!

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

Це не стопку чистою.

Алгоритм

Нехай вхід буде n.

Вихід є truthy iff (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
Тіт

@Titus О, дуже приємно, +1 тобі!
WallyWest

1
=> це ES6, а не ES5.
Ніл

1
Я вважаю, що мета-рішенням було вирішено, що вам не доведеться рахувати "f =", роблячи це 26 байтів
Charlie Wynn

1
@WallyWest Я думаю, що це тому, що не потрібно мати "f =", щоб використовувати функцію в кожному випадку, тож навіщо вважати, що вона потрібна саме для цього випадку? Люди розумніше, ніж я, вирішили, що це добре, тому я просто йду з цим;)
Charlie Wynn

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. Виводить булеве істинне / хибне значення. Потрібна 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 байт

Шестнадцятковий дамп (маленький ендіан):

3803 d105 6808 ebc0 2010 b280 f2a0 1001 4770

Це функція, яка займає довжину, вказівну пару для рядка. Вихід є в стилі bash, він виводить 0 для true та ненульове значення для false. У C функція буде оголошена int oneTwoThree (довжина_ розмір, довжина 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.