ทำตัวเลขที่ฉลาด


18

ปรีชาญาณเป็นภาษาที่ใช้ง่ายบิตฉันออกแบบในขณะที่กลับ มันเป็นไปตามรอบหลามของการดำเนินงานค่าที่เหมาะสม มีการดำเนินการหลายอย่างโดยส่วนใหญ่จะเหมือนหรือคล้ายกับสัญลักษณ์เทียบเท่าใน Python

  • : ทำซ้ำส่วนบนสุดของสแต็ก

  • ? หมุนด้านบนของสแต็กไปที่ด้านล่าง

  • ! หมุนด้านล่างของสแต็คไปด้านบน

  • [ ] วนรอบในขณะที่ด้านบนของสแต็กไม่เป็นศูนย์

  • ~ไม่ใช่ส่วนบนของสแต็ก ( -(n+1))

  • -ลบล้างด้านบนของสแต็ก ( -n)

  • >bitshift ด้านบนของสแต็คหนึ่งครั้งไปทางขวา ( n//2)

  • <bitshift ด้านบนของสแต็คหนึ่งครั้งไปทางซ้าย ( n*2)

  • ^หรือสองรายการบนสุดของสแต็ก ( เหมือนกับ Python )

  • |หรือสองรายการบนสุดของสแต็ก ( เหมือนกับ Python )

  • &และสองรายการแรกสุดของสแต็ก ( เหมือนกับ Python )


การสร้างจำนวนเต็มใน Wise นั้นค่อนข้างง่ายคุณสามารถสร้างศูนย์ด้วย::^และเพิ่มขึ้นด้วย~-ดังนั้นคุณจึงทำศูนย์และเพิ่มมันหลายครั้ง อย่างไรก็ตามถ้าเราลบ-สิ่งต่าง ๆ ออกไปจะน่าสนใจขึ้นอีกนิด

เรายังคงสามารถทำให้ทุกหมายเลขโดยใช้การดำเนินการที่เหลืออยู่ ตัวอย่างเช่นที่นี่ 3

~<<~

TIO

งานนี้เพราะ~ผลัดกันเป็นศูนย์, สตริงที่ไม่มีที่สิ้นสุดของ0บิตเป็นหนึ่งในเชิงลบสตริงที่ไม่มีที่สิ้นสุดของ1บิตแต่ละ<ผนวก0บิตเพื่อท้ายที่สุดแล้วเมื่อเราจะทำเราทำ~ซึ่งจะเปลี่ยนแต่ละมันเป็นสตริงของ0s ตามด้วยสอง1s หรือตามที่คนส่วนใหญ่เรียกว่า 3


งาน

เขียนโปรแกรมที่เมื่อได้รับจำนวนเต็มบวกจะส่งออกโปรแกรมปรีชาญาณที่จะสร้างตัวเลขnโดยไม่ต้องมี-ในแหล่งที่มาของมัน (แหล่งที่มาของการส่งออกคุณอาจใช้-ในแหล่งที่มาของคุณเอง) คุณอาจคิดว่ามีศูนย์อยู่ด้านบนของสแต็กแล้ว

นี่คือ ไม่ใช่ ดังนั้นคุณควรมุ่งที่จะลดการสร้างซอร์สโค้ดโดยไม่จำเป็นต้องมีเอาต์พุต

ตัวอย่างผลลัพธ์

รายการนี้ไม่ละเอียดถี่ถ้วน

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

คือ 0 รวมอยู่ในpositive integers
colsw

4
ไม่ 0 ไม่รวมอยู่ในจำนวนเต็มบวก
Zacharý

เห็นได้ชัดว่านำมาใช้ในที่ว่างเปล่าสแต็คดัน: 0ฉันคิดว่าควรระบุสิ่งนี้เนื่องจากไม่ชัดเจนว่าควรให้ซ้ำกับกองที่ว่างเปล่า0
Luis Mendo

อักขระอื่น ๆ มีข้อผิดพลาดทางไวยากรณ์หรือไม่หรือไม่
xnor

@Luismendo คุณไม่ทราบเนื้อหาของสแต็คอื่นนอกจากนั้นหากสแต็กเป็นศูนย์
Wheat Wizard

คำตอบ:


8

Japt , 10 ไบต์

¤d0'<1"~<~

ลองออนไลน์!

ความคิดพื้นฐาน: ใช้แทน binary ของจำนวนและแผนที่0การ<และการ1 ~<~ผลลัพธ์สำหรับ 1-10:

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

Metagolfing สิ่งนี้ก็ง่ายเช่นกัน เพียงตัดคู่ของ~~
Draco18s

7

JavaScript (ES6), 34 33 ไบต์

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

ใช้งานได้กับจำนวนเต็ม 32 บิตใด ๆ


ตกลงฉันคิดเรื่องนี้ เย็น! งานที่ดี.
ข้าวสาลี Wizard

7

Haskell , 38 ไบต์

ฉันรู้สึกว่า PPCG ปรับปรุง Haskell ของฉันจริงๆ จังหวะแมวสีขาว

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

fใช้เวลาและผลตอบแทนIntString

ลองออนไลน์!

(ฉันหมายถึง<$fโดยวิธีการมันช่วยตัวละครมากกว่า\_->)

ในFunctorอินสแตนซ์สำหรับ(->) a(ฟังก์ชั่นจากชนิดa) x <$ f = fmap (const x) f = const x . f = const xเรา: ข้อ จำกัด เพียงอย่างเดียวคือfและข้อสุดท้ายconst xจะต้องใช้แหล่งที่มาประเภทaเดียวกัน fอินสแตนซ์เป็นคนขี้เกียจอย่างสมบูรณ์เพื่อประเมินไม่เคยแม้แต่นี้

อีกทางหนึ่งความยาวเท่ากัน แต่น้อยกว่าความชั่ว ( (l!!)เป็นฟังก์ชันที่ไม่ระบุชื่อ):

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

ลองออนไลน์!

ทั้งสองนี้ใช้การแทนแบบเดียวกับคำตอบ JET ของ @ETHproductions แม้ว่าโดยเฉพาะอย่างยิ่งคำแรกอาจให้ซ้ำซ้อน<ในตอนเริ่มต้น

คนแรกจะคำนวณการรวมกันของn "<"และ"~<~"สตริงทั้งหมดแล้วดัชนีลงในรายการผลลัพธ์

รายการที่สองคำนวณรายการที่ไม่สิ้นสุดซ้ำโดยเริ่มต้น""จากนั้นสร้างองค์ประกอบใหม่โดยการต่อท้าย"<"และ"~<~"สตริงไปยังแต่ละองค์ประกอบที่มีอยู่แล้วในรายการ (จริงๆแล้วมันสั้นกว่าเล็กน้อยเพื่อให้""กลายเป็น"<")


1
มัน<$fทำงานบนโลกได้อย่างไร? ตัวอย่าง functor แปลก ๆ ?
xnor

@xnor Mwahahahaฉันเดาว่าฉันควรเพิ่มคำอธิบายแล้ว
Ørjan Johansen

3

Ruby , 118 116 109 107 105 91 91 ไบต์

บันทึก 2 ไบต์ขอบคุณ cyoce!

->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]}

