โปรแกรม Autogram


34

ประโยคนี้มีพนักงานสองคน, สองคน, สองคน, ยี่สิบแปดคน, ห้าคน, ห้าคน, สามคน, แปดคน, สิบเอ็ดคน, สามคน, สามคน, สองคน, คนสิบสามคน, เก้าคน, สองคน, ห้าคนยี่สิบห้าคน s, ยี่สิบสาม t, หก v, สิบ w, สอง x, ห้า y, และหนึ่ง z

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

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

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

ขอแนะนำให้คุณรวมคำอธิบายไว้ในโพสต์ของคุณ

ลีดเดอร์

ด้านล่างนี้เป็นกระดานนำสำหรับคะแนนโดยรวมและต่อภาษา:


5
Sandbox (มันอยู่ที่นั่นตั้งแต่ปี 2014!)
นาธาเนียล

อนุญาตให้ใช้ฟังก์ชั่นหรือเฉพาะโปรแกรมเต็มรูปแบบหรือไม่
Uriel

1
หมายเหตุ: คำตอบที่คล้ายกับคำตอบนี้จะไม่นับว่าถูกต้องอีกต่อไป
user202729

1
FWIW คำนิยามควินที่เหมาะสมนั้นแข็งแกร่งกว่าที่ฉันต้องการสำหรับความท้าทายนี้ ตัวอย่างเช่นฉันยินดีที่จะเห็นโปรแกรมที่ใช้อักขระทั้งหมดในบางช่วงที่ต่อเนื่องกันและเพิ่งส่งออก 1 หากอินพุตอยู่ในช่วงนั้นแม้ว่าจะไม่มี "ส่วนของโปรแกรมที่เข้ารหัส ส่วนอื่นของโปรแกรม ". ด้วยเหตุนี้ฉันจึงยอมให้ตัวอย่างเรติน่าถึงแม้ว่ามันจะน่าผิดหวังถ้ามันทำให้คนอื่นไม่สามารถโพสต์ได้เนื่องจากมีเพียง 1 ไบต์ (@ user202729)
Nathaniel

1
เนื่องจากความคิดเห็นด้านบนของฉันฉันได้ลบข้อความที่ใช้กฎควินิน (ฉันได้เก็บส่วนหนึ่งเกี่ยวกับการไม่อ่านซอร์สโค้ด)
นาธาเนียล

คำตอบ:


15

อ็อกเทฟ 44 ไบต์

@(x)sum([[39,'(())*,239==@[[]]msuxx']]==x)*2

ลองออนไลน์!

ผลลัพธ์ของฟังก์ชันเมื่อใช้อักขระแต่ละตัวในฟังก์ชันเป็นอินพุต:

'  (  )  *  ,  2  3  9  =  @  [  ]  m  s  u  x  
2  4  4  2  2  2  2  2  4  2  4  4  2  2  2  4  

อักขระอินพุตอื่นทั้งหมดส่งคืนค่าศูนย์

ความจริงที่ว่าฉันต้องหลบหนี'ทำให้เรื่องนี้ยาวนานขึ้นอีกมาก เพื่อที่จะอธิบายถึงวงเล็บ 4 ตัวฉันเพิ่งมีสำเนาที่ซ้ำกันในสตริง อย่างไรก็ตามการทำซ้ำอะโพสโทรฟีใช้เวลาอะพอสโทรฟีดังนั้นนี่จึงนำเราไปไกลกว่าจากผลลัพธ์ที่ถูกต้อง ดังนั้นผมจึงมีการนับจำนวนของ apostrophes กับ 39ASCII-ค่า แน่นอนนี่หมายความว่าฉันต้องตรวจสอบตัวละคร3และ9ทำให้มันยาวขึ้น


2
นี่คือสิ่งที่ฉันหวังว่าจะเห็นมากขึ้น (การปรับให้เหมาะสมสำหรับปัญหาไม่ใช่แค่การควินมาตรฐานและเพิ่มรหัสเพื่อนับจำนวนตัวอักษร)
นาธาเนียล

7

Excel, 84 ไบต์

