Semudah Satu-Dua-Tiga


35

Tulis program atau fungsi yang menggunakan bilangan bulat positif. Anda dapat menganggap input tersebut valid dan dapat dianggap sebagai string. Jika nomornya salah

123
234
345
456
567
678
789

maka output truthy nilai. Jika tidak, hasilkan nilai palsu . Misalnya input

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

semua harus menghasilkan output yang salah. (Input tidak akan memiliki angka nol di depan sehingga Anda tidak perlu khawatir tentang hal-hal seperti 012.)

Kode terpendek dalam byte menang.


Oh, string diizinkan? Bagaimana dengan digit array?
Dennis

@ Dennis No. Mari kita simpan ke string biasa atau int sederhana.
Hobi Calvin

6
Jika saya mengambil input string, apakah saya harus menangani 012?
Lynn

1
@ Lynn No. 012akan menjadi palsu tetapi Anda dapat menganggap itu bukan input.
Hobi Calvin

1
@ BradGilbertb2gills No. Ini seharusnya hanya memenuhi definisi terkait dari truthy / falsy
Calvin Hobbies

Jawaban:


46

Python, 24 byte

range(123,790,111).count

Fungsi anonim yang menghasilkan 0 atau 1. Ini membuat daftar [123, 234, 345, 456, 567, 678, 789]dan menghitung berapa kali input muncul.

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

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

Tidak bisakah Anda menghapus byte dengan memulai pada 12 bukannya 123?
v first firstName

1
Perlu tidak termasuk 12.
xnor

Tapi kita bisa berasumsi itu bukan input? saya bingung
var firstName

1
Jika Anda berbicara tentang komentar, mereka mengatakan bahwa jika Anda mengambil input sebagai string (yang ini bukan), Anda dapat mengharapkan angka untuk tidak memiliki angka nol di depan, jadi 12 akan diberikan sebagai "12" dan bukan " 012 ".
xnor

34

Python, 24 byte

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

Hanya banyak kondisi chaining.


Mampu membandingkan rentang yang dengan mudah mengalahkan bahasa apa pun yang sudah saya ketahui. Saya harus mencarinya untuk melihat cara kerjanya.
GuitarPicker

Wow, kalau bukan karena kata itu lambdasaya bahkan tidak akan menebak itu adalah Python. Mengerikan sekali.
Steve Bennett

25

Haskell, 22 byte

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

Fungsi anonim. Menghasilkan daftar yang berjarak sama [123, 234, 345, 456, 567, 678, 789]dan memeriksa apakah input adalah elemen.


1
Tidak mungkin! Itu ajaib!
YSC



8

Brain-Flak 76 + 3 = 79 byte

Jawaban ini adalah golf dari jawaban ini . Saya sebenarnya tidak tahu persis bagaimana jawaban saya bekerja tetapi DJMcMayhem memberikan penjelasan yang baik dalam jawaban aslinya dan jawaban saya adalah modifikasi dari jawabannya.

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

Dijalankan dengan flag -a ascii yang menambahkan 3 byte.

Penjelasan (macam-macam)

Dimulai dengan solusi kerja asli:

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

Saya menjalankan ini melalui algoritma golf sederhana yang saya tulis dan dapatkan:

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

Dari sini saya melihat bagian <({}[()()()])>{}ini pada dasarnya dikalikan dengan satu yang membuatnya sama dengan {}[()()()]mengurangi seluruh kode menjadi:

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

Negatif terakhir dapat digabungkan:

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

14
"Saya benar-benar tidak tahu bagaimana jawaban saya bekerja" Anda memenangkan internet
Leaky Nun


@ LeakyNun Saya tidak percaya mode Ascii berfungsi untuk mencobanya online. Anda harus mendapatkan versi github.
Wheat Wizard

1
Mode @WheatWizard ASCII pasti berfungsi pada TIO. Anda dapat memverifikasi ini dengan menambahkan 48 ('0') ke atas tumpukan . Biarawati bocor benar, algoritma (algoritma saya ) salah, karena hanya memeriksa apakah jumlah perbedaannya adalah 2 (yang berfungsi jika perbedaannya adalah +3 dan -1). Sayangnya, kedua jawaban kami salah.
DJMcMayhem

1
@WheatWizard Jawaban ini sepertinya tidak valid. Cobalah online! (Jawaban saya yang asli juga tidak)
DJMcMayhem


7

Jelly , 6 byte

DI⁼1,1

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

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 tidak menghasilkan false, meskipun sebenarnya tidak mengembalikan apa-apa ...
Jamie Barker

Input harus berupa bilangan bulat. Sejauh ast.literal_evalmenyangkut, 012tidak mewakili bilangan bulat .
Dennis

7

05AB1E , 5 byte

¥XX‚Q

Penjelasan

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

Cobalah online


Saya menggunakan, 2Å1bukan XX,, hanya untuk heck of less command (4 bukannya 5).
Erik the Outgolfer

@ErikGolfer エ リ ッ ク ゴ ル フ ァ ー: dan Ådapat ditulisi di keyboard saya (yang bertentangan dengan ) yang merupakan manfaat :)
Emigna