ลองออนไลน์!

นี่คือฟังก์ชันที่ใช้จำนวนเต็มเป็นอินพุตและส่งคืนสตริงที่แสดงถึงจำนวนเต็มนั้นใน Wise คุณสามารถค้นหารุ่นที่ไม่ได้ปรับแต่งได้ที่นี่ซึ่งทดสอบโปรแกรมนี้กับจำนวนเต็มทั้งหมดตั้งแต่ 1 ขึ้นไป

แนวคิดพื้นฐานคือการบันทึก "กลุ่ม" ของค่าคงที่ จากนั้นในแต่ละ "ขั้นตอน" ค่าคงที่จะถูกเพิ่มลงในพูลสำหรับแต่ละฟังก์ชันที่เป็นไปได้ ผมได้เลือกฟังก์ชั่น~, <และ>ซึ่งผมเชื่อว่ามีเพียงพอที่จะแทนจำนวนทุก (อย่างน้อยทุกหมายเลขต่ำกว่า 10,000)


คุณสามารถใช้dupแทนcloneiirc
Cyoce

คุณต้องการdupหรือไม่ mapไม่ได้แก้ไขผู้รับ
Cyoce

@Cyoce ฉันคิดว่ามันจะ
Conor O'Brien

โอ้ฉันเห็นแล้ว Ruby ไม่ชอบการแก้ไขในขณะที่วนซ้ำ
Cyoce