=IFERROR(MID("65496331125442343343233",FIND(A1,"""123456789,()=MINORFADEOMEN"),1),0)

Find()จะมองหาค่าในเซลล์A1ภายในสตริง"123456789,()=MINORFADEOMEN( """ที่จุดเริ่มต้นคือการหลบหนีตัวละครและจะประเมินให้เป็นเพียง")

ขึ้นอยู่กับผลจากการFind()ที่Mid()ฟังก์ชั่นจะกลับตัวอักษรที่สอดคล้องกันจากสตริงของตัวเลข สายนี้ถูกสร้างผ่านการทำซ้ำจนกว่าจะหยุดการเปลี่ยนแปลง

หากA1ไม่พบอักขระในให้Find()ส่งคืนข้อผิดพลาดดังนั้นIfError()ฟังก์ชันจะหนีไปที่จะส่งคืน0แทน

OMENในตอนท้ายของการเป็นสตริงการสืบค้นในFind()ฟังก์ชั่นที่มีตัวอักษรที่ซ้ำกันเพื่อตำแหน่งของพวกเขาจะไม่ถูกส่งกลับ แต่พวกเขาเป็นสิ่งที่จำเป็นในการปรับการนับจำนวนตัวอักษร หากไม่มีพวกเขาก็มีการนับการเปลี่ยนแปลงที่ไม่สิ้นสุด การจัดเรียงตัวอักษรเป็นทางเลือกที่โวหาร


5

JavaScript (ES6), 70 ไบต์

ไม่ได้อ่านที่มาของฟังก์ชั่น แต่มันค่อนข้างยาว รับอินพุตเป็นสตริง 1 อักขระ

i=>~(n='\\34=\'in(|)0257?:.>[]Odefx~'.indexOf(i))?'3733544333'[n]||2:0

ลองออนไลน์!


คุณสามารถย่นมัดให้สั้นลงได้โดยการทำใหม่อีกเล็กน้อยเพื่อลดจำนวนอักขระที่แตกต่าง: i=>'36335633'[i='\\36=\'i|&()25.>[]Odefx~n'.indexOf(i)]||~i&&2(บันทึก 8 ไบต์)
Yair Rand

5

เรติน่า 1 ไบต์

นี้จะไม่ถูกต้องถ้าต่อไปนี้อย่างเคร่งครัดกฎควิน แต่สหกรณ์ explicitely ได้รับอนุญาตในการแสดงความคิดเห็น

x

ลองออนไลน์!

ในเรตินาโปรแกรมบรรทัดเดียวจะนับจำนวนการเกิดของ regex นั้นในอินพุต ความท้าทายนี้จะแก้ไขได้โดยอักขระ ASCII ใด ๆ เดียวยกเว้น`, ., +, *, ?, [, (, ), ^, $, \และขึ้นบรรทัดใหม่


5

C # (คอมไพเลอร์ Visual C #) , 88 57 ไบต์

x=>"\\\"(())==>>??..::3300CCaaiinoossttx".Contains(x)?3:0

ลองออนไลน์!

ส่งคืน3หากสตริงมีถ่านที่ส่งผ่านมิฉะนั้นจะส่งกลับ 0 มิฉะนั้นสตริงจะมีอักขระแต่ละตัวของรหัสอย่างน้อยหนึ่งครั้งและจำนวนที่ต้องการเพื่อให้มีอักขระถ่าน3ครั้งในรหัส

-31 ไบต์ขอบคุณKevin Cruijssen


วิธีการที่ดี! +1 จากฉัน คุณสามารถบันทึกไบต์จำนวนหนึ่งโดยการลบวงเล็บไปรอบ ๆ(a)=>และรับอินพุตเป็นสตริงแทนที่จะเป็นถ่านดังนั้นจึง.ToString()ไม่จำเป็นอีกต่อไป (และa+""อาจถูกนำมาใช้เช่นกันสำหรับความท้าทายของโค้ด - กอล์ฟที่คุณไม่ต้องการ.ToString()) นอกจากนี้เนื่องจาก.Containsมีอยู่แล้วaคุณอาจทำให้ตัวแปรอินพุตเป็นอักขระที่ไม่ได้ใช้ (เช่นxหรือq) ที่แตกต่างกันเพื่อให้มี 3 ตัวสำหรับแต่ละตัวละครแทนที่จะเป็น 4 แก้ไข: ไม่ต้องสนใจส่วนสุดท้ายฉันเห็นว่า"มีการใช้ 4 ครั้งเช่นกัน
Kevin Cruijssen

@KevinCruijssen ขอบคุณสำหรับคำแนะนำ แต่สตริงถูกต้องเป็นอินพุตหรือไม่ เมื่อพิจารณาจาก OP ขอให้ป้อนเป็นไบต์?
Hyarus

ตราบใดที่มันเป็นสายอักขระตัวเดียวฉันค่อนข้างแน่ใจว่ามันเป็น ภาษาส่วนใหญ่สามารถป้อนค่าสตริงได้เท่านั้นและบางภาษาที่มีอักขระยังคงเลือกที่จะป้อนเป็นสตริง (เช่น Java, JavaScript, และ Japt) รูปแบบอินพุตและเอาต์พุตมักจะมีความยืดหยุ่น แต่คุณสามารถถาม OP ใน แสดงความคิดเห็นว่าคุณยังสงสัยอยู่หรือไม่ :)
Kevin Cruijssen

1
@KevinCruijssen ฟังดูสมเหตุสมผล และถ้าเราหลบหนีจากหนึ่งใน "เราสามารถลงไปที่ 3 ที่ต้องการต่อถ่าน
Hyarus

2
สตริงอักขระเดียวเนื่องจากอินพุตถูกปรับโดยฉัน
นาธาเนียล

4

Haskell , 66 ไบต์

สองเวอร์ชันแรกเป็นควินที่กรองอักขระที่ต้องการแล้วใช้ความยาว:

q c=length.filter(==c)$id<>show$"q c=length.filter(==c)$id<>show$"

ลองออนไลน์หรือทดสอบกับตัวละครทั้งหมด! * * * *


ทางเลือกที่ไม่มี(<>)72 ไบต์

q c=length.filter(==c)$(++)<*>show$"q c=length.filter(==c)$(++)<*>show$"

ลองออนไลน์หรือทดสอบกับตัวละครทั้งหมด!


ทางเลือกอื่นที่ไม่ใช่ควิน87 86 ไบต์

อาจยังได้รับการปรับปรุง แต่ฉันมีความสุขที่ได้รับมันลงไปเพียงสามกลุ่มที่แตกต่างกัน

ฉันชอบอันนี้ดีที่สุดแม้ว่าจะนับจำนวนไบต์มากที่สุด มันคำนวณจำนวนตัวอักษร / ไบต์โดยเป็นผลรวมของ2,3และ7 (สังเกตว่าตัวละครบางตัวในหลายกลุ่ม):

u t=sum[fst e|e<-[(2," ()-237<=dflnst|"),(3," ()[\\]`mstu"),(7,"\",ee")],t`elem`snd e]

