Bir dize verilecektir. 0-9 arası 9 benzersiz tam sayı içerecektir. Eksik tamsayıyı döndürmelisiniz. Dize şöyle görünecek:
123456789
> 0
134567890
> 2
867953120
> 4
Bir dize verilecektir. 0-9 arası 9 benzersiz tam sayı içerecektir. Eksik tamsayıyı döndürmelisiniz. Dize şöyle görünecek:
123456789
> 0
134567890
> 2
867953120
> 4
Yanıtlar:
+ Arge Borsch'a + güzellik
`99066**2`.strip
99066**2
0 ~ 9 içeren bir dize oluşturmak için sadece kısa bir yoldur
764**4
iki byte tasarruf edebilir.
764**4
kayıp 5
, 8
ve9
763**4
=338920744561
lambda s:-int(s,16)%15
Bir aritmetik çözüm. Giriş dizesini onaltılık olarak yorumlar, olumsuzlar ve sonuç modul 15 alır.
⎕D∘~
⎕D
D igits
∘
(monadik bir işlev oluşturmak için aşağıdaki argümanla sol argümanı bağlar)
~
[argüman] hariç
⎕D~⊢
⎕D
D igits
~
dışında
⊢
doğru argüman
⎕D~⍞
⎕D
D igits
~
dışında
⍞
karakter girişi
DJMcMayhem sayesinde 10 bayt kurtarıldı!
((([]())[]{}){()()({}[()])}{}[{{}}])
Ascii'deki tüm rakamların toplamı 525'tir. Bu program girişi toplar ve eksik rakamı elde etmek için 525'ten çıkarır.
((([]())[]{}){()()({}[()])}{} )
525'i zorlayacak. Bu, başlangıçta 9 girdi unsuru olacağını bildiğimiz gerçeğinden yararlanıyor. Bu, []
525 gibi büyük sayılara hızlı bir şekilde ulaşmamızı sağlayan 9'u değerlendirir.
Sonra biraz var:
[{{}}]
Bu girişleri toplayacak ve toplamdan çıkaracaktır.
negative(sum(input()))
Sona doğru hareket ettirirseniz, 525'i daha kolay itmek için istif yüksekliği niladını kötüye kullanabilirsiniz. (([][][]()()()){()()({}[()])}{}[{{}}])
10 bayt kurtarmalı
(477-).sum.map fromEnum
Çevrimiçi deneyin! Kullanımı: (477-).sum.map fromEnum $ "123456890"
. 477, 0 hariç, 1 - 9 arasındaki karakter kodlarının toplamıdır. Bu adsız işlev, eksik olanı bulmak için 477 eksi tüm rakam karakter kodlarının toplamını hesaplar.
Karakter hanelerini ints'a çevirmek bir bayt daha uzun:
(45-).sum.map(read.pure)
foldl(\a b->a-read[b])45
ḟ
.
Ø
= ⎕
, D
= D
, ḟ
= ~
, olduğu gibi ⎕D~'867953120'
.
Ascii kodlarını toplar ve 48 * 9 + 45'ten çıkarır
->s{477-s.sum}
Bu gibi kullanın
f=->s{477-s.sum}
puts f["123456789"]
Düzenleme çok daha akıllı hile thx @Neil tasarrufu 1 bayt,
1'den 9'a kadar olan tüm değerleri Xoring, 1'e veya X'e 1 kez daha verir ve sonuç 0 olur. Dolayısıyla, eğer herhangi bir tek değer eksikse, sonuç eksik değer olacaktır.
s=>eval([1,...s].join`^`)
Ölçek
f=s=>eval([1,...s].join`^`)
function go() {
var i=I.value;
O.textContent = f(i)
}
go()
<input oninput='go()' value='012987653' id=I>
<pre id=O></pre>
s=>eval([1,...s].join`^`)
bir bayt kaydeder.
-6 Basic Sunset'e Teşekkürler
-2 Martin Ender'e Teşekkürler
.
$*_5$*
+`_1|1_
1
Her rakamı bu kadar _
s ve 5 1
s ile değiştirin:
.
$*_5$*
Her birini ve hepsini _
a 1
:
+`_1|1_
Kalan 1
s sayısını sayın :
1
.
.
^
5
^.
$*9¶
.
$*_
+`_¶_
¶
_
_
için 1
bir byte kaydetmek için.)
s=>(15-`0x${s}`%15)%15
@ Xnor'ın Python portu, JavaScript'in sadece bir modulo operatöründen ziyade bir geri kalan operatöre sahip olması haricinde tek bir adımda yapamıyorum. Düzenleme: @Arnauld sayesinde 6 bayt kaydedildi.
s=>[...s].map(c=>r-=c,r=45)|r
;-)
reduce
. Zaten +1
s[0]!='0'
, ama zaten kullanan bir cevap var eval
.
s=>(15-`0x${s}`%15)%15
?
-[-[->-<],]>++.
Burada dene . Bu çözüm yalnızca standart Brainfuck (8 bit hücreler) üzerinde çalışır, çünkü sarmaya dayanır.
Brainfuck'ın gerçekten rekabet edebileceği nadir bir gün, ancak bu zorluk BF'nin özelliklerine oldukça iyi uyum sağladı!
Bu cevabı bir kenara atmak yerine, aldığım yinelemelere adım atmak istiyorum, çünkü bunun daha anlaşılabilir (ve daha ilginç) olacağını düşünüyorum.
Not: Bu çözüm, büyük ölçüde Buğday Sihirbazı'nın Beyin Flak cevabından ilham almıştır .
Cevaben Buğday Sihirbazı bu değeri 525% 256 = yapar, 0-9 toplamından 525 Ve standart brainfuck beri ASCII değerlerinin toplamı ancak [0,255] kavramını aldığına işaret etti 13 . Başka bir deyişle, girişin ASCII değerlerini 13 ağdan çıkarmak, eksik rakamı gösterir.
Bu programın ilk versiyonu şuydu:
1. İlk hücreye 13 koy
2. Girişleri ikinci hücreye al
3. İkinci hücreyi ilk hücreden çıkar
4. Kalan girişler varsa 2'ye atla
5. İlk hücreyi yazdır
Ve işte basit çözümün kodu:
+++++++++++++ #Set the first cell to 13
>, #Take inputs into the second cell
[[<->-],] #Subtract the second cell from the first cell and repeat until inputs are over
<. #Print the first cell
Cevabında da belirttiğimiz gibi, girişin tam olarak 9 olacağını biliyoruz, bu değeri sabit olarak kullanabilir ve başlangıçtaki uzun + dizgilerini ortadan kaldırabiliriz.
Ayrıca, hangi noktaya 13 ekleyeceğimiz de önemli değil (teşekkürler, değişmeli özellik!), Bu yüzden çıkarma ve basma adımlarıyla karıştıracağız.
, #Take input to enter the loop
[[->-<], #Subtract the first cell from the second cell
>+<] #Add 1 for each input; totaling 9
>++++ #Add the missing 4 to make 13
. #And print
Bu benim bu sorunun asıl cevabıydı, ama daha iyisini yapabiliriz.
İlginçtir ki, önceki cevap a yerine + ile başlasak bile çalışır.
+[[->-<],>+<]>++++.
Brainfuck bir döngü başlatmak için bir hücrede bir şey gerekli . Saf olarak, ilave 4'ü başka yerlere gidebildiği zaman ekledik.
-[[->-<],>+<]>++.
Bazı kasıtlı (okuma: deneme ve yanılma) döngü hileleri ile, programın başlatılması - a ile iki ilginç sonuç doğurur:
1 + 10 + 2 = 13, ve asıl cevabı buluyoruz.
Geriye bakınca, bu muhtemelen böyle basit bir Brainfuck programı için aşırı bir yazmadır.
Bu çözümü biraz daha düşündükten sonra 2 baytı kesebildim.
Önceki adımla ilgili bir şeyi açıklığa kavuşturmak istedim:
Döngüye etkili bir şekilde giren eksi 1 ekler, ancak gerçekte yaptığı şey ikinci hücreden 255'i çıkarmaktır (1 ile sonuçlanır).
Geçmişe bakıldığında açıktır, ancak ilk hücreden 1 çıkarılması, ikinci hücreye 1 eklenmesiyle aynıdır (çünkü ilk hücredeki her şey ikinci hücreden çıkarılır).
-[-[->-<],]>++.
İlk döngünün başına "-" ekleyerek "> + <" harfini kaldırabildim. Oraya gitmeli ve "> + <" olduğu yere gitmemeli, çünkü program sonsuz şekilde döngülenecek.
477-Tr@ToCharacterCode@#&
Girdi olarak bir dize alarak ve bir tamsayı döndüren saf işlev. Mathematica'nın uzun komut isimleri vardır ve dizgiler ve tamsayılar arasında dönüşüm yapmak konusunda isteksizdir, bu da onu bu zorlukla özellikle kötüleştirir. Bulabildiğim en iyi şey , giriş dizesinin ASCII kodlarının toplamını temel alan bir hesaplama yapan Level River St'in Ruby cevabındaki algoritma ; Mathematica'da bu sadece bir uzun komut adı kullanır.
<?=trim(32043**2,$argv[1]);
tüm rakamları içeren bir dize oluşturmak için Rod'un cevabındaki hileyi kullanır, sonra eksik olan hariç tüm rakamları kaldırır.
PHP, 41
for($b=1;$i<9;$b^=$argv[1][$i++]);echo$b;
Bu xor kullanıyor, çünkü henüz görmedim.
32043,32286,33144,35172,35337,35757,35853,37176,37905,38772,39147,39336,40545,42744,43902,44016,45567,45624,46587,48852,49314,49353,50706,53976,54918,55446,55524,55581,55626,56532,57321,58413,58455,58554,59403,60984,61575,61866,62679,62961,63051,63129,65634,65637,66105,66276,67677,68763,68781,69513,71433,72621,75759,76047,76182,77346,78072,78453,80361,80445,81222,81945,83919,84648,85353,85743,85803,86073,87639,88623,89079,89145,89355,89523,90144,90153,90198,91248,91605,92214,94695,95154,96702,97779,98055,98802,99066
İlginç bir sağlama toplamı yaklaşımı kullanan daha kısa bir bash çözümü buldum :
sum -s|dc -e524?--P
Açıklama:
sum
Komut bir sağlama ve bir blok sayısını yazdırır. Çok fazla ayrıntı bilmiyorum, ancak seçeneği kullanmak -s
(Sistem V algoritması) sağlama toplamını her giriş karakter kodunun ASCII toplamına eşit hale getirir. Bu durumda, aynı giriş karakterlerinin sırası değiştiğinde sağlama toplamı sabit kalır.
867953120
Test olayı olarak verildiğinde (son örnek), kodun nasıl çalıştığı şöyle:
sum -s
çıktılar 473 1
. Tam sayı yoksa, sağlama toplamı 525 olur.dc -e524?
524 ve ardından boru girişine basar. Yığın: 1 473 524
. Buradaki fikir toplamı 525'ten çıkarmak, ancak toplam 1 de çıktı verdiğinden, onunla çalışmam gerekiyor.--P
. İki çıkarmalar (524- (473-1)) uygulandıktan sonra, yığın: 52
. 'P' ile karakteri ASCII koduyla yazdırıyorum: 4
eksik rakam.function m(s)
character(len=10)::s,t
t='0123456789'
do j=1,10
k=0
do i=1,9
if(s(i:i)==t(j:j))k=1
end do
if(k==0)m=j-1
end do
end
Çok kısa değil, korkarım.
Ungolfed:
integer function m(s)
implicit none
character(len=9)::s
character(len=10)::t
integer:: i, j, k
t='0123456789'
do j=1,10
k=0
do i=1,9
if (s(i:i) == t(j:j)) k=1
end do
if (k==0) m=j-1
end do
end function m
A,sq-
A, e# The range from 0 to 9: [0 1 2 3 4 5 6 7 8 9]
s e# Cast to a string: "0123456789"
q e# The input
- e# Remove all characters from the range that are in the input
e# Implicit output
İçin +1 içerir -r
s/$/0123456789/
:
s/(.)(.*)\1/\2/
t
s/$/0123456789/ # Append 0123456789
: # Start loop
s/(.)(.*)\1/\2/ # remove a duplicate character
t # loop if something changed
ẹ:Ị↔x
Muhtemelen daha kısa olmalı (neden hala kafam karıştı ẹ
gerekli ), ama bu yapabileceğimin en iyisi.
ẹ:Ị↔x
ẹ Split the input into a list of characters
:Ị Pair that list with the string "0123456789"
↔x Remove all elements of the list from the string
x
uygulama eski ve güzel bir adamcağız, bu yüzden ihtiyacın var ẹ
.
¬∋ℕ
sadece 3 karakterde çalışması gerektiğine dair bir argüman sunabilirsiniz - ilk önce denedim - ama bunun olmamasının birçok nedeni var ve Brachylog'u değiştirmesi için makul bir yol olduğunu sanmıyorum.
¬∋ℕ
çalışmaya sahip olmak Prolog'da mümkün değildir, özellikle ne demek istediğinizi programlamıyorsanız mümkün değildir not in
. ¬
Brachylog’da \+
Prolog’da eşdeğerdir ve anlamı “bunu doğrulayamayan her şey için bana seçim noktaları vermek yerine” (neredeyse her zaman sonsuz sayıda şeydir) )
(lambda(s)(- 45(reduce'+ s :key'digit-char-p)))
Ungolfed:
(lambda (s) (- 45 (reduce '+ s :key 'digit-char-p)))
Açıklama:
(reduce '+ s :key 'digit-char-p)
Bu, içindeki karakterlerin arasında dolaşır s
, bunları sayılara dönüştürür ve ekler. Digit-char-p, uygun bir şekilde char sayısını "true" değeri olarak döndürür, böylece bir test veya dönüşüm olarak kullanılabilir.
(- 45 ...)
45'ten çıkarma, girişte eksik olan rakamı geri verir.
5v&;52/ni?@.>!&oW+
Expanded
5 v
& ;
5 2 / n i ? @ .
> ! & o W + . .
. .
. .
Bu beyin lafı gibi aynı yöntemi kullanır cevabı .
5, 2, birleştirmek, 5 tuşuna basmak, birleştirmek ve olumsuzlamak için yığında -525 değerini oluşturun.
Ardından tekrar tekrar giriş yapın ve girişin sonuna kadar ekleyin.
Son girişi kaldırın, son ekleme sonucunu negatifleyin (pozitif olun), karakteri çıkartın ve durdurun.
-525'ten yukarı çalışmanın nedeni, her giriş yinelemesi için karakter çıkışına isabet etmesidir. Değer negatif olduğundan, döngüden çıkılana ve negatif değer pozitif hale getirilene kadar hiçbir şey çıkmaz.
Giriş hücreye girilir
A1
.
Kod:
=REGEXEXTRACT(4&2^29,"[^"&A1&"]")
Steve Kass sayesinde 6 bayt kaydedildi.
Önceki kod:
=REGEXEXTRACT("0123456789","[^"&A1&"]")
Sonuç:
=REGEXEXTRACT(0&49^9,"[^"&A1&"]")
Aynı zamanda benzer bir mantık verilen geçerli bir çözümdür. Cevap güncellendi.
Daha iyi bir matematik yaparak programı 1 satır ve 1 bayta taşıyarak 1 bayt kurtardım.
~+;@.%a--7;#
ASCII değerlerinin toplamı, hangi sayının eksik olduğuna bağlı olarak 477 ile 468 arasındadır. Bunu 7'den çıkartarak -470 - -461 aralığını elde ederiz. Bu sayıyı 10'a göre değiştirerek, daha sonra yazdırabileceğimiz 0 - 9 aralığını elde ederiz.
~+; ;# Sums the ASCII values of all characters to stdIn
~ # The # doesn't skip over the ~ because it's on the end of a line
~ Once EOF is hit, the ~ reverses the IP's direction
;# Jump the ; that was used before
--7 Subtract the sum from 7 (really just 0 - (sum - 7))
%a Mod it by 10
@. Print and exit
Tamsayı girişi yerine ASCII değerlerini kullanmamın nedeni, &
Çevrimiçi Deneyin komutunun EOF üzerinde durmasıdır (IP'yi ters çevirmesi gerekse bile). ~
Gerçi, düzgün çalışır.
#v~+
@>'i5*--,
10 hanenin tümünün ASCII değerlerinin toplamı 525'tir. Verilen hanelerin toplamını 525'ten çıkartarak eksik karakterin ASCII değerini alırız.
#v~+ Sums the ASCII values of all characters on stdIn
Moves to the next line when this is done
>'i5* Pushes 525 (105 * 5)
-- Subtracts the sum from 525
@ , Prints and exits
param($n)0..9|?{$n-notmatch$_}
Girdiyi alır $n
, bir aralık oluşturur 0..9
(yani 0, 1, 2 ... 9
), ardından regex yapan sayıyı çıkarmak için bir Where-Object
cümle ( |?{...}
) kullanır -notmatch
. Boru hattında kalan, çıktının kapalı.
-jkUT
-jkUT
T # 10
U # The unary range of ten: [0,1,..,9]
jk # join that on the empty string
- # set minus
"-jUT" da işe yarıyor ama her int için yeni satırlar üretiyor.