Jadilah yang Pertama (tinggalkan hanya Kebenaran pertama)

47

Intro

Setiap tahun, Dyalog Ltd. mengadakan kompetisi siswa. Tantangannya adalah untuk menulis kode APL yang baik . Ini adalah edisi bahasa agnostik dari masalah kedelapan tahun ini.

Saya memiliki izin eksplisit untuk mengirimkan tantangan ini di sini dari penulis asli kompetisi. Jangan ragu untuk memverifikasi dengan mengikuti tautan yang disediakan dan menghubungi penulis.

Masalah

Diberikan daftar Boolean *, "matikan" semua Kebenaran setelah Kebenaran pertama.

Tidak Ada Kebenaran? Tidak masalah! Cukup kembalikan daftar yang tidak dimodifikasi.

Contohnya

[falsy,truthy,falsy,truthy,falsy,falsy,truthy][falsy,truthy,falsy,falsy,falsy,falsy,falsy]

[][]

[falsy,falsy,falsy,falsy][falsy,falsy,falsy,falsy]


* Semua kebenaran Anda harus identik, dan semua kesalahan Anda harus identik. Ini termasuk output.

Adm
sumber
2
Bisakah kita menggunakan daftar bit atau representasi daftar kebenaran / kepalsuan lainnya yang lebih alami dalam bahasa pilihan kita?
Martin Ender
1
Ya, jika Anda berbicara tentang "kebenaran" dan "kepalsuan" dalam tantangan alih-alih "boolean", "benar" dan "salah". ;)
Martin Ender
1
Saya tidak jelas tentang boolean. Bisakah kita menggunakan 0/1 bahkan jika bahasa kita memiliki Benar / Salah?
xnor
1
@xnor Ah, poin bagus. Saya pikir akan adil untuk mengizinkan memilih input, tetapi output harus cocok, bukan begitu?
Adm
1
@ xnor Aku mendengarmu, tetapi jika Haskell tidak dapat memperlakukan angka sebagai Boolean, atau tidak bisa melakukan aritmatika pada Boolean, maka itu adalah batasan nyata dalam kekuatan golf Haskell, dan harus tercermin dalam hitungan byte dengan mengharuskan konversi atau pekerjaan lain -lintas. Apa pendapat Anda tentang formulasi catatan kaki?
Adm

Jawaban:

36

Python 2 , 35 byte

while 1:b=input();print b;True&=b<1

Cobalah online! Input dan output adalah garis Benar / Salah.

Berdasarkan solusi Dennis . Mengubah variabel Truemenjadi Falsesetelah Truemasukan ditemui. Dengan begitu, setiap masukan lebih lanjut Trueakan dievaluasi Falsedan dicetak seperti itu.

Redefinisi adalah True&=b<1, yaitu True = True & (b<1). Ketika input badalah True, maka (b<1)adalah False (karena True==1), sehingga Truemenjadi False.

Tidak
sumber
19
Anda dapat mendefinisikan ulang Benar ??? Ini layak diberi +1 hanya karena hax> _>
HyperNeutrino
1
@HyperNeutrino Ya, tetapi tidak dalam Python 3. (Yang tidak masalah karena bahasa di sini adalah Python 2.)
Brian McCutchon
@BrianMcCutchon Oke terima kasih. Itu aneh sekali ...
HyperNeutrino
@HyperNeutrino Mungkin perlu disebutkan bahwa Anda dapat melakukannya True, False = False, True.
Brian McCutchon
1
@HyperNeutrino - nggak. Builtin masih mengembalikan nilai 'nyata', hanya 'Benar' yang Anda ketik berubah. (Atau modul, dalam beberapa kasus ...). Jadi bool (1) mengembalikan True, tetapi bool (1) == Benar mengembalikan False.
TLW
30

APL , 2 byte

<\

Mengevaluasi fungsi "memindai menggunakan kurang dari". Cobalah online!

Penjelasan

Dalam APL, operator \(pemindaian) mengurangi setiap awalan nonempty dari array dari kanan menggunakan fungsi yang disediakan. Sebagai contoh, mengingat array 0 1 0, ia menghitung 0(awalan panjang 1), 0<1(awalan panjang 2) dan 0<(1<0)(awalan panjang 2) dan menempatkan hasilnya ke array baru; kurung kaitkan ke kanan. Mengurangi dengan <dari hasil yang tepat 1tepat ketika elemen terakhir dari array 1dan sisanya 0, jadi awalan yang sesuai dengan yang paling kiri 1dikurangi menjadi 1dan yang lainnya menjadi 0.