(bukan yang ,saya gunakan) tidak memiliki urutan tombol penulisan juga, saat Åberada oApada keyboard en-US.
Erik the Outgolfer

6

MATL , 8 byte

d1=tn2=*

Cobalah online!

Ini akan mencetak 1 1untuk input yang benar, dan sebuah array dengan a0 di dalamnya untuk nilai falsy, karena itu falsy di MATL.

Penjelasan:

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

Mungkin d1=Ep4=(saya belum diuji secara menyeluruh)
Luis Mendo

1
Atau dTTX=selama 5 byte
Luis Mendo

@luismendo whaaa? Bagaimana cara kerjanya? Saya tidak dapat menemukan dokumentasi padaT
DJMcMayhem

Tadalah literal yang true, dan Fini false. Tetangga Tdan Fbersatu, begitu TTpula [true true], yang untuk tujuan ini setara dengan [1 1]. Lihat bagian 4.3 dari spec
Luis Mendo

6

Java 7, 46 byte

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

Setelah mencoba beberapa hal dengan Leaky Nun dalam obrolan, ini sepertinya yang terpendek. Terkadang Anda hanya perlu melakukan hal-hal dengan cara langsung: /

Penjelasan:

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 byte

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

Penjelasan:

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

Pemakaian:

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 byte

+2 byte untuk -nlbendera.

Mengambil input pada STDIN dan mencetak trueatau false.

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

Lihat di repl.it: https://repl.it/DBn2/2 (Klik ▶ ️ lalu ketik input ke konsol di bawah ini.)


Tes Anda menunjukkan 12 menjadi kenyataan.
xnor

@xnor Ups. Itu akan mengajari saya bermain golf setelah tidur. Tetap!
Jordan

Saya pikir -atidak split, bukan chop? Juga, apa fungsinya &? Saya menggunakan Ruby yang lebih lama yang menyebabkan kesalahan. Bagaimanapun, ini bekerja dengan sempurna pada 26 byte tanpa itu.
xsot

Ups, maksudku -l, tidak -a. &.adalah operator "navigasi aman", ditambahkan dalam Ruby 2.3. Tanpa itu input seperti 19, yang bukan substring jika "123456789", akan memunculkan NoMethodError.
Jordan

@ Jordan, saya tidak mendapatkan kesalahan di 2.2. Mungkin itu baru di 2.3 juga?
xsot

5

Brain-Flak , 99 byte

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

Cobalah online!

Ini adalah 98 byte kode +1untuk-a flag.

Ini mencetak 1untuk truey, dan salah satu 0atau tidak sama sekali (yang setara dengan 0) untuk falsy


Cobalah untuk menyingkirkan ketidakefisienan push pop. Saya dapat melihat banyak kode Anda. Mereka terlihat ...)({}tetapi bervariasi. Jika Anda mendorong dan meletus tanpa menggunakan nilai, Anda dapat memadatkannya menjadi satu hal. Saya dapat menautkan Anda ke versi kode Anda dengan semua ini di-golf jika Anda mau.
Wheat Wizard

Ini golf 76 byte saya dari program Anda. Saya menjalankan pengoptimal otak atas kode Anda dengan beberapa pengaturan khusus.
Wheat Wizard


4

Brain-Flak , 114 byte

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

Cobalah online!

Versi yang benar (dalam semangat pertanyaan): mengambil integer sebagai input, output 0 untuk falsey dan 1 untuk truey.

Ini bukan tumpukan bersih.

Algoritma

Biarkan inputnya n.

Outputnya benar jika (n-123)(n-234)(n-345)(n-456)(n-567)(n-678)(n-789)=0.

Saya menghitung tujuh angka tersebut dengan pertama-tama mengurangkan 12 dan kemudian mengurangi 111 7 kali, dan kemudian menghitung double-NOT logis dari tujuh angka itu dan menambahkannya.

Untuk hasil yang benar, jumlahnya adalah 6; untuk hasil falsey, jumlahnya adalah 7.

Kemudian, saya mengurangi jumlah dari 7 dan mengeluarkan jawabannya.


Saya tidak mengerti kodenya, tetapi algoritmenya pintar sehingga ada +1.
Cyoce

4

R, 30 22 byte

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

Tidak terlalu mengasyikkan; periksa apakah input dalam urutan yang diberikan oleh 12 + 111k, di mana k adalah masing-masing dari 1 hingga 7. Perhatikan bahwa :mendahului *sehingga perkalian terjadi setelah urutan dihasilkan.


4

C # (Visual C # Interactive Compiler) , 41 30 23 byte

Pengajuan kode-golf pertama, bersikap lembut :)

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

Cobalah online!

  • -11 byte berkat Kirill L.
  • Lain -7 byte berkat ASCII saja.

1
Selamat datang di PPCG! Anda dapat menyimpan beberapa byte dengan menjatuhkan kurung kurawal dan returnkata kunci: 30 byte
Kirill L.


1
Pengiriman pertama yang bagus!
Perwujudan Ketidaktahuan

3

Brainfuck, 43 byte

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

Bah, aku tidak pandai dalam hal ini. Output \x01jika output adalah salah satu string 123, 234, ..., 789; output \x00sebaliknya.

