ผีคนไหนหายไป?


25

ในการท้าทายนี้เมื่อรับรายการผีจาก Pac-Man คุณจะต้องแสดงผลว่าผีใดหายไป คุณต้องทำในไบต์น้อยที่สุดเท่าที่จะทำได้

อินพุต

ข้อมูลจะประกอบด้วยสตริงหรือรายการซึ่งจะรวมผีจำนวนซึ่งอาจรวมถึง;

  • Blinky
  • ดำสนิท
  • พิ้งกี้
  • ไคลด์

อย่างไรก็ตามอินพุตอาจรวมถึง Pac-Man (ที่มีเครื่องหมายวรรคตอน) ดังนั้นจำนวนสูงสุดของรายการในรายการจะเป็นห้าในลำดับใด ๆ สามารถสันนิษฐานได้ว่าไม่มีรายการที่ไม่ถูกต้องอยู่ในรายการ

เอาท์พุต

การส่งออกจะประกอบด้วยสตริงหรือรายการ ซึ่งจะรวมถึงผีทั้งหมดที่ไม่ได้อยู่ในอินพุตในลำดับใด ๆ อย่างไรก็ตามถ้า Pac-Man อยู่ในการป้อนข้อมูลผีทั้งหมดจะถือว่าหายไป (เพราะเขากินพวกเขา)

กรณีทดสอบ

input: Clyde
output: Blinky, Inky, Pinky
alternate output: Inky, Pinky, Blinky
or one of the other 4 permutations

input: Clyde, Blinky # or however you delimit it
output: Inky, Pinky
alt: Pinky, Inky

input: Pac-Man, Clyde
Output: Blinky, Inky, Pinky, Clyde
or you could output one of the other 23 permutations

input:[null]
Output: Blinky, Inky, Pinky, Clyde
or you could output one of the other 23 permutations

นี่คือ codegolf ดังนั้นยิ่งจำนวนไบต์ต่ำเท่าไหร่ก็ยิ่งดีเท่านั้น


ถ้ามีไม่ผีใด ๆ คือการป้อนข้อมูลที่เป็นสตริงว่างหรือ[null]?
Zizouz212

1
มันเป็นสตริงที่ว่างเปล่า
เลมอนที่ถูกทำลายได้

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

6
มติทั่วไปคือการที่ยุ่งยาก / input ที่เข้มงวดและการส่งออกรูปแบบที่ควรหลีกเลี่ยง การแยกและการรวมคำต่าง ๆ นั้นทำให้โค้ดยาวขึ้นและมันไม่ได้เพิ่มอะไรลงไปในความท้าทายหลัก
Dennis

1
ไม่ผิดกับเอาท์พุตด้วย Pac-Man? คุณอธิบายได้ไหม ขอบคุณ
Hastur

คำตอบ:


3

เยลลี่ , 25 22 ไบต์

Ff”-ȯ⁸“JLKqḤṢ&F⁻ı»ṣ⁶¤ḟ

นี่คือฟังก์ชั่น monadic I / O อยู่ในรูปแบบของรายการ ลองออนไลน์!

มันทำงานอย่างไร

Ff”-ȯ⁸“JLKqḤṢ&F⁻ı»ṣ⁶¤ḟ  Monadic link. Argument: A (list of strings)

F                       Flatten A.
 f”-                    Filter it with the string "-" to detect "Pac-Man".
    ȯ⁸                  Flat logical OR with A. This yields A if there is no '-'
                        in the input, the string "-" otherwise.
                    ¤   Combine the three links to the left into a niladic chain.
      “JLKqḤṢ&F⁻ı»        Yield "Blinky Inky Pinky Clyde", using Jelly's built-in
                          English dictionary.
                  ṣ⁶      Split at spaces to yield
                          ["Blinky", "Inky", "Pinky", "Clyde"].
                     ḟ  Filter-false; removing all elements from that list that
                        appear in A or "-". This is a noop if A contains "Pac-Man".

คุณใช้พจนานุกรมใดที่มี "Pinky" ฯลฯ อยู่ในพจนานุกรม XD
Conor O'Brien