ลองออนไลน์หรือทดสอบกับตัวละครทั้งหมด!


* นำเข้า(<>)เนื่องจากรุ่น GHC ของ TIO คือ 8.0.2


3

Python 2 , 54 52 32 ไบต์

-20 ไบต์ขอบคุณ ovs

("''+.23cnotu()"*2+'"*'*3).count

ลองออนไลน์!


1
ทำไมคุณไม่มีแลมบ์ดาหรืออินพุท?
Stewie Griffin

2
@StewieGriffin หลามโดยอัตโนมัติผูกอ้างอิงวิธีการเพื่อให้เทียบเท่ากับ"xxx".count lambda c:"xxx".count(c)
Neil

@StewieGriffin และคุณใช้ทั้งสองอย่างในลักษณะเดียวกัน -> f="xxx".countและf=lambda c:"xxx".count(c)จะถูกเรียกว่าf('a')
Rod

3

Husk , 11 10 8 ไบต์

ขอบคุณLeoสำหรับ -2 ไบต์!

#sD"#sD"

ลองออนไลน์!

คำอธิบาย

สิ่งนี้ทำให้แน่ใจว่ามันจะใช้ ASCII เท่านั้น (เพราะshowจะทำให้มันสับสน) และตัวละครแต่ละตัวนั้นบรรจุสองครั้ง:

#sD"#sD"  -- character as input, eg. '"'
   "#sD"  -- string literal (note the redundant '"'): "#sD"
  D       -- double: "#sD#sD"
 s        -- show: "\"#sD#sD\""
#         -- number of occurences: 2

ส่วนขยายควินมาตรฐาน 11 ไบต์

#hS+s"#hS+s

ลองออนไลน์!

คำอธิบาย

#hS+s"#hS+s  -- character as input, eg. '"'
     "#hS+s  -- string literal: "#hS+s"
  S+         -- join with itself: ("#hS+s"++)
    s        -- | and itself shown: "\"#hS+s\""
             -- : "#hS+s\"#hS+s\""
 h           -- init: "#hS+s\"#hS+s"
#            -- number of occurences in string: 1

1
คุณสามารถจัดการราคาได้ง่ายขึ้นโดยการเพิ่มสตริงก่อนที่จะแสดง: ลองออนไลน์!
ลีโอ

3

Java 10, 164 81 57 ไบต์

q->"q-->>\\\"..ccoonttaaiiss(())??33::00".contains(q)?3:0

คำตอบของพอร์ตของ@Hyarus 'C #ดังนั้นอย่าลืม upvote เขา!

คำอธิบาย:

ลองออนไลน์

q->      // Method with String parameter and integer return-type
  "q->\\\"..ccoonttaaiiss(())??33::00".contains(q)?
         //  If the string above contains the input character
   3     //   Return 3
  :      //  Else:
   0     //   Return 0

เก่า164 ไบต์ตอบ:

c->{var s="c->{var s=%c%s%1$c;return s.format(s,34,s).replaceAll(%1$c[^%1$c+c+']',%1$c%1$c).length();}";return s.format(s,34,s).replaceAll("[^"+c+']',"").length();}

คำอธิบาย:

ลองออนไลน์

c->{                                  // Method with char parameter and integer return-type
  var s="c->{var s=%c%s%1$c;return s.format(s,34,s).replaceAll(%1$c[^%1$c+c+']',%1$c%1$c).length();}";
                                      //  Unformatted source code
  return s.format(s,34,s)             //  Create the formatted source code (the quine),
          .replaceAll("[^"+c+']',"")  //  remove all characters not equal to the input,
          .length();}                 //  and return the length

:

  • String sมีซอร์สโค้ดที่ยังไม่ฟอร์แมต
  • %sจะใช้ในการป้อนข้อมูล String s.format(...)นี้ลงในตัวเองด้วย
  • %c, %1$cและ34จะใช้ในการจัดรูปแบบราคาสองครั้ง
  • s.format(s,34,s) ทำให้มันเข้าด้วยกัน

ส่วนที่ท้าทาย:

  • .replaceAll("[^"+c+']',"") ลบอักขระทั้งหมดยกเว้นอักขระที่เท่ากับอินพุต
  • .length() จากนั้นใช้ความยาวของสตริงนี้

หมายเหตุ: .split(c).length(ด้วยการStringป้อนข้อมูลแทนchar) อาจดูสั้นลง แต่มีปัญหาสองประการ:

  1. อักขระตัวแรกให้ผลลัพธ์ที่ไม่ถูกต้องดังนั้นหากc(ด้วยc->ส่วนที่เป็นส่วนนำ) ป้อนข้อมูลอักขระนั้นจะส่งคืนอักขระหนึ่งตัวที่น้อยเกินไปอย่างไม่ถูกต้อง สิ่งนี้สามารถแก้ไขได้โดยการเพิ่ม+(c==99?1:0)ทั้งซอร์สโค้ดและซอร์สโค้ดสตริงที่ยังไม่ฟอร์แมต (และเปลี่ยน.split(c)เป็น.split(c+"")แต่แล้วเรายังคงมีปัญหาต่อไปนี้:
  2. หากอักขระ regex (เช่น$) เป็นอินพุต.splitจะตีความว่าเป็น regex โดยให้ผลลัพธ์ที่ไม่ถูกต้อง

3

Haskell , 58 ไบต์

f c=sum[2|x<-succ '!':"f c=sum[2|x<-succ '!':,x==c]",x==c]

ลองออนไลน์! หรือตรวจสอบการแก้ปัญหา

ทางเลือกนับไบต์เดียวกัน:

f c=sum[2|x<-tail$show"f c=sum[2|x<-tail$show,x==c]",x==c]
f c=sum[1|x<-id<>show$"f c=sum[1|x<-id<>show$,x==c]",x==c]

Haskell , 90 ไบต์

sum.($zip"1234\"$,.[\\]opu+()iklmsz652"$[4,4,11,3,3,3,16,5,3,3,3,3,3,3,3]++[2,2..]).lookup

ลองออนไลน์! หรือตรวจสอบการแก้ปัญหา ใช้ความจริงที่ว่าและเช่นsum Nothing = 0sum (Just 4) = 4


3

สมอลล์ทอล์ค , 112 132ไบต์

Smalltalk ไม่เป็นที่รู้จักกันดีในเรื่องความเหมาะสมของการเล่นกอล์ฟ :-)