(Saya mengalahkan Java 7, meskipun ...)

Cobalah online!


Apa gunanya [>>]<? Tidak bisakah itu terjadi >?
DJMcMayhem

Saya ingin membelokkan program ke kegagalan (dengan melemparkannya keluar jalur) jika sel di bawah pointer tidak nol pada saat itu.
Lynn


@ LeakyNun Itu terlihat sangat berbeda; jangan ragu untuk mempostingnya sebagai jawaban terpisah
Lynn


3

JavaScript ES6, 26 byte

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

Ini mengambil keuntungan dari fakta bahwa saya menggunakan operator logika bit-wise pada apa yang pada dasarnya boolean (yang berbasis bit!)

Terima kasih kepada Titus karena telah menabung 2.


1
dua byte: (n-12)dann>99
Titus

@Itus Oh, sangat bagus, +1 untuk Anda!
WallyWest

1
=> adalah ES6, bukan ES5.
Neil

1
Saya percaya diputuskan dalam meta bahwa Anda tidak harus menghitung "f =" membuat 26 byte ini
Charlie Wynn

1
@WallyWest Saya pikir itu karena tidak perlu memiliki "f =" untuk menggunakan fungsi dalam setiap kasus, jadi mengapa menganggap Anda membutuhkannya untuk kasus ini? Orang-orang yang pandai daripada saya memutuskan tidak apa-apa jadi saya ikut saja;)
Charlie Wynn

3

Excel - 62 57 35 31 byte

Berdasarkan jawaban Anastasiya-Romanova, tetapi mengembalikan TRUE/FALSEnilai Excel .

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

Selanjutnya, kita bisa sampai

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

karena keduanya RIGHTdan LEFTmengembalikan satu karakter secara default.

Dan, terinspirasi oleh beberapa solusi Python:

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

Terima kasih kepada Neil untuk 4 byte lagi ...

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

Tidak N<900menghemat byte, dalam hal ini Anda juga dapat menggunakan N>99bukan LEN(N)=3.
Neil

1
21 byte: di =REPT(LEFT(N),3)+12=Nmana Nadalah nama sel referensi.
Engineer Toast

3

Brachylog (2), 7 byte

ẹ~⟦₂-_2

Cobalah online!

Penjelasan

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

Sebagai program penuh, kami mendapatkan pengembalian yang benar jika semua pernyataan tetap, sebuah pengembalian palsu jika ada yang gagal.


3

CJam, 13 9 byte

A,s3ewqe=

Cobalah online!

Penjelasan

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
tidak berfungsi jika angka seperti2345
Maltysen

@Maltysen Fixed
Business Cat

2

Excel - 104 byte

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

Penjelasan:

Sintaks untuk rumus IF di Excel adalah:

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

Jika panjang input N, yang merupakan nama sel referensi, kurang dari 3, maka itu akan mengembalikan Falsy . Lain, jika panjang input Nadalah 3 dan kedua selisih dari digit kedua dan digit pertama dan selisih dari digit ketiga dan digit kedua sama dengan 1, maka itu akan mengembalikan Truthy .


21 byte: di =REPT(LEFT(N),3)+12=Nmana Nadalah nama sel referensi.
Engineer Toast

2

Dyalog APL , 10 byte

Membawa argumen string.

1 1≡¯2-/⍎¨

1 1≡ Apakah {1, 1} identik dengan

¯2-/ perbedaan pasangan-bijaksana terbalik

⍎¨ setiap karakter diambil sebagai angka?

TryAPL online! ( telah ditiru dengan ealasan keamanan.)


2

Perl, 18 byte

Termasuk +1 untuk -p

Jalankan dengan input pada STDIN

123.pl <<< 123

123.pl:

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

2

PHP, 31 byte

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

Periksa apakah digit pertama (angka minus 12) adalah kelipatan dari 111


2

PowerShell v3 +, 24 byte

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

Gunakan trik "kelipatan 111 ditambah 12" yang sama dengan beberapa jawaban lain, tetapi lakukan sebaliknya. Mengambil input $args[0], mengurangi 12, membagi dengan 111, dan memeriksa apakah itu -inkisarannya 1..7. Menghasilkan nilai true / false Boolean. Membutuhkan v3 + untuk-in operator.

Uji Kasus

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

Kode Mesin ARM, 18 byte

Hex dump (little endian):

3803 d105 6808 ebc0 2010 b280 f2a0 1001 4770

Ini adalah fungsi yang membutuhkan panjang, pasangan pointer untuk string. Outputnya bergaya bash, output 0 untuk true dan nilai bukan nol untuk false. Dalam C fungsi akan dinyatakan int oneTwoThree (size_t length, char * string). Pengkodean instruksi adalah ibu jari-2, yang memiliki instruksi 2 dan 4 byte. Diuji pada Raspberry Pi 3.

Perakitan tidak serasi:

.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

Skrip pengujian (juga rakitan):

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

Dan satu opsi lagi di JS. Mengambil input sebagai string dan output 0untuk falsedan 1untuk true.

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

Lihat solusi saya yang lain di sini dan di sini


Cobalah

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>

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.