1
ค่าเริ่มต้นที่มาพร้อมกับระบบปฏิบัติการของฉัน Pinky แปลว่านิ้วเล็ก ๆ น้อย ๆ ดังนั้นควรมีอยู่ในพจนานุกรมส่วนใหญ่ ฉันต้องสร้างBlinkyเป็นB + linkyแม้ว่า ไม่แน่ใจว่า linky คืออะไร ...
Dennis

15

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

A`-
$
,;BliNClyde,INPiN
N
nky,
D`\w+,
.*;|,$

ตัวป้อนบรรทัดต่อท้ายมีความสำคัญ อินพุตและเอาต์พุตถูกคั่นด้วยเครื่องหมายจุลภาค

ลองออนไลน์! (บรรทัดแรกเปิดใช้งานชุดทดสอบที่แยกบรรทัดด้วยฟีด)

คำอธิบาย

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

ด่าน 1: Anti-Grep

A`-

Anti-grep stage จะละทิ้งทุกบรรทัดที่ตรงกับ regex ที่กำหนด regex เป็นเพียงและใส่อยู่เสมอบรรทัดเดียวดังนั้นทิ้งผีทั้งหมดนี้ถ้าใส่มี-Pac-Man

ด่าน 2: การเปลี่ยนตัว

$
,;BliNClyde,INPiN

,;BliNClyde,INPiNนี้ก็ผนวกสตริงคงที่ นี่จะเป็นรายการผีในเอาต์พุตหลังจากการล้างข้อมูล

ด่าน 3: การเปลี่ยนตัว

N
nky,

โปรดทราบว่าเราได้เขียน*nkyผีสามตัวNในช่วงก่อนหน้า (และไม่ใส่เครื่องหมายจุลภาคหลังจากพวกเขา) และตอนนี้เราขยายชวเลขนี้ซึ่งช่วยประหยัดสองสามไบต์ ขณะนี้มีเครื่องหมายจุลภาคหลังผีเดี่ยวทุกตัวและเรามีผีอินพุตและรายชื่อผีทั้งหมดคั่นด้วยเครื่องหมายอัฒภาค

ขั้นตอนที่ 3: การซ้ำซ้อน

D`\w+,

นี่คือส่วนใหม่ ขั้นตอนการทำสำเนาค้นหาอินสแตนซ์ทั้งหมดของ regex ที่กำหนดและละทิ้ง substrings ที่ตรงกันทั้งหมดซึ่งเท่ากับ substring ที่ตรงกันก่อนหน้า regex นั้นตรงกับผีทั้งหมดทั้งในอินพุตและในรายการของเอาต์พุตที่อาจเกิดขึ้น หากการป้อนข้อมูลมีผีแล้วผีเดียวกันจะถูกจับคู่อีกครั้งในรายการที่สองและถูกทิ้ง มิฉะนั้นผีจะจับคู่เป็นครั้งแรกในรายการที่สองและเก็บไว้ ดังนั้นหลังจากนี้รายการหลังเครื่องหมายอัฒภาคคือผลลัพธ์ที่เราต้องการ สิ่งที่เหลืออยู่คือการทำความสะอาด:

ด่านที่ 5: การเปลี่ยนตัว

.*;|,$

เราจับคู่ทุกอย่างจนถึงเซมิโคลอนและคอมม่าที่ส่วนท้ายของสตริงและลบออก


สิ่งที่เกี่ยวกับกรณี Pac-Man?
หมึกมูลค่า

2
@ KevinLau-notKenny ดูคำอธิบายของด่านแรก
Martin Ender

7

Python 3, 75 ไบต์

lambda s:[x for x in['Blinky','Inky','Pinky','Clyde']if(x in s)<1or'-'in s]

อินพุตเป็นสตริงที่คั่นด้วยเครื่องหมายจุลภาคและเอาต์พุตจะเป็นรายการ


4
if(x in s)<1ส่วนหนึ่งเป็นคนฉลาด! +1
Daniel

6

JavaScript ES6, 85 78 ไบต์

เป็นฟังก์ชั่นนิรนาม

a=>["Blinky","Inky","Pinky","Clyde"].filter(c=>!a.includes(c)|a.some(v=>v[6]))

วันนี้ฉันเรียนรู้เกี่ยวกับfilterฟังก์ชั่นนี้ สนุก!

บันทึก 15 ไบต์ด้วย Neil

การใช้งาน:

