Akıllı Numaralar Yapın


18

Wise bir süre önce tasarladığım basit bir bitsel dildir. Python'un bitsel işlemlerine dayanır . Birçok işlemi vardır, bunların çoğu Python'daki eşdeğer sembolle aynı veya çok benzerdir.

  • : Yığının üstünü çoğalt

  • ? Yığının üstünü alta döndür

  • ! Yığının altını yukarı döndür

  • [ ] yığının üst kısmı sıfır değilken döngü

  • ~yığının üstü değil ( -(n+1))

  • -yığının üst kısmını ( -n)

  • >bits yığınının üst kısmını bir kez sağa kaydır ( n//2)

  • <bits yığınının üst kısmını bir kez sola kaydır ( n*2)

  • ^veya yığının ilk iki öğesi ( Python ile aynı )

  • |veya yığının ilk iki öğesi ( Python ile aynı )

  • &ve yığının ilk iki öğesi ( Python ile aynı )


Wise'da bir tamsayı yapmak oldukça basittir, sıfırla yapabilir ::^ve artırabilirsiniz , ~-böylece sıfır yapar ve bir sürü kez arttırabilirsiniz. Ancak -işleri kaldırırsak biraz daha ilginç hale gelir.

Kalan işlemleri kullanarak her sayıyı yapmaya devam edebiliriz. Örneğin burada 3

~<<~

TIO

Bu eserler nedeniyle ~dönüşler, sonsuz dize sıfır 0negatif biri, sonsuz dizeye bit, 1bit, her <bir ekler 0yaptığımız yapılır sonuna kadar biraz ~dizgesi olarak her döner hangi 0iki izledi s 1s veya çoğu insanın dediği gibi 3.


Görev

Pozitif bir tamsayı verildiğinde , kaynağında nherhangi bir sayı oluşturmadan akıllıca bir program çıkaran bir program yazın -(çıktının -kaynağı, kendi kaynağınızda kullanabilirsiniz). Yığının üstünde zaten bir sıfır olduğunu varsayabilirsiniz.

Bu değil, bu yüzden mutlaka kaynak üretmek değil kaynak kodunu en aza indirmeyi amaçlamalısınız .

Örnek çıktılar

Bu liste ayrıntılı değildir, sadece olası çıktılardır

1  -> ~<~
2  -> ~<~<
3  -> ~<<~
4  -> ~<~<<
5  -> ~<~:<<|
6  -> ~<<~<
7  -> ~<<<~
8  -> ~<~<<<
9  -> ~<~:<<<|
10 -> ~<~:<<|<
11 -> ~<<~:><<<|
12 -> ~<<~<<
13 -> ~<<~:<<<|>
14 -> ~<<<~<
15 -> ~<<<<~
16 -> ~<~<<<<

0 dahildirpositive integers
colsw

4
Hayır, 0 pozitif tamsayılara dahil edilmez.
Zacharý

Görünüşe göre :boş bir istif üzerine uygulanan a 0. Bence bu belirtilmelidir, çünkü boş bir desteden çoğaltmanın vermesi gerektiği belli değildir0
Luis Mendo

Diğer karakterler sözdizimi hataları mı yoksa yok sayılıyor mu?
xnor

@Luismendo Eğer yığın sıfır ise çok yığının içeriğini bilmiyorum
Post Rock Garf Hunter 7:17

Yanıtlar:


8

Japt , 10 bayt

¤d0'<1"~<~

Çevrimiçi deneyin!

Temel fikir: sayının ikili gösterimini almak ve harita 0için <ve 1için ~<~. 1-10 için çıkışlar:

 1: ~<~
 2: ~<~<
 3: ~<~~<~
 4: ~<~<<
 5: ~<~<~<~
 6: ~<~~<~<
 7: ~<~~<~~<~
 8: ~<~<<<
 9: ~<~<<~<~
10: ~<~<~<~<

Metagolfing bu da kolay olurdu. Sadece şerit çiftleri~~
Draco18s artık SE

7

JavaScript (ES6), 34 33 bayt

f=n=>n?f(n&1?~n:n/2)+'<~'[n&1]:''
<input type=number oninput=o.textContent=f(this.value)><pre id=o>

Herhangi bir 32 bit tam sayı için çalışır.


Tamam bunu anladım. Güzel! iyi iş.
Rock Garf Hunter Post

7

Haskell , 38 bayt

PPCG'nin Haskell'imi gerçekten geliştirdiğini hissediyorum. Vuruş beyaz kedi.

f n=mapM(["<","~<~"]<$f)[1..n]!!n>>=id

falır Intve döndürür a String.

Çevrimiçi deneyin!

(Bu arada bundan söz ediyorum <$f. Bir karakteri kurtarıyor \_->.)

In Functoriçin örneğin (->) a(türünden işlevler a) elimizde: x <$ f = fmap (const x) f = const x . f = const x. Tek sınırlama fve final const xaynı kaynak türünü kullanmalıdır a. Örnek tamamen tembeldir, bu yüzden bu asla değerlendirilmez f.

Alternatif olarak, aynı uzunluk ama daha az kötü ( (l!!)anonim bir işlevdir):

(l!!)
l=(++)<$>"":tail l<*>["<","~<~"]

Çevrimiçi deneyin!

Her ikisi de @ETHproductions'ın Japt cevabı ile aynı temsili kullanmaktadır, ancak özellikle ilki <başlangıçta bir miktar fazlalık verebilir .

Birincisi n "<"ve "~<~"dizelerinin tüm kombinasyonlarını hesaplar , daha sonra sonuçtaki listeye endeksler.

İkincisi ise yinelemeli ile başlayan oluşturduğu sonsuz bir liste hesaplar ""ekleyerek yeni unsurlar inşa ardından ve "<"ve "~<~"zaten listedeki her elemana dizeleri (aslında o da izin biraz daha kısa olduğunu ""dönüştü get "<".)


1
Bu nasıl oluyor <$f? Bazı tuhaf işlev örnekleri?
xnor

@xnor Mwahahaha Sanırım bir açıklama eklemeliyim.
Ørjan Johansen

3

Yakut , 118 116 109 107 105 91 bayt

Cyoce sayesinde 2 bayt kaydedildi!

->n{o={0=>""}
o.dup.map{|c,k|["~~c","<c*2"].map{|t|o[eval t[1..9]]=k+t[0]}}until o[n]
o[n]}

Çevrimiçi deneyin!

Bu, tamsayıyı girdi olarak alan ve Wise içinde tamsayıyı temsil eden dizeyi döndüren bir işlevdir. Burada , bu programı 1'den itibaren tüm tamsayılarda test eden ungolfed bir sürüm bulabilirsiniz .

Temel fikir sabit bir "havuz" kaydetmek. Daha sonra, her "adım" ile, olası her fonksiyon için sabitler havuza eklenir. Ben işlevleri seçmiş ~, <ve >ben her sayısını temsil etmek için yeterli olduğuna inanıyoruz. (En azından 10.000'in altındaki her sayı.)


IRC dupyerine kullanabilirsinizclone
Cyoce

Hatta ihtiyacınız var dupmı? mapalıcısını değiştirmez.
Cyoce

@Cyoce sanırım öyle
Conor O'Brien

Şimdi anlıyorum. Ruby, yineleme sırasında değişiklik yapmaktan hoşlanmaz.
Cyoce

3

Python2, 54 52 51 bayt.

lambda x:'<'.join('>~<~'*int(i)for i in bin(x)[2:])

2 bayt tasarruf için Buğday Sihirbazı ve bir bayt için Ørjan Johansen'e teşekkürler! Bu, ETHproduction'ın Japt cevabı ile aynı fikri kullanır, ancak farklı değiştirme dizeleriyle (örn. İkili gösterimi kullanarak)


[ ]İçindeki jeneratörün etrafına ihtiyacınız yoktur join. joinbir jeneratörü argüman olarak alabilir.
Post Rock Garf Hunter

Sanırım '>~<~'*int(i)bir bayt kurtarabilir.
Ørjan Johansen

Otomatik skorbord snippet'lerinin ve benzerlerinin yararına en yeni skorun en son listelenmesi gerektiğine inanıyorum.
Ørjan Johansen

Orada, geç kaldığım için üzgünüm.
Zacharý

2

05AB1E , 11 bayt

bS'<…~<~‚èJ

Çevrimiçi deneyin!

ETHproductions'ın Japt cevabına benzer.

@Adnan sayesinde 4 bayt kaydedildi!


Hey güzel! Aslında sayıları 05AB1E'de eşit "tür" oldukları için dizelere dönüştürmeniz gerekmez. Sayı değişmezleri için aynıdır (olmadan yapabilirsiniz '). Ayrıca size 11 bayt vermesi gereken dizine ekleme özelliğini de kullanabilirsiniz :).
Adnan