วิธีที่กำหนดไว้ในคลาสของตัวละคร (ทดสอบใน VA Smalltalk และ Squeak ควรทำงานในภาษาอื่นเช่น VisualWorks และ Pharo ด้วย):

a^(0to:6),#(10 18)at:(#('' ',[]^|+68cForu' '#0adefln' '1it' '()' ':s' ' ' '''')findFirst:[:s|s includes:self])+1

ตัวละครที่เกิดขึ้นในแหล่งที่มาจะถูกจัดกลุ่มตามจำนวนที่เกิดขึ้น กลุ่มจะถูกทดสอบสำหรับกลุ่มแรกที่มีตัวรับและส่งคืนจำนวนการจับคู่ที่ตรงกัน

วิธีเก่า:

a^('''''((((())))):::[[[[]]]]^^^^^0000066666aaaacccccdddddeefffFFFFFiiilllnnnnnrrrrrsssTTTTTuuuu'includes:self)ifTrue:[6]ifFalse:[0]

ตัวละครทุกตัวที่ปรากฏในวิธีการปรากฏขึ้นอย่างแน่นอน 6 ครั้ง (โดยการทำซ้ำในค่าคงที่สตริง) ดังนั้นวิธีการเพียงแค่ตรวจสอบว่าผู้รับมีอยู่ในสตริงและส่งกลับ 6 ถ้ามันเป็น 0 มิฉะนั้น

หลังจากกำหนดวิธีการดังกล่าวข้างต้นคุณสามารถตรวจสอบได้โดยใช้

| code |
code := Character sourceCodeAt: #a.
((0 to: 255) collect: [:b | b asCharacter]) reject: [:c | c a = (code occurrencesOf: c)]

ผลลัพธ์ควรจะว่างเปล่า


1
ยินดีต้อนรับสู่ PPCG!
Martin Ender

2

JavaScript ขนาด 31 ไบต์

f=c=>~-`f=${f}`.split(c).length

ลองออนไลน์


1
ฉันคิดว่านี่อ่านซอร์สโค้ดของตัวเองใช่ไหม ที่ถูกแบนอย่างชัดเจนเป็นตัวหนาในคำถาม
นาธาเนียล

1
@Nathaniel ดูที่นี่
ขนปุย

2
อืมมม เอาเป็นว่าฉันคิดว่ามันโง่ แต่ฉันก็ไม่เห็นด้วยกับฉันทามติฉันคิดว่าเมตาดาต้า
นาธาเนียล

1
@ นาธาเนียลสำหรับโปรแกรมทั้งหมดที่ทำให้การทดสอบง่ายขึ้นพวกเขายังทำให้เป็นเรื่องง่าย
user202729

1
@ user202729 ฉันไม่คิดอย่างนั้นใช่ไหม ตัวอย่างเช่นคุณไม่สามารถทำสิ่งเดียวกันใน Python นี่คือการย้อนกลับที่ไม่ใช่การพิสูจน์
นาธาเนียล



2

Haskell , 96 ไบต์

n"n"=15;n"="=14;n" "=2;n";"=13;n"\\"=3;n"\""=25;n"0"=2;n"1"=4;n"2"=4;n"3"=4;n"4"=5;n"5"=5;n n3=0

ลองออนไลน์!

Haskell , 109 ไบต์

n 'n'=15;n '='=14;n ' '=14;n ';'=13;n '\\'=3;n '\''=25;n '0'=2;n '1'=5;n '2'=4;n '3'=4;n '4'=5;n '5'=5;n n3=0

ลองออนไลน์!

Haskell , 122 ไบต์

n 'n'=21
n '='=14
n ' '=14
n '\n'=12
n '\\'=4
n '\''=32
n '0'=2
n '1'=5
n '2'=5
n '3'=3
n '4'=5
n '5'=5
n nnnnnn4'''''''=0

ลองออนไลน์!

คำอธิบาย

คำตอบเหล่านี้ไม่ซับซ้อนอย่างมาก มันเป็นชุดของการประกาศหนึ่งสำหรับแต่ละตัวละครที่มีอยู่ในโปรแกรม ในตอนท้ายเรามีการจับทั้งหมดที่ส่งกลับ 0 สำหรับตัวละครที่ไม่ได้อยู่ในโปรแกรม

ฉันใช้เทคนิคสองสามอย่างเพื่อลดจำนวนอักขระที่จำเป็นในโปรแกรมและจากนั้นฉันก็เล่นกับสิ่งต่าง ๆ จนกระทั่งตัวเลขปรากฏออกมาถูกต้อง คุณจะเห็นว่าฉันได้เสริมชื่อตัวแปรในการประกาศล่าสุดทั้ง 3 รายการ ความแตกต่างระหว่าง 3 โปรแกรมคือฉันเลือกใช้บรรทัดใหม่หรือ;แบ่งบรรทัดและเลือกที่จะใช้ Chars เป็นอินพุตหรือสตริง ;วิธีการไม่ได้ดูเหมือนเนื้อแท้กว่าคนอื่น ๆ ที่เพิ่งได้รับโชคและสิ้นสุดขึ้นสั้น แต่มันจะดูเหมือนว่าการใช้สายเป็นความคิดที่ดีกว่าตัวอักษรตัวอักษรเพราะจำเป็นต้องมีช่องว่างหลังชื่อฟังก์ชั่นที่สายไม่ได้


: | เกิดอะไรขึ้นกับการสะกดของคุณในคำอธิบาย
ASCII- เท่านั้น

2

ช่องว่าง 140 ไบต์

[S S S N
_Push_0][S N
S _Duplicate][S N
S _Duplicate][T N
T   S _Read_STDIN_as_character][T   T   T   _Retrieve][S S S T  S S T   N
_Push_9][T  S S T   _Subtract][S N
S _Duplicate][N
T   S S T   N
_If_0_Jump_to_Label_TAB][S S S T    N
_Push_1][T  S S T   _Subtract][S N
S _Duplicate][N
T   S S N
_If_0_Jump_to_Label_NEWLINE][S S S T    S T T   S N
_Push_22][T S S T   _Subtract][N
T   S T N
_If_0_Jump_to_Label_SPACE][N
S T N
_Jump_to_Label_PRINT][N
S S S T N
_Create_Label_TAB][S S S T  S S T   S T N
_Push_37][N
S T N
_Jump_to_Label_PRINT][N
S S S N
_Create_Label_NEWLINE][S S S T  S S S S T   N
_Push_33][N
S T N
_Jump_to_Label_PRINT][N
S S T   N
_Create_Label_SPACE][S S S T    S S S T T   S N
_Push_70][N
S S N
_Create_Label_PRINT][T  N
S T _Print_as_integer]

เพิ่มตัวอักษรS(ช่องว่าง), T(แท็บ) และN(บรรทัดใหม่) เป็นการเน้นเท่านั้น
[..._some_action]เพิ่มเป็นคำอธิบายเท่านั้น

70 ช่องว่าง 37 แท็บและ 33 บรรทัดใหม่ที่ใช้

ฉันมักจะใช้สร้างป้ายชื่อในลำดับที่NSSN, NSSSN, NSSTN, NSSSSN, NSSSTN, NSSTSN, NSSTTNฯลฯ แต่เพราะการพิมพ์หมายเลขที่ไบนารีที่S=0/ T=1ถูกนำมาใช้มีผลกระทบต่อจำนวนที่ฉันจำเป็นต้องออกผมใช้ฉลากNSSN, NSSSN, NSSTNและNSSSTNแทนซึ่งทำให้ จำนวนช่องว่าง / แท็บที่สมบูรณ์แบบที่จะพิมพ์ด้วยเลขฐานสองSSSTSSSSTN(33; จำนวนบรรทัดใหม่), SSSTSSTSTN(37; จำนวนแท็บ) และSSSTSSSTTSN(70; จำนวนช่องว่าง)

คำอธิบายในรหัสเทียม:

Character c = STDIN-input as character
If c is a tab:
  Print 37
Else if c is a new-line:
  Print 33
Else if c is a space:
  Print 70
Else
  Print 0

ตัวอย่างการทำงาน:

อินพุต: space

Command       Explanation                   Stack       Heap     STDIN   STDOUT   STDERR

SSSN          Push 0                        [0]
SNS           Duplicate top (0)             [0,0]
SNS           Duplicate top (0)             [0,0,0]
TNTS          Read STDIN as character       [0,0]       {0:32}   \n
TTT           Retrieve                      [0,32]      {0:32}
SSSTSSTN      Push 9                        [0,32,9]    {0:32}
TSST          Subtract top two (32-9)       [0,23]      {0:32}
SNS           Duplicate top (23)            [0,23,23]   {0:32}
NTSSTN        If 0: Jump to Label_TAB       [0,23]      {0:32}
SSSTN         Push 1                        [0,23,1]    {0:32}
TSST          Subtract top two (23-1)       [0,22]      {0:32}
SNS           Duplicate top (22)            [0,22,22]   {0:32}
NTSSN         If 0: Jump to Label_NEWLINE   [0,22]      {0:32}
SSSTSTTSN     Push 22                       [0,22,22]   {0:32}
TSST          Subtract top two (22-22)      [0,0]       {0:32}
NTSTN         If 0: Jump to Label_SPACE     [0]         {0:32}
NSSTN         Create Label_SPACE            [0]         {0:32}
SSSTSSSTTSN   Push 70                       [0,70]      {0:32}
NSTN          Jump to Label_PRINT           [0,70]      {0:32}
NSSN          Create Label_PRINT            [0,70]      {0:32}
TNST          Print as integer              [0]         {0:32}            70
                                                                                  error

โปรแกรมหยุดทำงานโดยมีข้อผิดพลาด: ไม่มีการกำหนดทางออก
ลองใช้ออนไลน์ (ด้วยพื้นที่ว่างเปล่าแท็บและบรรทัดใหม่เท่านั้น)

อินพุต: แท็บ

STDIN จะเป็น\t( 9) แทนซึ่งในกรณีนี้จะเป็นการตรวจสอบ0ครั้งแรกIf 0ไปที่LABEL_TAB/ NSSSTNและจะผลักดันและพิมพ์37แทน

ลองใช้ออนไลน์ (ด้วยพื้นที่ว่างเปล่าแท็บและบรรทัดใหม่เท่านั้น)

อินพุต: บรรทัดใหม่

STDIN จะเป็น\n( 10) แทนซึ่งในกรณีนี้จะเป็นการตรวจสอบ0ครั้งที่สองIf 0ไปที่Label_NEWLINE/ NSSSNและจะผลักดันและพิมพ์33แทน

ลองใช้ออนไลน์ (ด้วยพื้นที่ว่างเปล่าแท็บและบรรทัดใหม่เท่านั้น)

อินพุต: สิ่งอื่นใด

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

ลองใช้ออนไลน์ (ด้วยพื้นที่ว่างเปล่าแท็บและบรรทัดใหม่เท่านั้น)


1
นี่เป็นภาษาที่ยอดเยี่ยมสำหรับความท้าทายนี้
qwr

2

Japt , 27 ไบต์

\Ua"" a a a " ÄU\\\"a "aU Ä
            " ÄU\\\"a "     // Given this string literal,
                       aU   // find the last index of the input
                          Ä // and add +1.
\Ua"" a a a                 // Do nothing useful, but make the results match.

นานกว่าคำตอบ Japtive ที่มีอยู่ แต่ใช้วิธีการอื่น
มีข้อ จำกัด โดยธรรมชาติที่ตัวอักษรทั้งหมดจะต้องเกิดขึ้นซ้ำกันหลายครั้ง

รับอินพุตเป็นสตริง

ลองออนไลน์!


2

Perl, 130 ไบต์

+print+0+((0)x40,6,6,0,3,43,0,0,0,22,12,6,3,5,2,4,0,1,0,0,0,1,0,1,(0)x28,1,0,1,(0)x6,1,(0)x4,1,(0)x4,1,1,1,0,2,0,1,0,0,0,5)[ord<>]

ไม่มีการขึ้นบรรทัดใหม่หรือพื้นที่ว่างอื่น อ่านบรรทัดจากเอาต์พุตมาตรฐาน แต่สนใจเฉพาะไบต์แรกจากนั้นพิมพ์จำนวนครั้งที่ไบต์เกิดขึ้นในซอร์สโค้ดของตัวเองเป็นทศนิยมโดยไม่ต้องขึ้นบรรทัดใหม่

โปรแกรมตรงไปตรงมา ซอร์สโค้ดส่วนใหญ่ครอบครองโดยตารางตัวอักษรที่ให้คำตอบสำหรับแต่ละไบต์ที่เป็นไปได้ ละเว้นศูนย์ต่อท้ายและศูนย์ที่อยู่ติดกันถูกบีบอัดรันไทม์ แต่ไม่มีเทคนิคพิเศษนอกเหนือจากนั้น ส่วนที่เหลือของโปรแกรมจะอ่านอินพุตและค้นหาคำตอบในตาราง

ตัวอย่างเช่นส่วน22, 12, 6, 3, 5, 2, 4, 0, 1, 0ในซอร์สโค้ดให้ความถี่ของตัวเลขดังนั้นจึงมีศูนย์ 22, 12 คน, 6 twos ฯลฯ ในซอร์สโค้ด ดังนั้นหากคุณเข้าสู่0อินพุตมาตรฐานของโปรแกรมโปรแกรมจะพิมพ์ออก22มา


2

C (gcc) , 1033 ไบต์

#include <stdio.h>
int main(int argc,char *argv[]){int r=0*14811;switch((int)argv[1][0]){case' ':r=6;break;case'"':r=3;break;case'#':r=2;break;case'%':r=2;break;case'\'':r=101;break;case'(':r=5;break;case')':r=5;break;case'*':r=5*1*1;break;case'.':r=2;break;case':':r=51;break;case';':r=103;break;case'<':r=2;break;case'=':r=52;break;case'>':r=2;break;case'[':r=4;break;case'\\':r=3;break;case']':r=4;break;case'0':r=11;break;case'1':r=20;break;case'2':r=20;break;case'3':r=9;break;case'4':r=7;break;case'5':r=12;break;case'6':r=3;break;case'7':r=2;break;case'8':r=5;break;case'9':r=2;break;case'a':r=106;break;case'b':r=51;break;case'c':r=55;break;case'd':r=4;break;case'e':r=102;break;case'f':r=2;break;case'g':r=4;break;case'h':r=4;break;case'i':r=10;break;case'k':r=51;break;case'l':r=2;break;case'm':r=2;break;case'n':r=8;break;case'o':r=2;break;case'p':r=2;break;case'r':r=108;break;case's':r=53;break;case't':r=8;break;case'u':r=2;break;case'v':r=3;break;case'w':r=2;break;case'{':r=3;break;case'}':r=3;break;}printf("%d",r);}

ลองออนไลน์!

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


2

C (gcc) , 192 ไบต์

F(J){J=J-70?J-40?J-41?J-74?J-'{'?J-'}'?J-39?J-48?J-49?J-50?J-51?J-52?J-53?J-54?J-55?J-56?J-57?J-47?J-61?J-63?J-45?J-58?J-59?0:1:23:23:23:1:2:3:3:4:4:14:14:10:10:15:6:4:2:2:25:1:1:1;}//84332211

ลองออนไลน์!

อาจเป็นไปได้ที่จะลงเล่นกอล์ฟต่อไป ใช้ความคิดเห็นในตอนท้ายว่าเป็น 'พื้นที่ขูด' เพื่อเพิ่มตัวเลขพิเศษ เมื่อฉันต้องเปลี่ยนตัวเลขจาก X เป็น Y ฉันจะเปลี่ยนหนึ่งใน Y ให้เป็น X เพื่อชดเชย นอกเหนือจากนั้นนี่เป็นเพียงฟังก์ชั่นที่รับจำนวนเต็มโดยใช้เคล็ดลับการมอบหมายเพื่อส่งกลับค่าตามเงื่อนไขที่ประกอบไปด้วยส่วนใหญ่


ฉันสามารถบันทึก 1 ไบต์ด้วยการย้ายค่าคงที่ตัวเลขไปหลังศูนย์เช่น0*84332211เดียวกับในคำตอบ C อื่น ๆ แต่ฉันยังสามารถบันทึกไบต์โดย refactoring ที่มีขนาดเล็กลงดังนั้นฉันจะไม่ต้องรำคาญ
LambdaBeta

คุณสามารถบันทึกไบต์โดยใช้การตรวจสอบช่วงสำหรับหมายเลขทั่วไปน้อยกว่าได้หรือไม่ นั่นคือถ้าเรา assme 4-9 เป็นตัวละครที่หายากเราสามารถจัดการพวกมันทั้งหมดพร้อมกันด้วยการตรวจสอบตามเงื่อนไข
qwr

เกือบจะแน่นอน เราอาจลบได้มากขึ้นโดยการเลือกชื่อที่ฉลาดสำหรับสิ่งต่าง ๆ เพื่อให้สัญลักษณ์บางอย่างไม่ปรากฏขึ้นหรือเพื่อให้สามารถใช้รูปแบบบิต (เช่นJ&1?เพื่อจับคู่อักขระแปลก ๆ ทั้งหมด) ฉันอาจเล่นกอล์ฟต่อไปหากพบว่าต้องใช้เวลา
LambdaBeta

2

x86 .COM 17 ไบต์ขัดแย้งกัน

0120 BF2001        MOV     DI,0120 (120 be the current address)
0123 B91100        MOV     CX,0011
0126 AE            SCASB
0127 7502          JNZ     012B
0129 FEC4          INC     AH
012B E2F9          LOOP    0126
012D C1E808        SHR     AX,8
0130 C3            RET

36 ไบต์

0100 BF????        MOV     DI,(an copy of this code)
0103 B91200        MOV     CX,0012
0106 AE            SCASB
0107 7503          JNZ     010C
0109 80C402        ADD     AH,02
010C E2F8          LOOP    0106
010E C1E808        SHR     AX,8
0111 C3            RET

2
นี่ไม่ใช่การอ่านรหัสของตัวเองหรือ
Razvan Socol

@RazvanSocol ฉันคิดว่ามันเหมือนโซลูชัน JavaScript
l4m2

@RazvanSocol ดีไม่ต้องบันทึกในไฟล์ดังนั้นมันก็โอเค fungeoids และ JS จำนวนมากทำเช่นนี้
ASCII เท่านั้น

ฉันเถียงว่าคุณกำลังอ่านโค้ดที่ดำเนินการอยู่ซึ่งนับว่าเป็น "การอ่านซอร์สโค้ดของตัวเอง" ตอนนี้คุณสามารถยืนยันว่ามีสำเนาของสตริงของโปรแกรมตามที่วิธีแก้ปัญหาส่วนใหญ่ที่ทำก็คือ "การอ่านซอร์สโค้ด" แต่สตริงไม่ได้ถูกดำเนินการ
qwr




1

x86, 42 40 ไบต์

ที่นี่ฉันใช้กลยุทธ์เดียวกับคนอื่น ๆ : สร้างสำเนาสตริงของโปรแกรมด้วยไบต์ที่ไม่ซ้ำกันแล้วส่งกลับ 2 ในalถ้าอินพุตalอยู่ในสตริง ถ้าเราปล่อยให้ตัวเองในการอ่านรหัสที่จะดำเนินการจริงที่เราได้รับการแก้ปัญหาของ l4m2

scasbฉันได้ไปใช้ประโยชน์จากการเรียนการสอนสตริงเย็น เท่าที่ทราบแล้วไม่มีไบต์ที่ซ้ำกัน แต่นี่คือสิ่งที่ฉันจะทำพลาดได้ง่าย กำลังโหลดที่อยู่สตริงใช้เวลา 5 ไบต์ แต่ฉันไม่ทราบวิธีแก้ปัญหาที่สั้นกว่านี้ (64- บิตleaของripออฟเซ็ตใช้เวลา 6 ไบต์)

-2 โดยการกระโดดถอยหลังเพื่อหลีกเลี่ยงการใช้02สองครั้ง

.section .text
.globl main
main:
        mov     $0xff, %eax

start:
        push    $20             # program length
        pop     %ecx            # counter
        mov     $str, %edi      # load string

loop:
        scasb                   # if (al == *(edi++))  
        jne     loop1           
        mov     $2, %al         # ret 2
end:    ret             
loop1:
        loop    loop            # do while (--counter)
        xor     %eax, %eax      # ret 0
        jmp     end

str:    .byte 0x6a,0x14,0x59,0xbf,0xf4,0x83,0x04,0x08 
        .byte 0xae,0x75,0x03,0xb0,0x02,0xc3,0xe2,0xf8
        .byte 0x31,0xc0,0xeb,0xf9 

Hexdump (ของรูปแบบไฟล์ไบนารี elf32-i386 เนื่องจากไฟล์ obj น่าเสียดายที่มี00ไบต์สำหรับstrที่อยู่):

000003e0  6a 14 59 bf f4 83 04 08  ae 75 03 b0 02 c3 e2 f8  |j.Y......u......|
000003f0  31 c0 eb f9 6a 14 59 bf  f4 83 04 08 ae 75 03 b0  |1...j.Y......u..|
00000400  02 c3 e2 f8 31 c0 eb f9                           |....1...|

x86, 256 ไบต์

คำตอบที่น่าเบื่อที่เทียบเท่ากับความเห็นยักษ์ ป้อนเข้าclแล้วส่งคืน 1 ในalทันที ฉันจะตอบคำถามจริงเมื่อฉันมีเวลาว่าง

00000039  b0 01 c3 00 02 03 04 05  06 07 08 09 0a 0b 0c 0d  |................|
00000049  0e 0f 10 11 12 13 14 15  16 17 18 19 1a 1b 1c 1d  |................|
00000059  1e 1f 20 21 22 23 24 25  26 27 28 29 2a 2b 2c 2d  |.. !"#$%&'()*+,-|
00000069  2e 2f 30 31 32 33 34 35  36 37 38 39 3a 3b 3c 3d  |./0123456789:;<=|
00000079  3e 3f 40 41 42 43 44 45  46 47 48 49 4a 4b 4c 4d  |>?@ABCDEFGHIJKLM|
00000089  4e 4f 50 51 52 53 54 55  56 57 58 59 5a 5b 5c 5d  |NOPQRSTUVWXYZ[\]|
00000099  5e 5f 60 61 62 63 64 65  66 67 68 69 6a 6b 6c 6d  |^_`abcdefghijklm|
000000a9  6e 6f 70 71 72 73 74 75  76 77 78 79 7a 7b 7c 7d  |nopqrstuvwxyz{|}|
000000b9  7e 7f 80 81 82 83 84 85  86 87 88 89 8a 8b 8c 8d  |~...............|
000000c9  8e 8f 90 91 92 93 94 95  96 97 98 99 9a 9b 9c 9d  |................|
000000d9  9e 9f a0 a1 a2 a3 a4 a5  a6 a7 a8 a9 aa ab ac ad  |................|
000000e9  ae af b1 b2 b3 b4 b5 b6  b7 b8 b9 ba bb bc bd be  |................|
000000f9  bf c0 c1 c2 c4 c5 c6 c7  c8 c9 ca cb cc cd ce cf  |................|
00000109  d0 d1 d2 d3 d4 d5 d6 d7  d8 d9 da db dc dd de df  |................|
00000119  e0 e1 e2 e3 e4 e5 e6 e7  e8 e9 ea eb ec ed ee ef  |................|
00000129  f0 f1 f2 f3 f4 f5 f6 f7  f8 f9 fa fb fc fd fe ff  |................|

1

APL (Dyalog Classic)ขนาด 30 ไบต์

⊢⊢⊢11-11-11-'''''''1''⊢-⍳⍳0'⍳⊢

ลองออนไลน์!

คำอธิบาย

ใน APL เครื่องหมายคำพูดเดี่ยวภายในสตริงจะถูกหลีกเลี่ยงโดยการเพิ่มเป็นสองเท่าดังนั้น'''''''1''⊢-⍳⍳0'คือสตริง'''1'⊢-⍳⍳0ซึ่งมีอักขระทุกตัวที่ใช้ในโปรแกรม

อาร์เรย์ APL นั้นเป็นค่าเริ่มต้นที่ 1 ดัชนีและฟังก์ชั่น index-of ที่น่าสนใจจะส่งกลับ1 + max indexถ้าไม่พบองค์ประกอบ

ดังนั้นโดยใช้ index-of บนสตริงและอินพุตส่งคืน

Input    Index    Count
'        1        10
1        4        7
⊢        6        5
-        7        4
⍳        8        3
0        10       1
<other>  11       0

อย่างที่เราสามารถเห็นได้11 - indexให้นับจำนวนตัวละครในโปรแกรม ดังนั้นอัลกอริทึมพื้นฐานคือ

11-'''''''1''⊢-⍳⍳0'⍳⊢

ส่วนที่เหลือคือการนับจำนวนตัวละครเพื่อให้พวกเขาเข้ากับช่องได้ดี


1

R , 135 ไบต์

แรงบันดาลใจจากคำตอบ Pythonนี้

รุ่นก่อนหน้านี้ถูกทำลาย ขอบคุณ @Giuseppe สำหรับการชี้ให้เห็นว่าpasteไม่จำเป็นต้องได้รับการบันทึก 18 ไบต์หรือมากกว่านั้น lengths(regmatches(z,gregexpr(x,z)))มาจากคำตอบนี้

function(x,z=rep(c("afilo2679=:","hmpu15'","nstxz","cgr","e","()",'"',","),c(2:5,7,9,15,16)))sum(lengths(regmatches(z,gregexpr(x,z))))

ลองออนไลน์!



0

Ruby, 48 ไบต์

->x{%q[->x{%q[].count(x.chr)*2}].count(x.chr)*2}

%q[str]เป็นวิธีที่สะดวกกว่าในการเขียนสตริงตัวอักษรมากกว่า"str"เพราะมันสามารถซ้อนอยู่ภายในตัวเองโดยไม่ต้องหลบหนีใด ๆ ดังนั้นฉันแค่ใส่รหัสทั้งหมดยกเว้นสำเนาที่อยู่ข้างในแล้วเพิ่มจำนวนเป็นสองเท่า


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