(a=>["Blinky","Inky","Pinky","Clyde"].filter(c=>!a.includes(c)||a.includes("Pac-Man")))(["Pac-Man"])
> ["Blinky","Inky","Pinky","Clyde"]
(a=>["Blinky","Inky","Pinky","Clyde"].filter(c=>!a.includes(c)||a.includes("Pac-Man")))(["Pinky"])
> ["Blinky","Inky","Clyde"]
(a=>["Blinky","Inky","Pinky","Clyde"].filter(c=>!a.includes(c)||a.includes("Pac-Man")))([])
> ["Blinky","Inky","Pinky","Clyde"]

1
แทนที่จะใส่ปลอกพิเศษPac-Manนอกตัวกรองฉันคิดว่าคุณสามารถเพิ่มได้เหมือนa.includes("Pac-Main")||!a.includes(c)ในตัวกรองซึ่ง ณ จุดนี้คุณมีการใช้งานเพียงหนึ่งครั้งเท่านั้นgและสามารถแทรกเข้าไปในนั้นและเปลี่ยนบล็อกของคุณให้เป็นนิพจน์ดังนั้นหลีกเลี่ยงreturnคำสั่ง
Neil

@ Neil ความคิดที่ดี ฉันสามารถตัดออกreturnและ{}และบันทึกเป็นตันขอบคุณ!
charredgrass

คุณสามารถบันทึกหนึ่งไบต์โดยแทนที่สายของคุณa.includesด้วยa[z="includes"](แรก) และa[z](วินาที) นอกจากนี้ฉันคิดว่าคุณสามารถบันทึกไบต์อื่นโดยใช้บิตหรือ OR ( |) ในผลลัพธ์บูลีนของคุณแทนตรรกะ OR ( ||)
apsillers

2
ที่จริงตั้งแต่Pac-Manเป็นอินพุทที่เป็นไปได้ที่ยาวที่สุด (และปัจจัยการผลิตที่ไม่ถูกต้องเป็นไปไม่ได้) เราสามารถทดสอบการดำรงอยู่ของตัวละครที่เจ็ดในการทดสอบสำหรับ:Pac-Man c=>!a.includes(c)||a.some(v=>v[6])ใช้สิ่งนั้นด้วยค่าบิตหรือนำคะแนนมาที่ 78.
apsillers

@apsillers Ooh ยอดเยี่ยมมากคงไม่มีใครคิดจะตรวจสอบความยาว ฉันเปลี่ยนเป็นบิตหรือหรือเพิ่มที่ขอบคุณ!
charredgrass

3

Ruby, 55 49 ไบต์

ลองออนไลน์!

-6 ไบต์จาก @MartinEnder

->a{%w"Blinky Inky Pinky Clyde"-(a*''=~/-/?[]:a)}

อาร์เรย์ Ruby สามารถผ่านการตั้งค่าการลบทำให้ง่ายต่อการลบผีที่เหมาะสม


วิธีนี้จัดการกับ Pac-Man ได้อย่างไร
Neil

@Neil อุทยานอาร์เรย์ด้วยกันโดยใช้a*''และ regex-เปรียบเทียบกับปัจจุบันในชื่อ- Pac-Manหากมีอยู่จะไม่มีการลบอะไรออกจากรายการผีและหากไม่มีอยู่จะลบรายการอินพุต (ดังนั้นแต่ละองค์ประกอบในรายการอินพุตจะถูกลบออกจากรายการผี)
Value Ink

3

Perl, 51 ไบต์

50 ไบต์รหัส + 1 สำหรับ -n

for$@(Blinky,Inky,Pinky,Clyde){print$@if/-/|!/$@/}g}

การใช้

perl -ne 'for$@(Blinky,Inky,Pinky,Clyde){print$@if/-/|!/$@/}' <<< 'Pac-Man, Clyde'
BlinkyInkyPinkyClyde

ฉันสามารถแก้ไขการส่งออกหากจำเป็นต้องเพิ่มพื้นที่หลังจากที่แต่ละผีสำหรับ + 3 ไบต์แทนที่ด้วยprint$@print"$@ "

-6 ไบต์ขอบคุณ@MartinEnder !


Perl, 53 ไบต์

รหัส 51 ไบต์ + 2 สำหรับ -na

โซลูชันทางเลือกโดยใช้ตัวดำเนินการ smartmatch:

print grep/-/~~@F|!($_~~@F),Blinky,Inky,Pinky,Clyde

การใช้

ต้องมีรายการอินพุตที่คั่นด้วยช่องว่าง:

perl -nae 'print grep/-/~~@F|!($_~~@F),Blinky,Inky,Pinky,Clyde' <<< 'Clyde Pinky Inky'
Blinky
perl -nae 'print grep/-/~~@F|!($_~~@F),Blinky,Inky,Pinky,Clyde' <<< 'Clyde Pinky Inky Pac-Man'
BlinkyInkyPinkyClyde'

3

Pyth - 45 38 35 ไบต์

=GwI!:G"a")j-["inky""pinky""blinky""clyde")cG

I!:=Gw"a")j-c:" p bl clyde"d"inky "dcG

j-c:" p bl clyde"d"inky "d?:z\aZYcz

-1 ไบต์เพิ่มเติมขอบคุณ Leaky Nun!

ข้อมูลจะต้องคั่นด้วยช่องว่างตัวพิมพ์เล็กทั้งหมด เอาต์พุตผีที่หายไปบนบรรทัดแยกยกเว้นว่า pac-man อยู่ในอินพุต


คุณลืม "Pac-Man"
Jacques Marais

@JacquesMarais ไม่มันใช้งานได้ The: z \ a ตรวจพบว่ามี "a" ในอินพุตและจะมี "a" ในอินพุต iff pac-man อยู่ในอินพุต
KoreanwGlasses

ฉันคลิกลิงก์Pythและมันไม่ทำงานเมื่อฉันป้อน "Pac-Man" เมื่อป้อน "Pac-Man" ควรจะแสดงชื่อทั้งหมดไม่ใช่ชื่อใด ๆ
Jacques Marais

@JacquesMarais ความผิดพลาดของฉัน คงที่
KoreanwGlasses

}\az ยังทดสอบว่า zaมีตัวอักษร สั้นลง 1 ไบต์
Jakube

3

C, 171 ไบต์

ส่งผ่านสายอักขระที่สิ้นสุดด้วยค่า NULL f()และจะพิมพ์ชื่อที่หายไป

*a[]={"Blinky","Inky","Pinky","Clyde",0},**s,**r,n;f(int**p){for(r=p;*p;)r=strcmp(*p++,"Pac-Man")?r:a+4;for(s=a;*s;++s){for(p=r,n=1;n&&*p;)n=strcmp(*s,*p++);n&&puts(*s);}}

ลองใช้กับ ideone


2

PowerShell v4 +, 107 ไบต์

param($n)((($n+($x='Pinky','Inky','Blinky','Clyde')|group|?{$_.count-eq1}).Name),$x)['-'-in[char[]]-join$n]

เล็ก ๆ น้อย ๆ เมื่อเทียบกับคนอื่น ๆ ในขณะที่ PowerShell ขาดผู้ประกอบการหรือmapผู้ประกอบการสไตล์ใด ๆ เป็นผลให้เราสร้างของเราเอง