Zgarb
sumber
Akhirnya! Saya bertanya-tanya.
Adm
Sekarang saya kira Anda bisa menjawab dalam J juga, bukan?
Adm
@ Adám Ya, dalam J itu 3 byte: </ \ Jelly mungkin memiliki solusi 2-byte analog juga.
Zgarb
Tidak, kurasa tidak, karena Jelly dari kiri ke kanan.
Adm
Anda harus memposting jawaban bahasa terpisah sebagai posting terpisah.
Adm
22

Aceto , 19 17 bytes tidak bersaing

Versi baru (17 byte):

Versi baru ini mengambil karakter satu per satu dan paling baik dijalankan dengan -Fopsi. Ia bekerja serupa, tetapi tidak identik dengan solusi sebelumnya:

 >,
Op0
p|1u
,ip^

Jawaban lama (19 byte):

(Non-bersaing karena saya harus memperbaiki dua bug pada penerjemah)

|p1u
iOp<
|!`X
rd!r

Ini adalah jawaban Aceto pertama yang menyoroti apa yang bisa dilakukan dengan relatif baik, menurut saya. "Daftar" adalah aliran input, dengan satu input per baris, "1" untuk true, dan "0" untuk false, dengan string kosong yang menandakan akhir daftar.

ilustrasi aliran kode

Program Aceto berjalan pada kurva Hilbert, mulai dari kiri bawah, dan berakhir di kanan bawah. Pertama, kita rmenghasilkan string, dmeng-uplicate, dan meniadakan ( !) itu, mengubah string kosong menjadi True, yang lainnya menjadi False. Lalu ada mirror horizontal bersyarat ( |): Jika elemen teratas pada stack benar, mirror horizontal. Ini terjadi ketika string kosong. Jika kita melakukan mirroring, kita mendarat di X, yang membunuh penerjemah.

Kalau tidak, kita mengonversi salinan yang tersisa pada tumpukan ke integer dan melakukan mirror horizontal bersyarat lainnya: Kali ini, karena 1 benar dan 0 palsu, kita mirror jika kita melihat nilai sebenarnya (pertama). Jika kita tidak mirror (jadi kita melihat 0) kita pmematahkan apa yang ada di stack (karena stack kosong, nol) dan melompat ke Origin kurva, di mana kita mulai, memulai seluruh proses lagi.

Kalau tidak, ketika kita melihat 1, kita mirror dan mendarat di u, yang membalikkan arah kita bergerak pada kurva Hilbert. 1pmencetak 1, dan sekarang kita melanjutkan hal yang sama Okita akan pergi jika kita melihat 0, tetapi karena kita berada dalam "mode terbalik", asal kita berada di kanan bawah , jadi kita lompat ke sana.

Sekarang kita punya rstring lain, dan meniadakannya. Jika string kosong, dan karena itu elemen tumpukan atas adalah benar, tidak` akan luput dari perintah berikutnya ( ), membuat kita berhenti.X

Jika tidak (jika string tidak kosong), kita jangan melarikan diri Xdan mengabaikannya. Dalam hal ini, kita pergi ke kiri ( <), printis 0 (karena tumpukan kosong), dan melompat kembali ke Origin.

L3viathan
sumber
2
Selamat atas tantangan pertama Anda yang terpecahkan di Aceto.
Adám
2
Lihat diagram. Benar ...
Adm
1
@ Adam Mungkin saja tidak akan membantu (jika Anda tidak mengenal Aceto), tapi saya pikir mungkin baik untuk melihat di samping teks untuk dapat mengikutinya dengan lebih baik.
L3viathan
15

Java8, 24 19 Bytes

Long::highestOneBit

Semoga ini legal; Saya mendapat kesan input / output tidak harus mengevaluasi benar / salah dalam bahasa. Membutuhkan waktu selama input dan memberikannya sebagai output, dengan yang benar dan nol menjadi salah dalam representasi biner. Sebagai contoh, biner 00101 adalah 5 dan akan mengembalikan biner 00100 yaitu 4.

Lima byte berkat @puhlen

