Haskell , 3 quines, 1119 bytes
Quine 1, 51 ไบต์
การIO
ดำเนินการที่ไม่ระบุชื่อพิมพ์โดยตรงไปยัง stdout
putStr`mappend`print`id`"putStr`mappend`print`id`"
ลองออนไลน์!
Quine 2, 265 bytes
ฟังก์ชั่นf
รับอาร์กิวเมนต์ดัมมี่และส่งกลับสตริง
f c=[b=<<g]!!0++show g;b c=[[[show 9!!0,show 1!!0..]!!6..]!!c];g=[93,0,90,52,82,89,52,51,51,94,84,24,24,39,34,34,106,95,102,110,0,94,50,89,0,90,52,82,82,82,106,95,102,110,0,48,24,24,39,35,106,95,102,110,0,40,24,24,39,37,37,84,24,24,45,37,37,84,24,24,90,84,50,94,52]
ลองออนไลน์!
Quine 3, 803 bytes
ทุกอย่างหลังจากLANGUAGE
pragma เป็นฟังก์ชั่น anymous รับอาร์กิวเมนต์หุ่นและกลับสตริง
{-#LANGUAGE CPP#-}(\q(_:_:_:_:_:_:_:_:z)y(#)_->(y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x)$y(:)#y(:)$ \x->x)z)'\''__TIME__(\(?)v k x->v$k?x)$ \(&)(%)v->v&'{'&'-'&'#'&'L'&'A'&'N'&'G'&'U'&'A'&'G'&'E'&' '&'C'&'P'&'P'&'#'&'-'&'}'&'('%'\\'&'q'&'('&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'_'&':'&'z'&')'&'y'&'('&'#'&')'&'_'&'-'&'>'&'('&'y'&'('%'\\'&'k'&' '&'x'&'-'&'>'%'\''&'&'%'\''&':'&'q'&':'&'k'&':'&'q'&':'&'x'&')'&'#'&'y'&'('%'\\'&'k'&' '&'x'&'-'&'>'%'\''&'%'%'\''&':'&'q'&':'%'\''%'\\'%'\\'%'\''&':'&'k'&':'&'q'&':'&'x'&')'&'$'&'y'&'('&':'&')'&'#'&'y'&'('&':'&')'&'$'&' '%'\\'&'x'&'-'&'>'&'x'&')'&'z'&')'%'\''%'\\'%'\''%'\''&'_'&'_'&'T'&'I'&'M'&'E'&'_'&'_'&'('%'\\'&'('&'?'&')'&'v'&' '&'k'&' '&'x'&'-'&'>'&'v'&'$'&'k'&'?'&'x'&')'&'$'&' '%'\\'&'('&'&'&')'&'('&'%'&')'&'v'&'-'&'>'&'v'
ลองออนไลน์!
ตัวละคร
ควิน 1:
"S`adeimnprtu
ควิน 2:
!+,.0123456789;<=[]bcfghosw
ควิน 3:
#$%&'()-:>?ACEGILMNPTU\_kqvxyz{}
มันทำงานอย่างไร
ควิน 1
putStr`mappend`print`id`"putStr`mappend`print`id`"
Quine 1 เป็นรุ่นที่ได้รับการแก้ไขของGolfล่าสุดของฉันคุณคำตอบที่ quine (พร้อมการปรับปรุงโดย H.PWiz):
- เนื่องจากไม่จำเป็นต้องใช้โปรแกรมแบบเต็ม
main=
จึงถูกลบออก
<>
และ$
ได้ถูกแทนที่ด้วยคำพ้องความหมายที่อยู่ใกล้กับพวกเขาและmappend
id
สิ่งนี้จะทำให้อักขระที่สำคัญ=<>
และผู้ให้บริการที่เป็นประโยชน์$
สำหรับ quines อื่นเพิ่มขึ้น
ควิน 2
f c=[b=<<g]!!0++show g;b c=[[[show 9!!0,show 1!!0..]!!6..]!!c];g=[93,0,......]
ควิน 2 ใช้วิธีการค่อนข้างคล้ายกับโปรแกรมที่ 2 ของล่าสุดของฉันร่วมกันเฉพาะ Quinesคำตอบ แต่ปรับให้เข้ากับควินเองโดยตรงและโดยเฉพาะอย่างยิ่งที่จะหลีกเลี่ยงการใช้ตัวอักษรตัวอักษรซึ่งมีความจำเป็นสำหรับควิน 3. ทั้งสองคนนี้จะประสบความสำเร็จด้วยความช่วยเหลือของshow
ฟังก์ชั่น ซึ่งโชคยังไม่ได้มีตัวละครใด ๆ ที่ใช้
ควินนี้ใช้แท็บแทนช่องว่าง แต่ฉันใช้ช่องว่างด้านล่างเพื่อให้อ่านง่าย
g
คือข้อมูล quine เนื่องจากเป็นรายการจำนวนเต็มที่ส่วนท้ายของรหัส แต่ละหมายเลขหมายถึงอักขระจากรหัสที่เหลือ
- ตัวเลขที่มีการขยับเพื่อให้แท็บที่เป็น
9
0
ทำให้การเข้ารหัสสั้นลงเล็กน้อยโดยการอนุญาตให้ตัวอักษรตัวเล็กสำหรับฟังก์ชั่นและชื่อตัวแปรให้พอดีกับตัวเลข 2 หลัก
b c=[[[show 9!!0,show 1!!0..]!!6..]!!c]
เป็นฟังก์ชั่นในการแปลงตัวเลขให้เป็นอักขระ (จริง ๆ แล้วเป็นสตริงอักขระหนึ่งตัว)
[[show 9!!0,show 1!!0..]!!6..]
!!c
เป็นช่วงที่ตัวละครที่เริ่มต้นด้วยอักขระแท็บซึ่งเป็นดัชนีลงไปด้วย
- อักขระแท็บตัวเองเป็นที่ผลิตโดยการจัดทำดัชนีลงในช่วงอื่น
[show 9!!0,show 1!!0..]
ที่เริ่มต้นด้วยตัวอักษรหลัก'9'
และ'1'
และกระโดดลงไปในขั้นตอนที่ 8
- ตัวละครหลักที่ผลิตโดยการจัดทำดัชนีลงใน
show
สตริงของตัวเลขที่สอดคล้องกัน
f c=[b=<<g]!!0++show g
เป็นหน้าที่หลัก c
เป็นอาร์กิวเมนต์ที่หลอกตา
b=<<g
ใช้=<<
ในการแปลงตัวเลขแต่ละตัวg
ให้เป็นอักขระ (การใช้งาน=<<
มากกว่าเช่นmap
เหตุใดจึงb
ต้องห่ออักขระที่คืนกลับมาไว้ในรายการ)
show g
ให้การแทนค่าสตริงของg
รายการและ++
เชื่อมสตริงเข้าด้วยกัน
- เนื่องจาก
=<<
มีลำดับความสำคัญต่ำกว่า++
จึงจำเป็นต้องใช้การถ่ายคร่อม เพื่อหลีกเลี่ยงการใช้()
(สงวนไว้สำหรับ quine 3) ให้[...]!!0
จัดทำดัชนีไว้ในรายการที่มีองค์ประกอบเดียว
ควิน 3
โดยการออกแบบของ quines อื่น ๆ ควิน 3 ยังคงมีการเข้าถึงวงเล็บแสดงออกแลมบ์ดาอักษรตัวอักษรและสตริง / :
คอนสตรัครายการ นี้จะเพียงพอที่จะสร้างฟังก์ชั่นที่prependsรหัสควินที่จะสตริง
น่าเสียดายที่y
มีการใช้สระตัวพิมพ์เล็กทั้งหมด (ยกเว้นบางครั้ง) ทำให้ไม่มีฟังก์ชันตัวอักษรและตัวเลขที่มีประโยชน์ นอกจากนี้[]""
จะหายไป สิ่งนี้ทำให้วิธีการปกติในการสร้างสตริงที่ว่างเปล่าเพื่อเริ่มทำท่ารหัส
อย่างไรก็ตามตัวอักษรตัวพิมพ์ใหญ่เกือบทั้งหมดยังคงใช้ได้ดังนั้นLANGUAGE
pragma เพื่อรับส่วนขยายภาษาจึงเป็นไปได้ โชคอีกครั้งCPP
(เปิดใช้งานตัวประมวลผลล่วงหน้า C) เป็นนามสกุลภาษาเดียวที่ตั้งชื่อด้วยตัวอักษรตัวพิมพ์ใหญ่เท่านั้น และมาโคร CPP มักจะมีชื่อตัวพิมพ์ใหญ่
ดังนั้นเพื่อให้ได้สตริงว่างที่สำคัญ quine จะช่วยให้CPP
ใช้__TIME__
แมโครเพื่อรับค่าคงที่สตริงของฟอร์ม"??:??:??"
(รับประกันว่าจะมีความยาวเท่ากันเสมอ) และจับคู่รูปแบบกับมัน
{-#LANGUAGE CPP#-}(\q(_:_:_:_:_:_:_:_:z)y(#)_->(y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x)$y(:)#y(:)$ \x->x)z)'\''__TIME__(\(?)v k x->v$k?x)$ \(&)(%)v->v&'{'&'-'&......
หลังจากภาษา pragma, quine ประกอบด้วยการแสดงออกแลมบ์ดาที่ผูกพารามิเตอร์กับข้อโต้แย้งทั้งสี่นี้ (ทิ้งพารามิเตอร์ดัมมี่สุดท้าย_
ที่จะใช้ในภายหลัง):
q
ผูกพันกับการ'\''
ให้ตัวละครอ้างเดียว;
_:_:_:_:_:_:_:_:z
ผูกไว้กับ__TIME__
อาคาสตริงเช่น"??:??:??"
จึงทำให้z
สตริงที่ว่างเปล่า;
y
ที่ถูกผูกไว้กับ(\(?)v k x->v$k?x)
แลมบ์ดา combinator ใช้เพื่อช่วยในการแปลงข้อมูลควินจากซ้ายที่เกี่ยวข้อง ("foldl") ไปทางขวาที่เกี่ยวข้อง ("foldr") แบบฟอร์ม;
- ผู้ประกอบการ
(#)
ผูกพันกับ\(&)(%)v->v&'{'&'-'&...
ข้อมูลควินเอง
(&)(%)v
ข้อมูลควินจะได้รับในรูปแบบของการเข้ารหัสโบสถ์แสดงออกแลมบ์ดากับพารามิเตอร์
- โดยใช้การแสดงออกเป็นค่าโดยเฉพาะอินสแตนซ์
(&)
, (%)
และv
การเข้ารหัสนี้สามารถนำมาใช้อย่างใดอย่างหนึ่งในการสร้างรหัสหลักของควินหรือการสร้างการแสดงข้อมูลแบบควินเอง
- โดยกฎเริ่มต้น fixity ของ Haskell
&
และ%
กลายเป็นตัวดำเนินการเชื่อมโยงด้านซ้ายภายในแลมบ์ดา ดังนั้นพารามิเตอร์อักขระจะรวมกับการเริ่มv
ต้นเริ่มต้นจากด้านซ้าย
- สำหรับตัวละครส่วนใหญ่มีความสอดคล้องกัน
k
&'k'
- เมื่อ
k
เป็น'
หรือ\
ซึ่งจะต้องมีการหลบหนีอยู่ภายในตัวอักษรตัวอักษร, %'\k'
การเข้ารหัสเป็นแทน
เนื่องจากการเข้ารหัสข้อมูลนั้นยังคงอยู่แบบเชื่อมโยง แต่สายอักขระถูกสร้างขึ้นในลักษณะการเชื่อมโยงที่ถูกต้อง Combinator y = (\(?)v k x->v$k?x)
จึงถูกนำมาใช้เพื่อเชื่อมสะพานที่ไม่ตรงกัน
y(...)
มีวัตถุประสงค์เพื่อสร้างฟังก์ชั่นที่เหมาะสมสำหรับใช้เป็นข้อมูลควิน(&)
และ(%)
ผู้ประกอบการ
v
เป็นฟังก์ชั่นจากสตริงถึงสตริง ( v
ตัวอย่างที่ตั้งใจไว้ของข้อมูลควิน)
k
เป็นตัวละครx
สตริงและ?
ตัวดำเนินการที่รวมไว้ในสตริงใหม่ (สำหรับรหัสหลัก, (?)=(:)
สำหรับการสร้างการแสดงข้อมูลควินจริง ๆ แล้วมันซับซ้อนกว่า)
- ดังนั้นจึง
y(?)v k = \x->v$k?x
มีฟังก์ชั่นอื่นจากสตริงการสตริง
เป็นตัวอย่างของการเปลี่ยนแปลงความสัมพันธ์นี้ถ้า(&)=y(:)
:
(v&k1&k2&k3) x
= (((v&k1)&k2)&k3) x
= y(:)(y(:)(y(:)v k1)k2)k3 x
= y(:)(y(:)v k1)k2 (k3:x)
= y(:)v k1 (k2:(k3:x))
= v (k1:(k2:(k3:x)))
= v (k1:k2:k3:x)
โดยทั่วไปเมื่อ(#)
เป็นฟังก์ชั่นข้อมูล quine และf1,f2
เป็นฟังก์ชั่นที่รวมอักขระกับสตริง:
(y(f1)#y(f2)$v) x
= (...(y(f1)(y(f1)v '{') '-')...) x
= v(f1 '{' (f1 '-' (... x)))
การใช้ฟังก์ชั่นควินข้อมูลที่มี(&)=y(f1)
และ(%)=y(f2)
และการใช้นี้กำหนดไว้f1
และf2
จะรวมตัวอักษรข้อมูลควินที่มีแล้วผ่านสตริงผลให้x
v
เนื้อหาของการแสดงออกแลมบ์ดาหลักทำให้สิ่งนี้เข้าด้วยกัน:
(y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x)$y(:)#y(:)$ \x->x)z
'&':q:k:q:x
สำหรับตัวละครk
prepends &'k'
สตริงx
ขณะ'%':q:'\\':k:q:x
prepends %'\k'
ซึ่งเป็นรูปแบบข้อมูลที่ควินเดิมของพวกเขา
- ดังนั้นจึง
y(\k x->'&':q:k:q:x)#y(\k x->'%':q:'\\':k:q:x
เป็นพารามิเตอร์ที่เหมาะสมสำหรับการสร้างการแสดงข้อมูลควินอีกครั้งซึ่งรวมอยู่ในขั้นสุดท้ายz
(สตริงว่าง) แล้วส่งต่อไปยังฟังก์ชันต่อไปนี้
y(:)#y(:)
เป็นพารามิเตอร์ที่ถูกต้องในการเติมรหัสหลักของ quine ให้กับสตริงโดยไม่มีการดัดแปลงอื่น ๆ
- ในที่สุด
\x->x
ก็จะไม่ทำอะไรกับควินินที่สร้างขึ้น