จะเข้า$nเป็นอาร์เรย์ที่ชัดเจนของสตริง (เช่น.\which-ghosts-are-missing.ps1 @('Clyde','Blinky'). ส่วนที่เหลือของโครงการคือหนึ่งหลอก ternary ที่ประกอบด้วยอาร์เรย์ที่ดัชนีเราเข้าไปในทางตรรกะบาง[...]. ตรรกะก็คือไม่ว่าจะเป็น-ตัวละครที่เป็นที่ใดก็ได้ในอาร์เรย์ป้อนข้อมูล-joined ด้วยกัน ในสตริงเดียวแล้วนำกลับมาใช้อีกครั้งในcharอาร์เรย์เพื่อใช้ตัว-inดำเนินการดังนั้นถ้าPac-Manอยู่ในอาร์เรย์อินพุตสิ่งนี้จะเป็น$TRUEและองค์ประกอบที่สองของอาร์เรย์หลอกจะประกอบไปด้วยส่วนอื่นจะเป็นตัวแรก ได้รับเลือก

หากเป็นกรณีที่Pac-Manไม่ได้อยู่ในอาร์เรย์ส่วนแรกของอาร์เรย์แบบหลอกจะเป็นเอาท์พุท นั่นคือการรวมกันของอาร์เรย์อินพุตที่$nต่อกันกับอาร์เรย์ของผีทั้งหมด (บันทึกไว้ใน$x ) เราไปป์อาเรย์ใหม่Group-Objectที่จะรวมกลุ่มไอเท็มเข้าด้วยกันจากนั้นเลือกใช้Where-Object(aliased ผ่าน|?{...}ไอเท็มที่.countเป็น-equal 1เท่านั้นนั่นคือทั้งหมดถูกห่อหุ้มใน parens และเราเลือก.Nameคุณสมบัตินี่คือสิ่งที่ข้อกำหนด v4 เข้ามา ในฐานะภายใต้ v4 คุณสามารถอ้างอิงป้ายกำกับ hashtable เช่นนี้แทนที่จะใช้สิ่งที่ต้องการ|Select Nameซึ่งจะช่วยประหยัดหลายไบต์

มิฉะนั้นเนื่องจากPac-Manอยู่ในอาร์เรย์อินพุตเราจึงจำเป็นต้องส่งเอาต์พุตผีทั้งหมด โชคดีที่เราได้ช่วยพวกมันไว้แล้ว$xนั่นคือตัวเลือกในกรณีนี้ ไม่ว่าจะด้วยวิธีใดขณะนี้ไปป์ไลน์มีอาเรย์สตริงของ Ghosts และเอาท์พุตนั้นโดยปริยาย

ตัวอย่าง

PS C:\Tools\Scripts\golfing> .\which-ghosts-are-missing.ps1 @('Clyde')
Pinky
Inky
Blinky

PS C:\Tools\Scripts\golfing> .\which-ghosts-are-missing.ps1 @('Pac-Man','Clyde')
Pinky
Inky
Blinky
Clyde

PS C:\Tools\Scripts\golfing> .\which-ghosts-are-missing.ps1 @()
Pinky
Inky
Blinky
Clyde

PS C:\Tools\Scripts\golfing> .\which-ghosts-are-missing.ps1 @('Clyde','Blinky')
Pinky
Inky

2

Python 2, 66 61 96 ไบต์

g={"Blinky","Inky","Pinky","Clyde"};i=set(input());print",".join(g-i if not"Pac-Man"in i else g)

,การป้อนข้อมูลต้องเป็นรายการที่ส่งออกจะเป็นสตริงชื่อคั่นด้วย

รุ่น 61 ไบต์ที่ไม่รองรับ Pac-Man:

print",".join({"Blinky","Inky","Pinky","Clyde"}-set(input()))

8
Pac-Man ไม่ได้รับการจัดการในรายการนี้
เลมอนที่ถูกทำลายได้

set[...]คุณไม่จำเป็นต้อง เพียงแค่ใช้{...}ชุดตัวอักษร
Dennis

ฉันไม่ได้สังเกตเห็นสิ่งที่ Pac-Man แม้หลังจากอ่านความท้าทาย 3 ครั้ง ... ฉันจะแก้ไขรหัสของฉัน
acrolith

2

Haskell, 91 ไบต์

import Data.List
p l=(if elem"Pac-Man"l then id else(\\l))["Blinky","Inky","Pinky","Clyde"]

อินพุตคือรายการของสตริง จะตัดสินใจว่าจะใช้รายการตามที่เป็นอยู่หรือทำผลต่างของรายการตาม "Pac-Man"

เพื่อความสนุกสนานเป็นพิเศษไม่มี Pac-Man:

import Data.List
(["Blinky","Inky","Pinky","Clyde"]\\)

จะปรับปรุงคำตอบนี้เร็ว ๆ นี้หรือไม่มันดึกมากในตอนกลางคืน


2

Python 3, 77 ไบต์

lambda i:[g for g in"Blinky Inky Pinky Clyde".split()if g not in i or"-"in i]

นี่คือคำตอบอื่นที่ 89 ไบต์ที่ฉันเล่นด้วย แต่ไม่ได้ผล :(

lambda i:[g for g in[s+"nky"for s in"Bli I Pi".split()]+["Clyde"]if g not in i or"-"in i]

และนี่คือต้นฉบับที่ 85 ไบต์:

lambda i,n="Blinky Inky Pinky Clyde":([g for g in n.split()if g not in i],n)["-"in i]

สิ่งเหล่านี้ใช้ชื่อสายเดี่ยวคั่นด้วยช่องว่าง / เครื่องหมายจุลภาค


2

05AB1E, 47 44 ไบต์

•1g!Z~÷kÅ]°%Ï0›K/•35B0¡™svy'-åi,q}}v¹ykÌiy)˜

ชี้แจง

•1g!Z~÷kÅ]°%Ï0›K/•35B0¡™                      # push list of the 4 ghosts
                        svy'-åi,q}}           # if Pac-Man is in input, quit and output list of all 4 ghosts
                                  v¹ykÌiy)˜   # otherwise, generate the list of ghosts missing from input

