ฉันจะออกเป็นกลุ่มได้อย่างไร


42

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

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

bash prompt จะเป็นดังนี้:

E37@vimmachine: /var/override)

ในขณะที่ข้อผิดพลาดจะเป็นดังนี้:

E37: No write since last change (add ! to override)

เมื่อได้รับพรอมต์ bash งานของโปรแกรมจะเสร็จสิ้นและไม่ควรให้เอาต์พุตใด ๆ เพิ่มเติม (ยกเว้นช่องว่าง)

เมื่อได้รับข้อผิดพลาดโปรแกรมของคุณควรสุ่ม (เช่นความเป็นไปได้แต่ละอย่างมีความน่าจะเป็นไม่เลือกศูนย์) :q!เพื่อออกโดยไม่บันทึกหรือ:xเพื่อบันทึกและออก

นี่คือจำนวนน้อยที่สุดในแต่ละภาษาที่ชนะ!


26
ฉันไม่รู้ว่า:xเป็นเรื่องอะไร! ฉันใช้เสมอ:wq:)
musicman523

3
เกิดอะไรขึ้นถ้า bash prompt ของฉันคือE37: No write since last changeอะไร? นั่นคืออัลกอริทึมสามารถแยกแยะพรอมต์จากข้อความแสดงข้อผิดพลาดได้อย่างไร
anatolyg

5
@anatolyg มันทำไม่ได้ แต่มันก็ไม่จำเป็น พรอมต์ที่ระบุจะเป็นสิ่งที่กล่าวมาข้างต้นเสมอนั่นคือE37@vimmachine: /var/override)
Skidsdev

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

5
(เข้าร่วมกอล์ฟสำหรับความคิดเห็นนี้เชช) @ musicman523 ไม่เคยใช้:xเพื่อออกเป็นกลุ่ม สักวันคุณจะกด:Xปุ่มสุ่มโดยไม่ตั้งใจเมื่อคุณสับสน หลังจากนั้นในที่สุด:wqคุณจะไม่เห็นไฟล์ของคุณอีก
Aaron McMillin

คำตอบ:


16

Python 2 , 66 ไบต์

บันทึก 3 ไบต์ขอบคุณ @ Mr.Xcoder และ 4 ขอบคุณ @Mayube!

from random import*
if'('in input(':q'):print choice([':x',':q!'])

ลองออนไลน์!


2
หากคุณเปลี่ยนไปหลาม 2 คุณสามารถบันทึก 1 ไบต์โดยใช้แทนprint print()และคุณสามารถรับอินพุตด้วยเครื่องหมายคำพูด
Mr. Xcoder

@ Mr.Xcoder ขอบคุณจริงช่วยฉัน 3 ไบต์!
musicman523

ใช่ฉันไม่เห็นคุณมีคำสั่งพิมพ์สองใบ
Mr. Xcoder

3
ฉันให้ทิปนี้กับมนุษย์โดยสิ้นเชิงดังนั้นฉันจึงมอบมันให้กับคุณเช่นกัน คุณสามารถลบprint':q'ทั้งหมดและเปลี่ยนinput()เป็นinput(':q')
Skidsdev

@ Mayube โอ้ยอดเยี่ยมมากขอบคุณ!
musicman523



5

Python 2 , 76 75 72 69 ไบต์

คำตอบนี้ออกไปแล้ว

-1 ไบต์ต้องขอบคุณ Rod -3 ไบต์ต้องขอบคุณ Mayube -3 ไบต์ขอบคุณ Artyer

from random import*
print'::qx!'[random()>.5:('N'in input(':q'))*5:2]

ลองออนไลน์!


นี่เป็นการพิมพ์บรรทัดใหม่พิเศษที่ความท้าทายบอกว่าit should not give any more output
musicman523

@Mayube May we output a newline upon terminating? @Adám sure, that's fine
Stephen

1
random()>.5เพื่อบันทึกไบต์
Rod

2
การสุ่มต้องมีการกระจายอย่างสม่ำเสมอหรือไม่? ถ้าไม่ได้คุณสามารถทำrandom()>0เพราะมีมากมากโอกาสเพียงเล็กน้อยที่จะกลับมาrandom() 0
mbomb007