JollyJoker
sumber
4
Pendekatan yang bagus. Java menjadi kompetitif‽
Adm
3
Wow, JAWA sebagai jawaban kompetitif‽
Zacharý
Tidak sepenuhnya yakin apakah ini valid untuk aturan codegolf, tetapi ini dapat ditingkatkan menjadi 19 karakter dengan menggunakan referensi metode: Long::highestOneBityang menghasilkan hasil yang identik dengan sintaks yang lebih pendek
puhlen
Ekspresi @puhlen yang mengevaluasi fungsi anonim diizinkan.
Cyoce
2
@NathanMerrill java.langPaket ini diimpor secara default. Dari spec bahasa "Unit kompilasi secara otomatis memiliki akses ke semua tipe yang dideklarasikan dalam paketnya dan juga secara otomatis mengimpor semua tipe publik yang dideklarasikan dalam paket yang telah ditentukan java.lang."
JollyJoker
12

Retina , 6 byte

1>`1
0

Cobalah online!

Input adalah daftar 0s (untuk Salah) dan 1s (untuk Benar).

Cocokkan semua 1dan ganti masing-masing kecuali yang pertama ( 1>) dengan a 0.

Martin Ender
sumber
Saya bisa melihatnya sekarang. Anda bekerja di kantor di beberapa OS. Seorang manajer datang dan berteriak pada Anda untuk menulis seluruh OS dengan regex.
Christopher
10

V , 7 byte

f1òf1r0

Cobalah online!

Pengiriman V pertama saya! \Hai/

Bagaimana itu bekerja

f1òf1r0
f1       "go to the next occurence of 1
  ò      "repeat the following until end:
   f1    "    go to the next occurence of 1
     r0  "    replace with 0
Biarawati Bocor
sumber
Bagaimana cara kerjanya?
Brian McCutchon
Penjelasan @BrianMcCutchon ditambahkan.
Leaky Nun
Ini gagal untuk 1 di posisi pertama :(
nmjcman101
@ nmjcman101 diperbaiki.
Leaky Nun
Karena Anda mengubah format input, Anda dapat bertukar r0dengan <C-x>untuk mengurangi yang dan menyimpan byte.
nmjcman101
9

Haskell , 25 byte

Fungsi anonim mengambil dan mengembalikan daftar Bools.

Gunakan sebagai (foldr(\x l->x:map(x<)l)[])[False,True,False,False].

foldr(\x l->x:map(x<)l)[]

Cobalah online!

Bagaimana itu bekerja

  • Lipat daftar dari kanan, tambahkan elemen baru dan mungkin memodifikasi yang berikut.
  • xadalah elemen yang harus ditambahkan ke sublist l.
  • Penggunaan yang Falsemembandingkan kurang dari True, sehingga map(x<)lakan membuat semua Trues di ldalam Falsejika xini True.
Ørjan Johansen
sumber
9

Jelly , 4 byte

+\=a

Cobalah online!

Berikut adalah algoritma yang agak berbeda dengan sebagian besar solusi bahasa golf lainnya (walaupun setelah saya mempostingnya, saya perhatikan bahwa solusi R juga menggunakan algoritma ini), dan mengikat dengan pemegang catatan Jelly saat ini.

Penjelasan

+\=a
+\    Cumulative sum of the input list
  =   Compare corresponding elements with the input
   a  Logical AND corresponding elements with the input

Selama semua elemen di sebelah kiri elemen adalah 0, jumlah kumulatif hingga elemen akan sama dengan elemen itu sendiri. Di sebelah kanan 1 pertama, keduanya berbeda (karena kami sekarang menambahkan total elemen yang tidak nol ke kiri). Jadi, +\=beri kami daftar yang berisi 1 (yaitu benar) hingga dan termasuk elemen kebenaran pertama. Akhirnya, logis DAN dengan daftar asli akan memberi kita 1 hanya untuk elemen kebenaran pertama.


sumber
8

JavaScript (ES6), 33 26 byte

a=>a.map(e=>e&!(i-=e),i=1)

I / O dalam susunan 0s dan 1s.

Neil
sumber
8

05AB1E , 6 byte

Kode:

ā<s1kQ

Penjelasan:

ā         # External enumeration, get a and push [1 .. len(a)]
 <        # Decrement each
  s       # Swap to get the input
   1k     # Get the first index of 1
     Q    # Check for equality with the enumeration array

Menggunakan penyandian 05AB1E . Cobalah online!

Adnan
sumber
1k>sƶ-_lain, lebih buruk. The liftide mungkin memiliki potensi sekalipun.
Magic Gurita Guci
5

brainfuck , 55 byte

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

Cobalah online!

Biarawati Bocor
sumber
4

Jelly , 4 byte

Port jawaban 05AB1E saya.

i1=J

Penjelasan (argumen α ):

i1        # Index of 1 (1-indexed) in α
  =       # Check for equality with the array:
   J      # [1 .. len(α)]

Cobalah online!

Adnan
sumber
4

R , 24 byte

cumsum(T<-scan(,F))==T&T

Cobalah online!

Contoh:

Untuk FALSE TRUE TRUE FALSE
cumsum(T<-scan(,F))==Tpengembalian input TRUE TRUE FALSE FALSE. F dalam pemindaian memastikan input logis.
FALSE TRUE TRUE FALSEdan TRUE TRUE FALSE FALSEadalah FALSE TRUE FALSE FALSE. Satu &melakukan perbandingan elementwise.

MickyT
sumber
@rturnbull sayangnya format input harus sama dengan output.
MickyT
4

Oktaf, 23 byte

@(a)diff([0 cummax(a)])

Cobalah online!

Perbedaan pertama dari maks kumulatif daftar.

rahnema1
sumber
3

Python, 58 byte

lambda x:[x[i]and x.index(x[i])==i for i in range(len(x))]

Jika x[i]salah, hasilnya salah; jika tidak, ia memberikan apakah elemen adalah kejadian pertama dalam array itu sendiri atau tidak.

HyperNeutrino
sumber
3

PHP, 37 byte

foreach($_GET as$v)echo$v*!$$v++,' ';
pengguna63956
sumber
3

Perl 5, 20 byte

sub{map$_&&!$x++,@_}

Truthy is 1dan falsey is ''(string kosong).

Penjelasan:

maploop atas elemen daftar itu @_, argumen diteruskan ke subrutin, pengaturan setiap elemen menjadi $ _ secara lokal dan mengembalikan array nilai pengembalian yang dihitungnya dari setiap elemen. $_&&!$x++output $_jika $_falsey dan !$x++jika itu benar. (Perhatikan bahwa && adalah hubungan arus pendek, jadi !$x++tidak dieksekusi sampai nilai kebenaran pertama tercapai). $x++mengembalikan 0(yang merupakan kesalahan) pertama kali dijalankan dan kemudian bertambah setiap kali (dan tetap benar). Yang !meniadakan $x++, dan karenanya mengembalikan kebenaran saat pertama kali ditemui dan memalsukan sesudahnya.

Chris
sumber
Keraguan Anda dibenarkan: Anda harus mengirimkan fungsi penuh (atau program lengkap); dan ini hanya cuplikan (karenanya, tidak valid tanpa sub{...}).
Dada
2

Pyth - 9 byte

.e&b!s<Qk

Coba di sini

.e&b!s<Qk
.e          # Python's 'enumerate' (i.e., for each index k and each element b at that index)
      <Qk   # The first k elements of the input
     s      # 'Sum' these first k elements (with booleans, this is a logical 'or')
  &b!       # The value of the output at index k is [value of input @ index k]&&[the negation of the 'sum']
Maria
sumber
1
Tampaknya menjadi lebih efisien untuk menggunakan variabel dan hanya memetakan lebih biasanya: m&!~|Z.
FryAmTheEggman
2

Python 2 , 45 36 byte

r=0
while 1:n=input();print n>r;r+=n

Input dan output adalah satu Boolean ( Benar atau Salah ) per baris.

Cobalah online!

Dennis
sumber
2

C #, 77 byte

a=>{var b=1<0;for(int i=0;i<a.Length;){a[i]=b?1<0:a[i];b|=a[i++];}return a;};

Kompilasi ke a Func<bool[], bool[]>. Tidak ada yang pintar benar-benar, hanya solusi lurus ke depan.

TheLethalCoder
sumber
2

sed , 16 19 byte

15 18 byte sourcecode + 1 byte untuk -r flag (atau -E flag untuk BSD sed).

:
s/1(0*)1/1\10/
t

Cobalah online!

Sunting: Terima kasih Riley karena menunjukkan kesalahan.

Maxim Mikhaylov
sumber
@Riley Terima kasih telah menunjukkan itu! Sepertinya TIO memiliki versi sed yang berbeda dari milik saya (BSD). Saya tidak dapat membiarkan label kosong. Senang mengetahui hal ini.
Maxim Mikhaylov
Ya maaf TIO menggunakan sed GNU. Ini adalah fitur yang diubah bug.
Riley
2

Jelly , 4 byte

TḊṬ^

Cobalah online!

Bagaimana?

Ini melakukan apa yang ditanyakan dalam arti harfiah:

TḊṬ^ - Main link: list a   e.g. [0,1,0,1,0,0,1]  or  [0,1,0,1,0,1,0]
T    - get the truthy indexes   [  2,  4,    7]      [  2,  4,  6  ]
 Ḋ   - dequeue                  [      4,    7]      [      4,  6  ]
  T  - make a boolean array     [0,0,0,1,0,0,1]      [0,0,0,1,0,1  ]
   ^ - XOR that with a          [0,1,0,0,0,0,0]      [0,1,0,0,0,0,0]
Jonathan Allan
sumber
2

c (dengan built-in gcc), 40

Pendekatan yang sedikit berbeda:

f(n){return!n?0:1<<31-__builtin_clz(n);}

Ini mungkin dinyatakan tidak valid - dalam hal ini saya akan dengan senang hati menandainya sebagai tidak bersaing.

Input dan output "array" adalah bilangan bulat 32-bit yang tidak ditandatangani - ini membatasi ukuran daftar input menjadi persis 32 - ini mungkin merupakan diskualifikasi. Jika input kurang dari 32 bit, maka mungkin diisi dengan nol bit pada akhirnya.

Cobalah online .

Trauma Digital
sumber
2

Batch, 85 73 byte

:a
@(if %1.==. exit)&set/ar=(1-f)*%1
@echo %r%&set/af^|=%1&shift&goto a

Mengambil input sebagai argumen baris perintah. Sebagai contoh:1.bat 0 1 0 1 0 0 1

Versi sebelumnya

@set f=1
:a
@(if %1.==. exit)&set/ar=f*%1
@echo %r%&(if %1==1 set f=)&shift&goto a
Andrei Odegov
sumber
2

Brain-Flak , 230 byte

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

Saya akan menjelaskan segera tapi ibu saya memasakkan saya kentang goreng

([]){{}({}[()]<>)<>([])}{}<>([]){{}({}<>)<>([])}{}<> Subtracts one from every item

({<({}<>)<>>()}<(())>){({}[()]<<>({}<>)>)}{} Loops down stack until current item is zero and adds one

(([])<{{} (({})())({<{}>{}((<()>))}<{}{}>) ({}<>)<>([])}<>>){({}[()]<({}<>)<>>)}{}<> On every item of stack if it is 0 do nothing and if it is -1 add one

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

{}{} Remove the two zeros at top of stack

([]){{}({}<>)<>([])}{}<> Flip stack back

Cobalah online!

Terima kasih khusus

Terima kasih khusus kepada Wheat Wizard dan Riley yang telah membantu saya mendapatkan satu ton kode!

Christopher
sumber
2

Python 3, 69 66 64 60 54 53 byte

lambda i:[k==i.index(j)and j for k,j in enumerate(i)]

Mengambil array falses dan trues. Ini adalah daftar pemahaman falses kecuali jika nilai iterasi saat ini adalah truedan itu adalah yang pertama truedalam input.

Ini sepertinya agak lama (dan ini lambda pertama saya), jadi jika Anda bisa menemukan cara untuk bermain golf, itu akan sangat dihargai!

OldBunny2800
sumber
Bisakah Anda jelaskan?
Adm
Oh, oops, salah mengartikan pertanyaan itu.
OldBunny2800
Batalkan penghapusan dan perbaiki jawabannya
OldBunny2800
Anda dapat menyimpan satu byte dengan membuatnya 0 for 0for.
Zacharý
Ini bekerja untuk 1 jika dan 1 lain, kan? Terima kasih!
OldBunny2800
2

Brain-Flak , 146 144 byte

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

Cobalah online!

# Reverse the stack and add a 1 between each to help with reversing later
([]){{}({}<>)(())<>([])}{}<>

# Add a 1 in case there aren't any truthy values (and another 1 like before)
((()))

# Reverse the stack back to it's original order using the 1s from earlier to know when to stop
{{}({}<>)<>}{}<>

# Push 1 to start the loop
(())

# Until we find the first 1
{

 # Pop the last value
 {}

 # Logical not
 ((){[()](<{}>)}{})

  # Put a 0 on the other stack
  (<>)<>

# end loop
}

# Put a 1 on the other stack
<>(())<>

# Push the stack height
([])

# While there are values on this stack
{

 # Move them to the other stack as a 0
 {}(<{}<>>)<>([])

# End while
}{}

# Pop an extra 0
{}

# Switch stacks
<>

# Copy everything back (to reverse it back to it's original)
([])
{
 {}({}<>)<>([])
}<>{}
Riley
sumber