ลองออนไลน์


2

Python 2, 151 ไบต์

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

o=['Blinky','Clyde','Inky','Pinky']
p=lambda x:[l for l in reduce(lambda z,x:z+[y+[x]for y in z],o,[[]])if sorted(l+x)==o][0]if'Pac-Man'not in x else o

โดยที่อินพุตที่คาดไว้คือรายการของสตริง

วิธีนี้คือการรวมชุดข้อมูลที่เป็นไปได้ทั้งหมด (โดยไม่คำนึงถึงคำสั่งซื้อ) ขององค์ประกอบ 0,1,2,3 และ 4 สิ่งนี้ทำได้โดย

reduce(lambda z,x:z+[y+[x]for y in z],o,[[]])

ซึ่งผลตอบแทน

[[], ['Clyde'], ['Pinky'], ['Clyde', 'Pinky'], ['Inky'], ['Clyde', 'Inky'],
['Pinky', 'Inky'], ['Clyde', 'Pinky', 'Inky'], ['Blinky'], ['Clyde', 'Blinky'],
['Pinky', 'Blinky'], ['Clyde', 'Pinky', 'Blinky'], ['Inky', 'Blinky'],
['Clyde', 'Inky', 'Blinky'], ['Pinky', 'Inky', 'Blinky'], 
['Clyde', 'Pinky', 'Inky', 'Blinky']]

และค้นหาสิ่งที่นอกเหนือจากรายการผลลัพธ์แล้วในรายการผีทั้งหมด

จากนั้นจะถูกตรวจสอบว่าสตริง'Pac-Man'เป็นส่วนหนึ่งของอินพุตหรือไม่และในกรณีที่เป็นรายการทั้งหมดของผีจะถูกส่งกลับ หากไม่ใช่จะส่งคืนเฉพาะรายการที่ไม่ได้เป็นส่วนหนึ่งของอินพุต

ขอให้สังเกตว่ารายการที่มีชื่อผีทั้งหมด ( o) จะถูกจัดเรียงตามตัวอักษรและจะเหมือนกับรายการที่สร้างเป็น ( sorted(l+x)) เพราะนี่คือความจริงที่ว่าในหลาม['a','b']==['b','a']ได้รับการประเมินเป็นFalseในขณะที่['a','b']==['a','b']มีการประเมินว่าTrueมีการประเมินว่า

สามารถบันทึกได้ 3 ไบต์หากได้รับอนุญาตให้ส่งคืนคำตอบเป็นรายการ (โดยลบ[0]เมื่อสิ้นสุดการทำความเข้าใจรายการแรก) แต่เนื่องจากฉันไม่แน่ใจว่ามันเป็นผลลัพธ์ที่ถูกต้องฉันกำลังนับพวกเขา


2

Object Pascal, 204 200 bytes

สองลูปโดยใช้ไบนารีเพื่อค้นหา Ghosts + Pacman ที่มีอยู่ รับอาร์กิวเมนต์จาก commandline ขอบคุณ @manatwork สำหรับการบันทึกจำนวนไบต์เพิ่มขึ้น!

var a:array[1..4]of string=('Blinky','Inky','Pinky','Clyde');i,s:Byte;begin for i:=1to ParamCount do s:=1<<Pos(ParamStr(i)[4],'nykd-')or s;for i:=1to 4do if(1<<i and s=0)or(s>31)then WriteLn(a[i])end.

Ungolfed:

var
  a: array[1..4] of string = ('Blinky', 'Inky', 'Pinky', 'Clyde');
  i, s: byte;
begin
  for i:=1 to ParamCount do
    s := 1 << pos(ParamStr(i)[4], 'nykd-') or s; // fill bits by shifting, check for unique 4th char of names, '-' in 'pac-man', could also use the 3rd char
  for i:=1 to 4 do
    if (1 << i and s=0) or (s>31) then    // check if bits are on
      writeln(a[i]);
