İlk 1 olun (sadece ilk Hakikatten çıkın)


47

giriş

Dyalog Ltd. her yıl bir öğrenci yarışması düzenliyor. Buradaki zorluk , iyi bir APL kodu yazmaktır . Bu, bu yılın sekizinci sorunun bir dil agnostik sürümüdür.

Bu zorluğu yarışmanın asıl yazarından buraya göndermek için açıkça iznim var. Verilen bağlantıyı takip ederek ve yazarla iletişim kurarak doğrulamaktan çekinmeyin .

Sorun

Bir Boolean * listesi göz önüne alındığında, ilk Hakikatten sonraki tüm Hakikatleri "kapat".

Hakikat yok mu? Sorun değil! Sadece değiştirilmemiş listeyi iade et.

Örnekler

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

[][]

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


* Tüm gerçekleriniz aynı olmalı ve tüm yanlışlarınız aynı olmalıdır. Bu çıktı içerir.


2
Tercih ettiğimiz dilde daha doğal olan bit listelerini veya başka truthy / falsy list gösterimlerini kullanabilir miyiz?
Martin Ender

1
Evet, "booleanlar", "gerçek" ve "yanlış" yerine "asılsız" ve "sahte" hakkında konuşursanız. ;)
Martin Ender

1
Booleanlar konusunda net değilim. Dilimiz Doğru / Yanlış olsa bile 0/1 kullanabilir miyiz?
xnor

1
@ xnor Ah, iyi nokta. Girdi seçimine izin vermenin adil olacağını düşünüyorum, ancak çıktı eşleşmelidir, öyle değil mi?
Adám

1
@xnor sizi duyuyorum, ancak Haskell sayıları Boolean olarak değerlendiremiyorsa veya Boolean'lerde aritmetik yapamıyorsa, bu Haskell'in golf gücünde gerçek bir sınırlamadır ve dönüşümleri veya diğer çalışmaları gerektirerek bayt sayısına yansıtılmalıdır. -arounds. Dipnot formülasyonu hakkında ne düşünüyorsunuz?
Adám

Yanıtlar:


36

Python 2,35 bayt

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

Çevrimiçi deneyin! Giriş ve çıkış Doğru / Yanlış satırlarıdır.

Dennis'in çözümüne dayanarak . Bir girdiyle karşılaşıldıktan sonra Trueyapılacak değişkeni yeniden tanımlar . Bu şekilde, herhangi bir başka girdi değerlendirilir ve yazdırılır.FalseTrueTrueFalse

Yeniden tanımlama True&=b<1yani True = True & (b<1). Giriş bolduğunda True, o (b<1)zaman Yanlış (o zamandan True==1), öyle Trueolur False.


19
Gerçek yeniden tanımlayabilirsiniz ??? Bu sadece + 1'i hakediyor çünkü hax> _>
HyperNeutrino

1
@HyperNeutrino Evet, ancak Python 3'te değil. (Buradaki dil iyi çünkü Python 2.)
Brian McCutchon

@BrianMcCutchon Tamam, teşekkürler. Bu çok garip ama ...
HyperNeutrino

@HyperNeutrino Muhtemelen yapabileceğinden bahsetmeye değer True, False = False, True.
Brian McCutchon

1
@HyperNeutrino - hayır. Builtins yine de 'real' değerini döndürür, o değişiklikleri değiştiren sadece 'True' olur. (Veya modüller, bazı durumlarda ...). Bool (1), True döndürür, ancak bool (1) == True, False döndürür.
TLW

30

APL , 2 bayt

<\

"Şundan az kullanarak tara" işlevini değerlendirir. Çevrimiçi deneyin!

açıklama

APL'de, operatör \(tarama) sağlanan bir işlevi kullanarak bir dizinin boş olmayan öneklerini sağdan azaltır. Örneğin, dizi göz önüne alındığında, (uzunluk 1 öneki), (uzunluk 2 öneki ) ve ( uzunluk 2 öneki ) 0 1 0hesaplar ve sonuçları yeni bir diziye koyar; parantezler sağa ilişkilendirilir. Doğrudan düşürmek , tam olarak dizinin son elemanı ve gerisi olduğunda sonuçlanır , bu nedenle en soluna karşılık gelen önek , diğerlerine indirgenir .00<10<(1<0)<110110


En sonunda! Merak ediyordum.
Ad’m

Şimdi sanırım J de cevap verebilirsin, değil mi?
Ad’m