1
@Artyer คุณรู้ว่าอะไร[0, 1)ใช่มั้ย หมายความว่ามีการรวมศูนย์เนื่องจากช่วงนั้นเป็นศูนย์ stackoverflow.com/a/4396303/2415524 ... วิธีง่าย ๆ ในการจดจำคือในบรรทัดตัวเลขจุดที่รวมอยู่และไม่เปิดจุด วงเล็บมองปิดและ parens ดูเปิด
mbomb007

5

Vimscript 45 45ไบต์

ec"q"|exe"/("|ec["q!","x"][getpid()%2]

ลดขนาด 4 ไบต์โดยใช้getpid()เพื่อรับค่า (ทุกคนคิดวิธีที่สั้นกว่าเพื่อให้ได้ตัวเลขที่ไม่เหมือนเดิมทุกที่ตลอดเวลาหรือไม่)

สมมติว่า +3 ไบต์สำหรับเรียกใช้ Vim ด้วย-cเพื่อเรียกใช้สคริปต์ข้างต้นและ-เพื่ออ่านอินพุตจาก stdin:

vim -c 'ec"q"|exe"/("|ec["q!","x"][reltime()[1]%2]' -

3

JavaScript, 52 46 ไบต์

บันทึก 6 ไบต์ด้วย @ETHProductions

prompt(':q')[30]&&alert(new Date%2?':q!':':x')

ไม่จำเป็นต้องมี!หลังจาก:qถ้าอินพุตเป็นข้อผิดพลาดหรือไม่?
Shaggy

@Shaggy aww ไม่ได้สังเกตว่ามีไป 9 ไบต์
Downgoat

prompt(':q')[30]&&...ฉันคิดว่าคุณสามารถบันทึกไม่กี่ไบต์ด้วย นอกจากนี้new Date%2?':x':':q!'
ETHproductions

@ ETHproductions โอ้ใช่ขอบคุณ! ไม่แน่ใจว่าฉันมองข้าม ternary ได้อย่างไร
Downgoat

3

C # (. NET Core) , 140 139 138 ไบต์

using static System.Console;class P{static void Main(){Write(":q");if(ReadLine()[3]==':')Write(new System.Random().Next()>9?":x":":q!");}}

ลองออนไลน์!

  • บันทึก 1 ไบต์ขอบคุณ LiefdeWen!
  • บันทึก 1 ไบต์ต้องขอบคุณ Mord Zuber!

การวางโปรแกรมของคุณในSystemเนมสเปซทำให้คุณสามารถย่อSystem.Randomให้สั้นลงRandomประหยัด 1 ไบต์
LiefdeWen

@CarlosAlejo ทำงานให้ฉันใน TIO แต่มันq!ไม่ออก:q!
Skidsdev

1
@CarlosAlejo อ่าผมไม่ได้ตระหนักว่าคุณไม่ได้ใช้ namespace เป็นคำถามที่ยังไม่ได้พูดแบบสุ่มอย่างสม่ำเสมอเพียงเป็นไปได้ทั้งหมดควรจะมีที่ไม่ใช่ศูนย์โอกาสเพื่อให้คุณเปลี่ยน.Next(2)>0ไป.Next()>9มันใบบิตของไม่ดี ชิมในปาก แต่ก็ยังถูกกฎหมาย
LiefdeWen

4
using static System.Consoleช่วยให้คุณสามารถวางC.สายทั้งหมดและช่วยคุณประหยัด byte
Mord Zuber

1
@MordZuber อะไร ... ฉันไม่รู้ด้วยซ้ำว่าเป็นไปได้! ขอขอบคุณ!
Charlie

3

> <> , 32 30 29 ไบต์

  • !oมีซ้ำซ้อน
  • -1 ไบต์ขอบคุณแอรอน