end.

รุ่นเก่าใช้ชุด227 209 ไบต์

สองลูปใช้ชุดเพื่อค้นหา Ghosts + Pacman ที่มีอยู่ รับอาร์กิวเมนต์จาก commandline

var a:array[1..4]of string=('Blinky','Inky','Pinky','Clyde');i:byte;s:set of 1..5;begin for i:=1to ParamCount do s:=s+[pos(ParamStr(i)[4],'nykd-')];for i:=1to 4do if not(i in s)or(5in s)then writeln(a[i]);end.

Ungolfed:

var
  a: array[1..4] of string = ('Blinky', 'Inky', 'Pinky', 'Clyde');
  i: byte;
  s: set of 1..5;
begin
  for i:=1 to ParamCount do
    s := s + [pos(ParamStr(i)[4], 'nykd-')]; // fill set with indxs
  for i:=1 to 4 do
    if not(i in s) or (5 in s) then    // check indx not in set or pac-man is
      writeln(a[i]);
end.

ดี บางวิธีในการทำให้สั้นลง: integerbyte; ลบการประกาศgและใช้ค่าโดยตรงParamCount5(เมื่อฉันเข้าใจงานจะไม่มีรายการอินพุตที่ซ้ำกันหรือไม่ถูกต้องอยู่ดี) อย่างน้อยก็ในตัวอักษรตัวเลข FreePascal อาจจะสัมผัสกับคำหลักที่เหมือนหรือi:=1to 5do 5in sดูว่าคุณรองรับมันด้วยหรือไม่
จัดการ

ฉันคิดว่าการใช้บิตแทนsetจะเป็นประโยชน์: pastebin.com/r2nB5wY3
จัดการ

@ การจัดทำว้าวทุกครั้งที่ฉันเรียนรู้สิ่งใหม่ .. ฉันใช้คำแนะนำของคุณยกเว้นParamCountเพราะพฤติกรรมนั้นไม่ได้กำหนดไว้สำหรับตัวเลขที่ใหญ่กว่าจากนั้นพารามิเตอร์การป้อนข้อมูลจริง (อย่างน้อยก็ไม่มีอะไรเกี่ยวกับเรื่องนี้ในเอกสาร)
hdrz

1

โปรแกรม PHP ขนาด 84 ไบต์

<?print_r(array_diff([Blinky,Inky,Pinky,Clyde],in_array('Pac-Man',$argv)?[]:$argv));
  • รับอาร์กิวเมนต์จากบรรทัดคำสั่งพิมพ์ผลลัพธ์เป็นอาร์เรย์
  • ชื่อไฟล์จะต้องไม่เป็นผีหรือ 'Pac-Man'!
  • การแยกย่อยสั้น ๆ : นำออก (หาก 'Pac-Man' อยู่ในการขัดแย้ง: ไม่มีอะไรอื่นอาร์กิวเมนต์ทั้งหมด) จากผีทั้งหมด; ผลการพิมพ์ซ้ำ

ตัวอย่าง:

>php -d error_reporting=0 ghosts.php Clyde
Array
(
    [0] => Blinky
    [1] => Inky
    [2] => Pinky
)
>php -d error_reporting=0 ghosts.php Clyde Blinky
Array
(
    [0] => Inky
    [1] => Pinky
)
>php -d error_reporting=0 ghosts.php Pac-Man Clyde
Array
(
    [0] => Blinky
    [1] => Inky
    [2] => Pinky
    [3] => Clyde
)

ฟังก์ชั่น PHP, 90 ไบต์

function p($a){return array_diff([Blinky,Inky,Pinky,Clyde],in_array('Pac-Man',$a)?[]:$a);}

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