@ Adám Evet, J'de 3 bayt var: </ \ Jelly muhtemelen 2-byte'lık analog bir çözüme sahip.
Zgarb

Hayır, sanmıyorum çünkü Jelly sağdan sola.
Ad’m

Ayrı dil cevaplarını ayrı mesajlar olarak göndermelisiniz.
Ad’m

22

Aceto , 19 17 bayt rekabet etmeyen

Yeni sürüm (17 bayt):

Bu yeni sürüm karakterleri teker teker alır ve en iyi -Fseçenek ile yürütülür . Benzer çalışır, ancak önceki çözümle aynı değildir:

 >,
Op0
p|1u
,ip^

Eski cevap (19 bayt):

(Rekabetçi değil çünkü tercümanda iki hata düzeltmek zorunda kaldım)

|p1u
iOp<
|!`X
rd!r

Bu, nispeten iyi yapabileceklerini vurgulayan ilk Aceto cevabı. "Listeler", satır başına bir giriş, doğru için "1" ve yanlış için "0" olan ve listenin sonunu gösteren boş bir dize olan giriş akışlarıdır.

kod akışı illüstrasyon

Aceto programları bir Hilbert eğrisinde çalışır, sol alttan başlayıp sağ alttan sona erer. İlk olarak, rbir dizge dhazırlıyoruz, !boş dizeleri Doğru'ya, diğer her şeyi Yanlış'a çevirerek , çoğaltıyoruz ve negate ediyoruz ( ). Sonra bir şartlı yatay ayna var ( |): Yığın üstündeki eleman truthy ise, yatay olarak yansıtın. Bu dize boş olduğunda olur. Eğer yansıtma yaparsak X, tercümanı öldüren yere ineriz.

Aksi takdirde, yığındaki kalan kopyayı bir integer'a dönüştürür ve bir başka koşullu yatay ayna yaparız: Bu sefer, 1 doğruluklı ve 0 sahte olduğundan, (ilk) doğru değeri görürsek yansıtırız. Eğer yansıtmazsak (bu yüzden 0 gördük) pyığında ne olduğunu belirledik (yığın boş, sıfır olduğu için) ve Otüm prosesi yeniden başlatarak, başladığımız eğrinin teli üzerine atlıyoruz.

Aksi takdirde, bir 1 gördüğümüzde u, Hilbert eğrisi üzerinde hareket ettiğimiz yönü tersine çeviren ve üzerinde dururuz. 1p1 basar ve şimdi aynı devam Oederiz, 0 görseydik giderdik , ama "ters çevrilmiş" modda olduğumuz için, kökenimiz sağ altta , o yüzden atlıyoruz.

Şimdi rbaşka bir dizge ead ve onu reddediyoruz. Dize boştu ve bu nedenle üst yığın elemanı truthy ise, `olacak değil sonraki komutu (kaçış Xbize çıkmak yapma).

(Dize boş değil ise) Aksi takdirde, do kaçmak Xve bunu görmezden. Bu durumda sola gideriz ( <), p0 Obiti (yığın boş olduğundan) ve kuleye geri döneriz.


2
Aceto'da çözdüğünüz ilk doğru mücadeleniz için tebrikler.
Adám

2
Diyagrama bakar. Doğru…
Adám