@Adnan Çok teşekkür ederim!
SparklePony Yoldaş

@Adnan Kısa bir soru, è burada nasıl çalışır?
SparklePony Yoldaş

İlk olarak, argümanları değiştirir, çünkü normal olarak değerlendirilirse bir istisna haline gelir. Değiştirdikten sonra 0, sıfırıncı öğeyle ve 1ilk öğeyle eşleşir (çünkü otomatik olarak vektörleşir). İşte nasıl çalıştığına dair daha açık bir örnek.
Adnan

1

Python 2 , 123110 bayt

def w(x):a=map(int,bin(x)[2:]);return x%2*("~<~:<"+"<".join(":"*e for e in a[-2::-1])+"|"*sum(a))or w(x/2)+"<"

Çevrimiçi deneyin!

Ayrıca lambda

w=lambda x:x%2*("~<~:<"+"<".join(":"*int(e)for e in bin(x)[-2:2:-1])+"|"*sum(map(int,bin(x)[2:])))or w(x/2)+"<"

Çevrimiçi deneyin!

Daha kısa olabilir ama işte benim çözümüm. İkili gösterimi alır ve koda dönüştürür.



0

Jöle, 11 10 bayt

Bị“~<~“<”F

Bu, ETHproductions 'Japt yanıtının taşınmış bir sürümüdür. ETHproductions'dan bahsetmişken, beni bir bayt kurtardılar!


Dizeleri değiştirebilir ve dizine eklemenin 0 tabanlı olduğunu düşünebilir misiniz?
ETHproductions

Ne demek istiyorsun? Kullanılabilir indeksleri almak için sayının ikili temsilini artırmam gerektiğinden bahsediyorum.
Zacharý


Çalışmaz, 1 üretir <, Wise'da 0 üretir
Zacharý

Gerçekten mi? Bana verir~<~
ETHproductions
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.