ความคิดเพิ่มเติม

  • แทนที่in_array(...)ด้วยstrstr(join($argv),'-')เพื่อตรวจจับ-แทนPac-Man(-2)
  • ใช้ ereg('-',join($argv))แทน (อื่น -2)
  • โปรแกรมอาจสูญเสียอีก 6 ไบต์ใน PHP <5.4 ด้วยregister_globalsเมื่อเปิด
  • เพื่อให้โปรแกรมพิมพ์รายการที่คั่นด้วยเครื่องหมายจุลภาค: แทนที่<?print_r(ด้วย<?=join(',',(+2) คุณอาจต้องการเพิ่ม;echo""การโทรสำหรับการขึ้นบรรทัดใหม่

1

jq, 69 ตัวอักษร

("Blinky Inky Pinky Clyde"/" ")as $a|if inside($a)then$a-. else$a end

อินพุตคือ JSON เอาต์พุตคือ JSON ไวยากรณ์ของเงื่อนไขคือความเจ็บปวด

วิ่งตัวอย่าง:

bash-4.3$ jq '("Blinky Inky Pinky Clyde"/" ")as $a|if inside($a)then$a-. else$a end' <<< '["Clyde"]'
[
  "Blinky",
  "Inky",
  "Pinky"
]

bash-4.3$ jq '("Blinky Inky Pinky Clyde"/" ")as $a|if inside($a)then$a-. else$a end' <<< '["Pac-Man","Clyde"]'
[
  "Blinky",
  "Inky",
  "Pinky",
  "Clyde"
]

การทดสอบออนไลน์:


1

TSQL (sqlserver 2016), 114 ไบต์

แข็งแรงเล่นกอล์ฟ:

DECLARE @ VARCHAR(99) = 'Blinky,Inky,Pinky,Clyde'

SELECT*FROM STRING_SPLIT('Blinky,Inky,Pinky,Clyde',',')EXCEPT SELECT*FROM STRING_SPLIT(@,','WHERE @ NOT LIKE'%-%'

Ungolfed:

DECLARE @ VARCHAR(99) = 'Blinky,Inky,Pinky,Clyde'

SELECT * FROM STRING_SPLIT('Blinky,Inky,Pinky,Clyde',',')
EXCEPT
SELECT * FROM STRING_SPLIT(@,',')
WHERE @ NOT LIKE'%-%'

ซอ


1

Lotus Notes @ รูปแบบภาษา, 85 84 75 74 อักขระ

อักขระ -1 โดยย้อนกลับการมอบหมาย @If

-9 เปลี่ยน @Contains (i; "-") เป็น @Like (i; "% -%") และลบ @Trim (ไม่จำเป็นหากแสดงโดยใช้พื้นที่เป็นตัวคั่น)

-1 โดยการลบ newline

สร้างฟอร์มที่มีสองฟิลด์: i (ข้อความ, แก้ไขได้, หลายค่า) และ o (ข้อความ, คำนวณ, หลายค่า) ป้อนสูตรต่อไปนี้ใน o:

l:="Inky":"Pinky":"Blinky":"Clyde";@If(@Like(i;"%-%");l;@Replace(l;i;""))

จาก Notes ไคลเอ็นต์ให้สร้างเอกสารใหม่โดยใช้แบบฟอร์มป้อนชื่อในฟิลด์ i และกด F9 เพื่อรีเฟรชเอกสาร คำตอบที่ปรากฏในสนาม o

สิ่งนี้ใช้ประโยชน์จากข้อเท็จจริงที่ว่า @Like และ @Replace สามารถใช้ได้ทั้งบนสตริงหรือในรายการสตริง


1

C # 135 ไบต์ 126 ไบต์

string[] g{"Blinky","Inky","Pinky","Clyde"};Console.WriteLine(String.Join(",",i.Contains("Pac-Man")?g:g.Except(i).ToArray()));

(โดยที่ i คืออาร์เรย์สตริงที่มีอินพุต)

หลังจากดูตัวอย่างอื่น ๆ ฉันเห็นว่า C # เป็นภาษา verbose :)


1
คุณสามารถรับ 126 ไบต์โดยการลบช่องว่างและขึ้นบรรทัดใหม่
acrolith


1

รุ่นที่ 141 ไบต์

@set g= Blinky Inky Pinky Clyde
@for %%a in (%*)do @if %%a==Pac-Man goto l
@for %%a in (%*)do call set g=%%g: %%a=%%
@l
@echo(%g:~1,-1%

(ลบ 6 ไบต์สำหรับ:~1,-1หากช่องว่างนำหน้าและต่อท้ายเป็นที่ยอมรับ) ต้องใช้ Pac-Man ในชื่อเรื่อง แต่ผีเป็นตัวพิมพ์เล็ก


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