1
@ Adám Muhtemelen kendi kendine yardım etmeyecek (eğer Aceto'yu bilmiyorsanız), ancak daha iyi takip edebilmek için metnin yanında görmenin iyi olabileceğini düşündüm.
L3viathan

15

Java8, 24 19 Bayt

Long::highestOneBit

Umarım bu yasaldır; Giriş / çıkışların dilde doğru / yanlış olarak değerlendirmek zorunda olmadığı izlenimini edindim. Girdi kadar uzun sürer ve biri çıktı olarak verir, olanlar doğru ve sıfırlar ikili gösterimde yanlıştır. Örneğin, ikili 00101, 5'tir ve 4 olan ikili 00100'ü geri döndürür.

@Puhlen sayesinde beş bayt


4
Güzel yaklaşım. Java rekabetçi
olmak‽

3
Vay, JAVA rekabetçi bir cevap olarak
Zacharý

Bunun kod kuralları kuralları için geçerli olup olmadığından tam olarak emin değilsiniz, ancak bu yöntem bir yöntem kullanılarak 19 karaktere yükseltilebilir: Long::highestOneBitki bu, daha kısa bir sözdizimi ile aynı sonucu veren
puhlen,

Anonim fonksiyonları değerlendiren @puhlen ifadelerine izin verilir.
Cyoce

2
@NathanMerrill java.langPaket, varsayılan olarak alınır. Gönderen dil spec "bir derleme birimi otomatik olarak her türlü erişim ambalajından beyan ve ayrıca otomatik olarak genel türleri önceden tanımlanmış paket java.lang bildirilen ithal var."
JollyJoker

12

Retina , 6 bayt

1>`1
0

Çevrimiçi deneyin!

Giriş, 0s (False için) ve 1s (True için) bir listesidir .

Tümü 1ile eşleşir ve ilki hariç her birini ( 1>) a ile değiştirir 0.


Şimdi görebiliyorum. Bazı işletim sistemlerinde bir ofiste çalışıyorsunuz. Bir yönetici gelir ve regex ile bütün bir işletim sistemi yazmak için size bağırır.
Christopher,

10

V , 7 bayt

f1òf1r0

Çevrimiçi deneyin!

İlk V gönderimim! \Ö/

Nasıl çalışır

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

Bu nasıl çalışıyor?
Brian McCutchon

@BrianMcCutchon Açıklama eklendi.
Sızdıran Rahibe,

Bu ilk konumda 1 için başarısız olur :(
nmjcman101

@ nmjcman101 düzeltildi.
Leaky Rahibe

Eğer giriş formatını değiştirdi beri, takas edebilir r0ile <C-x>olanları azaltma ve bir bayt kaydedin.
nmjcman101

9

Haskell , 25 bayt

Anonim işlev alma ve Bools listesini döndürme .

Olarak kullanın (foldr(\x l->x:map(x<)l)[])[False,True,False,False].

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

Çevrimiçi deneyin!

Nasıl çalışır

  • Sağdan listeye katlanır, yeni öğeler hazırlar ve muhtemelen aşağıdakileri değiştirir.
  • xalt listeye hazırlanacak öğedir l.
  • Kullanımları Falsedaha az karşılaştırır True, böylece map(x<)lherhangi dönecek Trueiçinde s liçine Falseeğer xolduğunu True.

9

Jöle , 4 bayt

+\=a

Çevrimiçi deneyin!

İşte diğer golf dili çözümlerinin çoğuna göre oldukça farklı bir algoritma (her ne kadar yayınladıysam, R çözümünün de bu algoritmayı kullandığını fark ettim) ve mevcut Jelly kayıt tutucusuyla bağdaştırdım.

açıklama

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

Bir elemanın solundaki tüm elemanlar 0 olduğu sürece, bir elemanın toplamı elemanın kendisine eşit olacaktır. İlk 1'in sağında, ikisi farklıdır (çünkü şimdi sıfırın dışındaki öğeleri toplamı sola ekliyoruz). Böylece, +\=bize ilk truthy elemanını içeren (dahil) 1'i (yani doğru) içeren bir liste verir. Son olarak, mantıksal VE orijinal liste ile bize sadece ilk gerçeği elemanı için 1 verecek .


8

JavaScript (ES6), 33 26 bayt

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

G / Ç 0 ve 1 s dizilerinde.


8

05AB1E , 6 bayt

Kod:

ā<s1kQ

Açıklama:

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

05AB1E kodlamasını kullanır . Çevrimiçi deneyin!


1k>sƶ-_başka, olsa daha kötü. liftFikri potansiyel olsa da sahip olabilir.
Magic Octopus Urn



4

Jöle , 4 bayt

05AB1E cevabımın bir limanı.

i1=J

Açıklama ( α değişkeni ):

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

Çevrimiçi deneyin!


4

R , 24 bayt

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

Çevrimiçi deneyin!

Örnek:

Giriş FALSE TRUE TRUE FALSE
cumsum(T<-scan(,F))==Tiadeleri için TRUE TRUE FALSE FALSE. Taramadaki F mantıksal girişi sağlar.
FALSE TRUE TRUE FALSEve TRUE TRUE FALSE FALSEolduğu FALSE TRUE FALSE FALSE. Bir tek &elementsel bir karşılaştırma yapar.


@rturnbull ne yazık ki giriş formatı çıktı ile aynı olmalıdır.
MickyT



3

Python, 58 bayt

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

Eğer x[i]yanlış, çıktı yanlıştır; Aksi takdirde, elemanın kendi dizisindeki ilk oluşum olup olmadığını verir.



3

Perl 5, 20 bayt

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

Gerçek 1ve falsey ''(boş bir dize).

Açıklama:

maplistedeki öğeler üzerinde @_dolaşıyor, argümanlar alt yordamına geçiyor, her öğeyi yerel olarak $ _ değerine ayarlıyor ve her öğeden hesapladığı dönüş değerlerinin bir dizisini döndürüyor. $_&&!$x++çıkışları $_ise $_Falsey ve !$x++o truthy eğer olduğunu. (& & Kısa devre olduğunu, bu yüzden !$x++ilk gerçeğe ulaşma değerine ulaşılana kadar yürütülmediğini unutmayın). ilk çalıştırıldığında falsey $x++döner 0(her şey artar) ve her seferinde artar (ve truthy kalır). !Olumsuzlar $x++ve buna Falsey sonra karşılaştı ve ilk kez truthy döndürür böylece.


Şüpheleriniz haklı çıktı: tam bir işlev (veya tam bir program) sunmanız gerekiyor; ve bu sadece bir pasajdır (bunun için, olmadan sub{...}).
Dada

2

Pyth - 9 bayt

.e&b!s<Qk

Burada dene

.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']

1
Bir değişken kullanın ve sadece normal üzerinde haritaya daha verimli görünmektedir: m&!~|Z.
FryAmTheEggman


2

C #, 77 bayt

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

A derler Func<bool[], bool[]>. Gerçekten akıllıca bir şey yok, sadece basit bir çözüm.


2

sed , 16 19 bayt

15 18 bayt kaynak kodu + 1 bayt -r bayrağı (veya BSD sed için -E bayrağı).

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

Çevrimiçi deneyin!

Düzenleme: Hata yaptığınız için teşekkürler Riley .


@Riley Buna dikkat çektiğin için teşekkürler! TIO'nun benimkinden (BSD) farklı bir sed versiyonu varmış gibi görünüyor. Etiketleri boş bırakamam. Bunu bilmek güzel.
Maxim Mikhaylov

Evet üzgünüm. TIO GNU sed kullanır. Bir hata döndü özelliği.
Riley

2

Jöle , 4 bayt

TḊṬ^

Çevrimiçi deneyin!

Nasıl?

Bu tam anlamıyla bir anlamda ne isteniyorsa:

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]

2

c (gcc yerleşikleriyle birlikte), 40

Biraz farklı bir yaklaşım:

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

Bu geçersiz sayılabilir - bu durumda bunu rekabetsiz olarak işaretleyeceğim.

Giriş ve çıkış "dizileri" 32-bit işaretsiz tamsayılardır - bu, giriş listesi boyutunu tam olarak 32 olacak şekilde sınırlandırır - bu diskalifiye edici olabilir. Girdi 32 bit uzunluğun altındaysa, sonunda sıfır bit ile doldurulabilir.

Çevrimiçi deneyin .


2

Toplu, 85 73 bayt

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

Girdiyi komut satırı argümanları olarak alır. Eample için:1.bat 0 1 0 1 0 0 1

Önceki versiyon

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

2

Brain-Flak , 230 bayt

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

Yakında açıklayacağım ama annem bana biraz kızarmış patates pişirdi

([]){{}({}[()]<>)<>([])}{}<>([]){{}({}<>)<>([])}{}<> 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

Çevrimiçi deneyin!

Özel teşekkür

Buğday Sihirbazı ve Riley'ye kodla bir tonluk yardım ettiğim için özel teşekkürler!


2

Python 3, 69 66 64 60 54 53 bayt

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

Bir dizi falses ve trues alır. Bu, falsegeçerli yinelemenin değerinin trueve truegirişteki ilk değer olup olmadığı haricinde , s'nin kavranmasıdır .

Bu biraz uzun (ve benim ilk lambda'm) gibi gözüküyor, bu yüzden golf oynamanın bir yolunu bulursanız çok memnun kalacaksınız!


Açıklayabilir misin?
Adám

Hata! Soruyu yanlış yorumladı.
OldBunny2800

Undeleted ve cevap düzeltildi
OldBunny2800

Bir bayt yaparak tasarruf edebilirsiniz 0 for 0for.
Zacharý

1if ve 1else için çalışır, değil mi? Teşekkürler!
OldBunny2800

2

Brain-Flak , 146 144 bayt

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

Çevrimiçi deneyin!

# 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)
([])
{
 {}({}<>)<>([])
}<>{}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.