iii0["@!qx:q:"ooi{=?;o!ox~oo;

ลองออนไลน์!

คำอธิบาย (เก่า)

"@!qx:q:"ooi~i~i~i{=?;o!ox~oo;
"@!qx:q:"                        Push @!qx:q: on the stack (in reverse)
         oo                      Print :q [stack: @!qx:]
           i~i~i~                Remove first 3 input characters
                 i               Load @ or : from the input (= i)
                  {              Shift stack to the left [stack: !qx:i@]
                   =?            If 4th character was @
                     ;              Exit
                                 Else
                      o             Print :
                       !o           Jump to
                         x          Random direction (left or right because
                                    up and down retrigger x)
                                       Left:
                     ;o!o                 Print x and exit.
                                       Right:
                          ~oo;            Remove x, print q! and exit.

(จะอัปเดตในไม่ช้า)


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

@Aaron ขอบคุณนั่นเป็นเคล็ดลับที่เรียบร้อยมาก! ทำไมถึงไม่อนุญาต
PidgeyUsedGust

เพราะคุณจะอ่านอินพุตก่อนที่จะพิมพ์ผลลัพธ์ที่นำไปสู่การผลิตซึ่งฉันคิดว่าขัดกับจิตวิญญาณของความท้าทาย อย่างไรก็ตามมันไม่เหมือนความท้าทายที่สามารถนำไปใช้กับล่ามอย่างเป็นทางการ> <> ล่ามเพราะงูใหญ่จะรอ EOF ของอินพุตก่อนดำเนินการรหัส> <> (หรืออะไรทำนองนั้น)
Aaron

2

ที่จริงแล้ว 27 ไบต์

":q"ü[":x",":q!"]`⌂`J'!,cIƒ

ลองออนไลน์! (หมายเหตุ: เนื่องจาก TIO เล่นได้ไม่ดีกับ stdin ฉันได้แทนที่,(อ่านจาก stdin) ด้วยสตริงตัวอักษรซึ่งคุณสามารถเปลี่ยนเพื่อทดสอบได้นอกจากนี้คุณจะต้องปิดใช้งานแคชเอาต์พุตเพื่อรับ การตอบสนองที่แตกต่างกับเอาต์พุตสุ่ม)

คำอธิบาย:

":q"ü[":x",":q!"]`⌂`J'!,cIƒ
":q"ü                       - Push the literal :q and print
     [":x",":q!"]           - Push the list of literals :x and :q!
                 `⌂`J       - Push function literals ⌂ (terminate) and J (choose random element from list)
                     '!     - Push the literal !
                       ,    - Read from stdin
                        c   - Pop top two values a,b and return "a".count(b)
                         I  - Pop top three values a,b,c and return b if a is truthy and c if a is falsy
                          ƒ - Pop a function from the stack and call it

1

APL (Dyalog) 27 ไบต์

':q'⋄('!'∊⍞)/':q!' ':x'⊃⍨?2

ลองออนไลน์!

':q' พิมพ์สิ่งนี้

 แล้วก็

?2 จำนวนเต็มแบบสุ่มในสองคนแรก

⊃⍨ ใช้สิ่งนั้นเพื่อเลือกจาก

':q!' ':x' รายการของสองสายนี้

(... )/ ซ้ำว่าคือทำให้nสำเนาขององค์ประกอบในการที่แต่ละที่nคือ

'!'∊⍞ เครื่องหมายอัศเจรีย์เป็นสมาชิกของการป้อนข้อความอย่างไร (บูลีนเช่น 0 หรือ 1)



1

Ruby , 33 ไบต์ (รหัส 32, +1 สำหรับแฟล็ก -n)

p:q;$_[?!]? p([:q!,:x][$$%2]): p

ฉันไม่แน่ใจใน$$%2ตัวอย่างมากเกินไป ฉันใช้มันเพื่อสร้างบิตสุ่มเพื่อจัดทำดัชนีอาร์เรย์ของฉันโดยการใช้ pid modulo 2 ของกระบวนการทับทิมในปัจจุบันและมันจะคาดเดาไม่ได้เลยทีเดียว .sampleเพิ่มไบต์พิเศษ

ลองออนไลน์!


1

JavaScript, 76 71 50 ไบต์

prompt(":q")[3]<"@"?alert(new Date%2?":q!":":x"):0

บันทึกเป็นจำนวนมากต้องขอบคุณ Artyer และ Neil รวมถึงการรวม ternaries ของฉันและย้ายการแจ้งเตือนครั้งแรกเพื่อแจ้งให้ (duh)


2
ทำไมไม่เพียงโทรprompt()โดยตรง (คุณได้รับอนุญาตprompt(":q")หรือไม่)
Neil

คุณสามารถใช้เวลาเป็นตัวเลขแบบสุ่ม ( new Date%2แทนMath.random()>.5) และคุณสามารถใช้พรอมต์โดยตรงเช่น @Neil กล่าวว่า:prompt()[3]<
Artyer

@ Neil ทำไม ฉันได้ทำ.indexOfมันก่อนที่ฉันจะสังเกตเห็นวิธีอื่นที่จะทำ ลืมเปลี่ยนกลับขอบคุณ!
Stephen

@ ขอบคุณมากฉันคิดอย่างนั้นแล้วก็ลืมมันไปเลย
Stephen


1

Python 2 , 47 ไบต์

print'::qx!'[id(0)%3<2:('N'in input(':q'))*5:2]

ลองออนไลน์

คำอธิบาย:

id(0)%3<2แหล่งที่มาของแบบแผนคือ ฟังก์ชันidส่งคืนตำแหน่งหน่วยความจำของพารามิเตอร์ การส่งสิ่งใดจะให้ที่อยู่หน่วยความจำที่ไม่ได้กำหนดไว้ล่วงหน้า ผลลัพธ์จะเป็นเลขคู่เสมอ แต่บางครั้งก็หารด้วย 3 ได้ผลลัพธ์โมดูโล 3 แตกต่างกันไป ดังนั้นนี่อาจเป็นแหล่งกำเนิดของการสุ่ม โดยใช้<2วิธีการว่าประมาณ 2/3 Trueของเวลาที่บูลที่เกิดคือ

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


1

ถัง ,14 12 ไบต์

\:~2%[q\!|x]

สิ่งนี้จะผลักดันตัวเลขสุ่มและเอาท์พุทสัมพันธ์กับตัวเลขสุ่ม


0

TCL, 95 ไบต์

puts :q;puts [if [string match *!* [gets stdin]] {puts [lindex ":q! :x" [expr round(rand())]]}]

ทางออกที่ง่ายและค่อนข้างยาวใน tcl ...


0

การเรียกระบบ86Bytes ของระบบประกอบ

global _start
_start:
mov edx,4
mov ecx,g 
mov ebx,1
mov eax,4
int 0x80
g db ':q!',10

0

โลโก้, 37 36 ไบต์

pr[:q]if 4<count rl[pr pick[:q! :x]]

ลองมันออนไลน์ได้ที่ตรวจสอบผลการดำเนินงานความโกลาหลกอล์ฟ

คำอธิบาย:

pr[:q]if 4<count rl[pr pick[:q! :x]]   Main program.
pr                                     Print
  [:q]                                 the list `[:q]` without delimiter `[]`
      if           [              ]    If...
         4<                            4 is less than...
           count                       the number of word in the...
                 rl                    ReadLine (from stdin),
                    pr                 print
                       pick            a random word picked from the list...
                           [:q! :x]    [:q! :x]

(เพราะE37@vimmachine: /var/override)มี 2 ​​คำในขณะที่E37: No write since last change (add ! to override)มี 10 คำ)


คำอธิบายจะดีมาก
pajonk

0

Perl 5 (พร้อมแฟล็ก -E), 35 ไบต์

say":q";<>=~l&&say qw(:q! :x)[$$%2]

perl -E 'say":q";<>=~l&&say qw(:q! :x)[$$%2]'ทำงานนี้ด้วย

ลองออนไลน์!

Ungolfed:

say(":q");
if(<> =~ /l/){ #read a line and check if it contains 'l'
    @a=(":q!",":x");
    say($a[$$ % 2]); #print one element from array based on PID
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.