3

Python2, 54 52 51 ไบต์

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

ขอบคุณ Wheat Wizard สำหรับการบันทึก 2 ไบต์และØrjan Johansen สำหรับหนึ่งไบต์! สิ่งนี้ใช้แนวคิดเดียวกันกับคำตอบ Japt ของ ETHproduction แต่มีสตริงการแทนที่ที่แตกต่างกัน (เช่นการใช้การแทนฐานสอง)


คุณไม่จำเป็นต้อง[ ]ไปรอบ ๆ joinภายในเครื่องกำเนิดไฟฟ้าของ joinสามารถใช้ตัวสร้างเป็นอาร์กิวเมนต์
ข้าวสาลี Wizard

ฉันคิดว่า'>~<~'*int(i)อาจช่วยให้คุณประหยัดไบต์
Ørjan Johansen

ฉันเชื่อว่าคะแนนใหม่ล่าสุดควรจะอยู่ในรายการสุดท้ายเพื่อประโยชน์ของตัวอย่างคะแนนจากกระดานคะแนนอัตโนมัติและอื่น ๆ
Ørjan Johansen

ที่นั่นขอโทษด้วยที่มาสาย
Zacharý

2

05AB1E , 11 ไบต์

bS'<…~<~‚èJ

ลองออนไลน์!

คล้ายกับคำตอบ JTH ของ ETHproductions

บันทึกแล้ว 4 ไบต์ขอบคุณ @Adnan!


เฮ้ดี! คุณไม่จำเป็นต้องแปลงตัวเลขเป็นสตริงเนื่องจากพวกเขาเป็น 'ประเภท' เท่ากันใน 05AB1E เหมือนกันสำหรับตัวอักษรตัวเลข (คุณสามารถทำได้โดยไม่ต้อง') คุณสามารถใช้การจัดทำดัชนีซึ่งควรให้11 ไบต์ :)
Adnan

@Adnan ขอบคุณมาก!
สหาย SparklePony

@Adnan เพียงคำถามด่วนèทำงานที่นี่ได้อย่างไร
สหาย SparklePony

ก่อนอื่นมันจะแลกเปลี่ยนอาร์กิวเมนต์เพราะมันจะทำงานเป็นข้อยกเว้นถ้ามันถูกประเมินตามปกติ หลังจากสลับมันจะจับคู่0กับองค์ประกอบ zeroth และ1องค์ประกอบแรก (เพราะ vectorizes อัตโนมัติ) นี่คือตัวอย่างที่ชัดเจนยิ่งขึ้นเกี่ยวกับวิธีการทำงาน
Adnan

1

Python 2 , 123 110 ไบต์

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

ลองออนไลน์!

ยังเป็น 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)+"<"

ลองออนไลน์!

อาจจะสั้นลง แต่นี่คือทางออกของฉัน มันใช้เวลาเป็นตัวแทนไบนารีและเปลี่ยนเป็นรหัส



0

เยลลี่, 11 10 ไบต์

Bị“~<~“<”F

นี่เป็นคำตอบ Japt ของ ETHproductions 'รุ่นที่มีพอร์ต เมื่อพูดถึงผลิตภัณฑ์ ETH พวกเขาช่วยฉันทีหนึ่งไบต์!


คุณสามารถสลับสตริงและแกล้งทำดัชนีเป็นแบบ 0 ได้หรือไม่
ETHproductions

คุณหมายถึงอะไร ฉันหมายถึงความจริงที่ว่าฉันต้องเพิ่มการแสดงเลขฐานสองของจำนวนเพื่อให้ได้ดัชนีที่ใช้งานได้
Zacharý


ใช้งานไม่ได้ผล 1 รายการ<ซึ่งใน Wise ผลิต 0
Zacharý

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.