มีวิธีที่สั้นกว่าในการรับอินพุตของผู้ใช้ใน python หรือไม่?


17

นี่ไม่ใช่ความท้าทาย ฉันสงสัยว่าเป็นไปได้หรือไม่ที่จะให้ผู้ใช้ป้อนข้อมูลเป็นตัวแปรแยกสองตัวใน python (2 หรือ 3) ที่มีน้อยกว่า 19 ไบต์ นี่คือทั้งหมดที่สั้นที่สุดที่ฉันจะได้รับ:

a,b=input(),input()
a=input();b=input() (newline replaced with semicolon for readability)
i=input;a,b=i(),i()

มีวิธีที่สั้นกว่านี้หรือไม่?


2
ส่วนที่สามอาจเป็นวิธีที่ดีที่สุดหากคุณรับมากกว่าสองอินพุต
SuperJedi224

1
ผมกำลังจะบอกว่าอาร์กิวเมนต์บรรทัดคำสั่งด้วยa,b=sys.argv[1:2]หรืออะไรก็ตาม แต่แล้วคุณต้องมีimport sys(ขวา?)
อเล็กซ์เอ

ใน python3 a,b=input().split()จะเป็นอีกวิธีการแก้ปัญหา 19 ไบต์ไม่ใช่การปรับปรุง โปรดทราบว่านั่นหมายถึง a และ b เป็นสตริงและอินพุตถูกป้อนในครั้งเดียวคั่นด้วยช่องว่าง
Matty

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

a,b=input()ใน Py2
Oliver Ni

คำตอบ:


11

หากการแจ้งเตือนผู้ใช้ไม่สำคัญนี่จะสั้นกว่าeval3 เล็กน้อยขึ้นไป:

a,b,c=map(input,[1]*3)
a,b,c=map(input,'111')

มันยังสั้นกว่าแม้ว่าการแจ้งเตือนจะไม่เป็นไร:

a,b,c=map(input,['']*3)

น่าเศร้าที่ความคิดของ xnor ไม่ได้บันทึกอะไรเลยสำหรับ 2 อินพุตเนื่องจากยังคงยาวกว่า (19 ไบต์) อย่างไรก็ตามหากคุณมีสตริง (หรือ iterable ที่เหมาะสม) ที่มีความยาวที่เหมาะสมอยู่แล้ว (เพราะเวทย์มนตร์?) ดังนั้นมันอาจสั้นลงได้

xnor พบตัวอย่างของสายเวทสำหรับ 3 อินพุตใน Python 2 เท่านั้น:

a,b,c=map(input,`.5`)

สิ่งนี้ยังต้องการให้พรอมต์นั้นไม่สำคัญ

เคล็ดลับนี้ช่วยประหยัดไบต์สำหรับอินพุตจำนวนมากโดยใช้1eXสัญกรณ์ (รับ x + 3 อินพุต):

 a,b,c,d,e,f=map(input,`1e3`)

คำอธิบาย:

mapฟังก์ชั่นของ Python ทำหน้าที่ที่มันถูกส่งผ่านไปยังแต่ละองค์ประกอบของ iterable ที่ถูกส่งไปยังมันด้วยและส่งคืนรายการ (หรือวัตถุแผนที่) ที่มีผลลัพธ์ของการโทรเหล่านี้ สำหรับตัวอย่างแรกแผนที่สามารถจำแนกเป็น:

[input(1), input(1), input(1)]

2
การทำmap(input,'xxx')นั้นมีความยาวเท่ากันสำหรับ 3 vars ดีกว่าสำหรับ 2 และแย่กว่าสำหรับ 4+
xnor

3
หากมีโอกาสคุณจำเป็นต้องใช้อินพุต 22 รายการซึ่งmap(input,`id`)สั้นกว่า :-) ในทำนองเดียวกันmap(input,`.1`)สำหรับ 19 อินพุต
xnor

3
อันที่จริงa,b,c=map(input,`.5`)ไม่ประหยัดถ่าน 3 ปัจจัยการผลิตเนื่องจากจะแสดงเป็น.5 0.5
xnor

ใช่นั่นเป็นเรื่องดี เคล็ดลับเด็ด!
DJMcMayhem


4

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


หากคุณต้องการตัวอักษรเดี่ยวในตัวแปรaและbคุณสามารถใช้

a,b=input()

การป้อนสตริงอักขระ 2 ตัวจะทำให้อักขระตัวแรกถูกกำหนดให้ abและตัวอักษรที่สองถูกมอบหมายให้ (น้อยกว่า 2 หรือมากกว่า 2 ตัวอักษรในสตริงจะทำให้เกิดข้อผิดพลาด)

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

โปรดทราบว่าสามารถใช้งานตัวแปรมากกว่า 2 ตัวได้เช่นกัน:

a,b,c,d,e,f,g,h=input()

วิธีนี้ใช้งานได้เพราะใน Python สตริงเป็นชุดอักขระและสามารถใช้ได้ทุกที่ที่คาดว่าจะมีลำดับ

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