เวลาทำการบ้าน! ค้นหาตัวเลขที่ต่ำที่สุดในสตริง


12

อีกคำถามที่ยอดเยี่ยมจาก Stack Overflowกลายเป็นความท้าทายของนัก !

เขียนโปรแกรมที่:

  1. ยอมรับสตริงเป็นอินพุตของผู้ใช้ (ไม่ใช่ไพพ์หรืออาร์กิวเมนต์บรรทัดคำสั่ง) ชนิดข้อมูลของอินพุตต้องเป็นสตริงหากภาษาทำการวิเคราะห์อัตโนมัติโดยอินพุตมันจะต้องส่งไปยังสตริง
  2. พบว่าดัชนี (0 หรือ 1 based) ของแม้แรกต่ำสุดบาท
  3. พิมพ์ 2 จำนวนเต็ม , ดัชนีและแม้ต่ำสุดบาท
  4. ถ้าไม่มีแม้แต่บาทผลตอบแทน -1 เป็นดัชนีจำนวนที่สองสามารถเป็นอะไรก็ได้
  5. สำหรับวัตถุประสงค์ของการนี้ศูนย์ไม่ได้

ตัวอย่างการทดสอบกำหนดสตริงทางซ้ายเอาท์พุทค่าด้านขวา:

25376  -->  0,2
523726 -->  1,2
583746 -->  4,4
53771  --> -1,0
_4___2 -->  5,2

ผู้ชนะ: เป็นโปรแกรมที่มีจำนวนอักขระต่ำสุด ไม่มีโบนัสไม่มีการลงโทษ

แก้ไข: (เกี่ยวกับ stdin)ฉันเมาในส่วนการป้อนข้อมูลของผู้ใช้โดยทั่วไปไม่มีข้อมูลในท่อและไม่มีข้อโต้แย้งบรรทัดคำสั่ง คุณต้องระบุพรอมต์ของผู้ใช้ในโปรแกรมเอง


4
จะเกิดอะไรขึ้นถ้าจำนวนเต็มคู่ต่ำสุดมีสองหลัก ตกลงทวีเรื่องตลก
ดร. เบลิซาเรีย

5
เกิดอะไรขึ้นกับ stdin?
John Dvorak

1
@JanDvorak เพราะกฎเกณฑ์เองนั้นเป็นเหตุผล

7
ทำไมข้อ จำกัด ของศูนย์ถึงไม่อยู่ที่เท่ากัน? ดูเหมือนจะค่อนข้างแปลก
Iszi

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

คำตอบ:


6

Golfscript, 26 (28) ตัวอักษร

'#{gets}'.'246'&8+$1<.@\?

ตัวอย่าง:

;'583746'
.'246'&8+$1<.@\?
#44

;'53771'
.'246'&8+$1<.@\?
#8-1

ทดสอบสด: http://golfscript.apphb.com/?c=Oyc1Mzc3MScKLicyNDYnJjgrJDE8LjA9QD8%3D

คำอธิบาย:

  • '#{gets}'เป็นการหลีกเลี่ยงทับทิมเพื่อตอบสนองความต้องการของ I / O; STDIN จะถือว่าว่างเปล่า
  • . โคลนอินพุต
  • '246'&8+ค้นหาตัวเลขที่มีอยู่ในอินพุตยกเว้น8จะถูกเก็บไว้เสมอ
  • $1< เรียงลำดับรายการจากนั้นใช้หลักแรก แต่เก็บเป็นสตริง
  • .@\?สั่งสแต็ก {ดิจิต, อินพุต, ดิจิต} แล้วค้นหาตัวเลขในอินพุต; @peterTaylor ขอบคุณสำหรับการสังเกตเห็นฉันของลายเซ็น [อาร์เรย์อาร์เรย์] ?ของ

ฉันกล้าหาญมากกับการตีความข้อมูลจำเพาะในครั้งนี้ กล่าวคือ:

  • ข้อมูลจำเพาะไม่ได้รับคำสั่งที่เป็นจำนวนเต็มออก; ใช้คำแนะนำของ @ peter อื่น ๆ:x?xเพื่อแก้ไข (ฉันไม่ชอบตัวแปรชั่วคราว
  • ข้อมูลจำเพาะไม่ต้องการตัวคั่นใด ๆ ระหว่างจำนวนเต็มสองจำนวน เนื่องจากตัวเลขที่พบนั้นเป็นเลขหลักเดียวเสมอจึงไม่สำคัญ ถ้าเป็นเช่นนั้นผนวกn@(ซึ่งดำเนินการสลับ) n\(ซึ่งไม่ได้) หรือ]`(ซึ่งจัดรูปแบบผลลัพธ์เป็น["8" -1])

พวกเขาไม่ได้บ้าข้อกำหนดมันเป็นข้อกำหนดโดยพลการ: P

นอกจากนี้สเป็คต้องใช้ดัชนีเป็นครั้งแรก แต่ฉันไม่สามารถอ่าน GolfScript ได้ดีพอที่จะบอกได้ว่าคุณไม่ได้

@LegoStormtroopr จุดเดียวของ spec ที่กล่าวถึงคำสั่งคือ # 4: "ถ้าไม่มีเลขตัวเดียวให้ส่งคืน -1 เป็นดัชนีตัวเลขที่สองสามารถเป็นอะไรก็ได้" # 3 ไม่ได้ระบุคำสั่งซื้อ; สิ่งที่เกี่ยวกับความกล้าหาญ "ไม่มีตัวคั่น"?
John Dvorak

โอ้คุณเป็นคนที่ถูกต้องแล้ว! ฉันพูดถึงตัวเลขสองตัวเพื่อเอาท์พุท แต่ไม่ใช่ลำดับ ฉันยืนแก้ไข!

คุณสามารถแทนที่.0=@?ด้วย.@\?หรือ:x?xเพื่อบันทึกอักขระหนึ่งตัวและหลีกเลี่ยงข้อสงสัยเกี่ยวกับลำดับ การใช้งานที่ดี8เป็นทางเลือก
Peter Taylor

5

APL (37)

(1 ตามค่าเริ่มต้น แต่เชื่อฟัง⎕IO)

{×⍴m←⍵/⍨⍵∊'2468':z,⍨⍵⍳⍕z←⌊/⍎¨m⋄¯1,0}⍞

คำอธิบาย:

  • : อ่านอินพุตของผู้ใช้
  • m←⍵/⍨⍵∊'2468': ลบตัวอักษรทั้งหมดที่ไม่ได้จัดเก็บใน2468m
  • ×⍴m: ดูว่ามีหรือไม่
  • :: ถ้าเป็นเช่นนั้น:
    • z←⌊/⍎¨m: ประเมินตัวละครในแต่ละค้นหาจำนวนต่ำสุดและเก็บไว้ในmz
    • z,⍨⍵⍳⍕z: กลับดัชนีของzในตามด้วยz
  • : ถ้าไม่:
    • ¯1,0: คืนสินค้า (-1, 0)

1
ว้าวฉันชนะ APL (ไม่ใช่โซลูชัน J แต่ยัง ... )
John Dvorak

คำอธิบาย? APL อธิบายตนเองได้ดีมาก ... ;)
german_guy

3

Python 3, 69

รวมความคิดจากที่นี่

s=input();print(([(s.find(x),x)for x in'2468'if x in s]+[(-1,0)])[0]) 

ฉันชอบการใช้สตริงมากกว่ารายการและการละเว้นคำพูด (ตอนนี้ถูกลบออก) ``
SimonT

@boothby ฉันเดาว่าคุณไม่ได้สังเกตว่าฉันใช้ python 3 ในการป้อนข้อมูล python 3 ()ยอมรับสตริงเป็นอินพุตของผู้ใช้
Wasi

@SimonT `(backticks) ไม่ได้เป็นเพียงแค่คำพูด มันเป็นชื่อแทนที่คัดค้านสำหรับrepr ()ใน python 2 แต่มันไม่สามารถใช้งานได้ใน Python 3 อีกต่อไปดังนั้นถ้าฉันต้องการใช้ `` กับบางสิ่งใน python 3 ฉันต้องเขียน repr (อะไร) ซึ่งมีราคา 4 ตัวอักษรเพิ่มเติม นั่นเป็นเหตุผลว่าทำไมฉันถึงกำจัดมันได้)
Wasi

@ ใช่แน่นอนความผิดพลาดของฉัน
บูธโดย

@ Wasi ใช่ขอบคุณ ฉันรู้ว่าและโดย "ลบออกตอนนี้" ฉันหมายถึงลบออกจริง ๆ เป็นส่วนหนึ่งของภาษาทั้งหมด ไชโย
SimonT

3

Ruby, 60 ตัวอักษร

x=gets.chars.sort.find{|c|c=~/[2468]/};p x ?$_.index(x):-1,x
  • $_getsมีการป้อนข้อมูลที่ผ่านมาอ่านโดย
  • pโทรinspectหาอาร์กิวเมนต์และพิมพ์ผลลัพธ์

3

perl - - 94 - 53 ตัวอักษร (หรือ 48)

แทนที่จะindex()ใช้วิธี zero-based เราใช้posและเริ่มต้นที่หนึ่ง ไม่มี CPAN เรียกใช้ด้วยperl -nEและจะรออินพุต (ซึ่งสามารถรับได้จากSTDIN)

นัดแรก ( //) การดำเนินงานเกี่ยวกับค่าเริ่มต้น ( $_) จากการป้อนข้อมูลการจับคู่กับแม้ตัวเลขที่กำหนดsortวันแข่งขันเป็นอาร์เรย์แล้วเก็บไว้ในรายการ ($m)"สเกลาร์" ในบริบทสเกลาร์ค่ารายการของอาร์เรย์ที่เรียงลำดับนั้นมีความยาวหนึ่งรายการและประกอบด้วยเลขคู่ที่ต่ำที่สุดในตัวเลข

เมื่อแยกตัวเลขที่จับคู่ต่ำสุดแล้วเราจะใช้$mสำหรับการดำเนินการจับคู่ที่สองซึ่งจะค้นหาการเกิดขึ้นครั้งแรกของค่า$mในสตริงเดิม เรายังคงใช้ค่าเริ่มต้นที่นี่$_และเรากำลังบันทึกการจับคู่กับเนื้อหาของ$mใน$1(เหตุผลสำหรับ()รอบ$mในคำสั่งที่สอง) หลังจากนั้นposและsayทำส่วนที่เหลือ (และในตัวอักษรน้อยกว่าindexและprint)

perl -nE'($m)=sort/[2468]/g;/($m)/g;$1?say pos.",$1":say"-1,0"'
33467
3,4

หากลำดับเอาท์พุทหรือเครื่องหมายจุลภาคไม่สำคัญก็เป็นไปได้ที่จะทำให้ 5 ตัวอักษรนี้สั้นลง:

($m)=sort/[2468]/g;/($m)/g;$1?say$1.pos:say"-10"

ในความพยายามครั้งแรกของฉันฉันรีบและทำผิดพลาด - ฉันแค่ต้องการเอาชนะหลามและทับทิม (แต่ล้มเหลว) ... ถอนหายใจ

ขอแสดงความยินดีกับผู้ชนะและผู้เข้าร่วมคนอื่น ๆ ในการแก้ปัญหาที่ยอดเยี่ยมของพวกเขา - โดยเฉพาะอย่างยิ่งกับperl6:-) การปรับใช้ Perl6 ที่เป็นไปได้ของวิธีการนี้สามารถใช้ " .comb(แนะนำบน freenode โดย Masak et.al. )

$_=get;my $n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/"

มุ่งเน้นไปที่การเต้นหลาม / ทับทิมที่ฉันโพสต์หนึ่งซับที่ไม่ได้ทำงานเมื่อไม่มีตัวเลขแม้แต่: กระตือรือร้นที่จะใช้รุ่นก่อนหน้าของข้างต้นจาก$SHELLประวัติศาสตร์ของฉันสำหรับ "ชนะ" เวอร์ชันการทำงานนี้ยาวและน่าอายอย่างน่าขัน สมน้ำหน้าฉันถูกต้อง: จะสั้นลงในภายหลังเพื่อหลีกเลี่ยงความอับอาย :-(
G. Cito

แฮ็กรุ่นเก่า:if(/[2468]/){for$i(2,4,6,8){if(index($_,$i)>-1){say$i,",",index($_,$i)+1;last}}}else{say"0,-1"}
G. Cito

2
ดี แต่ห้องเหลือไว้สำหรับเล่นกอล์ฟต่อไป: ($m)=sort/[2468]/g;/$m/g;say$&?pos.",$&":"-1,0"(47 + 1 ไบต์ AFAIK มี-nค่าใช้จ่ายเพิ่มอีกหนึ่งไบต์)
Heiko Oberdiek

NB posส่งคืนออฟเซ็ต ดังนั้นในความเป็นจริงมันกลับดัชนี 1 ตามในตัวอย่างของคุณ
draegtun

@draegtun oopsie :-) ขอบคุณ @Heiko ความจริงที่ว่า: สวิทช์ควรนับเป็นอย่างอื่นperl's -Mจะชนะทุกครั้ง ;-)
กรัม Cito

3

Perl 6, 37 55 60ตัวอักษร

$_=get;say m/<{~.comb(/<[2468]>/).min}>/.from//-1,',',$/.Int

แก้ไข: ฉันเข้าใจผิดคำถามในครั้งแรก การอัปเดตนี้ควรถูกต้อง พบจำนวนต่ำสุด 2,4,6 หรือ 8 ที่อินพุตมีอยู่จากนั้น regex จะจับคู่กับอินพุตกับตัวเลขต่ำสุดนั้น $/.fromรับตำแหน่งของการแข่งขันและ',', $/.Intเป็นเครื่องหมายจุลภาคบวกกับการจับคู่นั้นเองหรือ 0 ถ้าข้อความไม่ตรงกัน

ในขณะที่คุณอยู่ที่นี่ไปโหวตขึ้นG. Citoผู้ช่วยฉันแก้ไขรายการของฉันในความคิดเห็นและใน irc :)


1
น่าเสียดายที่พิมพ์ครั้งแรกแม้กระทั่งจำนวน (2468) พบและไม่ต่ำสุด :( NB นอกจากนี้ยังมีปัญหา$/.fromเมื่อไม่พบสิ่งใด (นี่อาจเป็นข้อผิดพลาดใน Rakudo รุ่นเก่าของฉัน) นี่คือรูปแบบของโซลูชันที่ใช้งานได้ ! สำหรับฉัน) my$x=get;for 2,4,6,8 ->$n{if $x~~/$n/ {say $/.from,",$/";exit}};say "-1 0"; มาในที่ 75 ตัวอักษร แต่ฉันแน่ใจว่าวิธีการแก้ปัญหา Perl6 สั้นสามารถทำได้.
draegtun

@draegtun ... ฉันทำผิดพลาดคล้ายกับความพยายามของฉัน perl5 เมื่อวาน (ดูด้านล่าง) การแก้ไขของฉันเพิ่ม 70 ตัวอักษร! เพิ่งอัปเดตด้วยรุ่นถ่านประมาณ 50 ซึ่งดูเหมือนจะใช้งานได้ ฉันคิดว่าถ้าคุณเรียงลำดับเลขคู่ทั้งหมดในจำนวนที่คุณสามารถทำการจับคู่โดยใช้หลักแรก (ตอนนี้) ในการเรียงลำดับและให้แน่ใจว่าคุณมีตัวเลขต่ำสุดและเป็นอันดับแรก ฉันถูกไหม?
G. Cito

@ G.Cito ดูดีสำหรับฉันและ +1 คำตอบของคุณแล้ว ฉันเห็นวิธีที่จะโกนทิ้งตัวละครสองสามตัว แต่ฉันเห็น Heiko ว่าทำได้ดีกว่าที่ฉันจะแนะนำ!
draegtun

@draegtun โอ้ geez ฉันสมบูรณ์เข้าใจผิดคำถามแล้ว :( ขอบคุณมากฉันจะปรับปรุงนี้โดยเร็วที่สุด!
Mouq

@mouq นี่คือวิธีการหนึ่งที่ใช้วิธีการเดียวกันเป็นตัวอย่าง Perl5 my $n; $_="333992";$n=.comb(/<[2468]>/).min;/$n/;say $/.from//-1,",$/"ผมโพสต์ด้านล่าง: ฉันเรียนรู้เกี่ยวกับ.combประมาณ 20 นาทีที่แล้วและชอบ :-)
G. Cito

2

J, 44 ตัวอักษร

echo(;{&i){._1,~(#~(#i)&>)'2468'i.~i=.1!:1]1

เอาต์พุตอักขระตัวสุดท้ายของอินพุตหากไม่พบเลขคู่

ตัวอย่าง:

   echo(;{&i){._1,~(#~(#i)&>)'2468'i.~i=.1!:1]1
523726
+-+-+
|1|2|
+-+-+
   echo(;{&i){._1,~(#~(#i)&>)'2468'i.~i=.1!:1]1
53771
+--+-+
|_1|1|
+--+-+

คำอธิบาย:

  • echo ... i=.1!:1]1คืออินพุต / เอาต์พุต ยาวกว่าที่ฉันต้องการ การป้อนข้อมูลจะถูกเก็บเข้าไปในiเช่นกัน
  • '2468'i.~ ค้นหาการเกิดขึ้นครั้งแรกของแต่ละเลขคู่ในอินพุตโดยส่งคืนความยาวอินพุตหากไม่พบตัวเลข
  • (#~(#i)&>)อ่าน "เลือกตามความยาวของอินพุตที่มากกว่านี้"; กล่าวอีกนัยหนึ่งให้เลือกดัชนีที่ชี้ไปที่อินพุต ยาวกว่าที่ฉันต้องการ
  • _1,~ผนวก -1 กับด้านหลัง ขีดล่างเป็นวิธีของ J ในการแสดงค่าลบ
  • {. เลือกองค์ประกอบแรก
  • (;{&i)เชื่อมต่อกับอักขระอินพุตที่ตำแหน่งนั้นในสองกล่อง เนื่องจากเรากำลังต่อหมายเลขกับตัวละครการต่อแบบไม่มีมวย ( ,) จะไม่ทำ หากต้องการการแสดงผลแบบไม่มีกล่องดัชนีจะต้องจัดรูปแบบ ( ":) ก่อนด้วยค่าใช้จ่ายสองตัวอักษร

2

Python 2.7 - 76

คำตอบอ้างอิงฉันคาดหวังอย่างเต็มที่ว่าจะถูกตี แต่เพื่อเริ่มคนออก:

s=raw_input()
print[(s.index(`e`),e)for e in[2,4,6,8]if`e`in s][:1]or(-1,0)

3
คุณสามารถโกนอักขระได้โดยเปลี่ยนindexเป็นfind; คุณสามารถเปลี่ยน[2,4,6,8]เป็น2,4,6,8(โดยมีช่องว่างด้านหน้า)
Justin

4
สั้นลง:print[(s.find(`e`),e)for e in 2,4,6,8if`e`in s+'8'][0]
grc

4
ฉันคิดว่าคุณผิดกฎของตัวเอง ... ตั้งแต่เมื่อ raw_input ไม่ใช่ stdin
Cruncher

1
print[(s.index(c),c)for c in'2468'if c in s][0]or(-1,0)
Eric


2

Powershell, 76 73 71

$s=read-host;2,4,6,8|%{if($i=$s.indexof("$_")+1){"$i,$_";break}};"-1,0"
  • $s=read-host เก็บข้อมูลผู้ใช้ลงใน $s
  • 2,4,6,8|%{...} ดำเนินการสิ่งที่อยู่ภายใน{}สำหรับตัวเลข 2,4,6 และ 8
  • $i=$s.indexof("$_")+1 ตั้งค่า$iเป็นดัชนี 1 หลักของตัวเลขใน$sหรือ0ถ้าไม่พบตัวเลข
  • if( $i=... ){...} เงื่อนไขจะเป็นจริงเมื่อ$iไม่อยู่0
  • "$i,$_";break ส่งออกดัชนีและตัวเลขและหยุดการดำเนินการ
  • "-1,0" เป็นอย่างอื่นเอาท์พุท -1,0

สิ่งนี้ไม่ได้ส่งออกดัชนีที่เหมาะสม ใน PowerShell เช่นเดียวกับในกรณีทดสอบที่กำหนดสำหรับคำถามดัชนีเริ่มต้นที่ศูนย์
Iszi

1
กฎ # 2 บอกว่าดัชนีสามารถเป็น 0 หรือ 1 ได้
Danko Durbić

โอ้ ไม่พบว่า ไม่ว่าจะด้วยวิธีใดก็ตามนี่คือตัวแปรที่เป็นศูนย์ซึ่งมีความยาวเพียง 5 อักขระ $s=read-host;(2,4,6,8)|%{if(($i=$s.indexof("$_"))-gt-1){"$i,$_";break}};'-1,0'
Iszi

นอกจากนี้ฉันค่อนข้างแน่ใจว่าวงเล็บ2,4,6,8ที่ไม่จำเป็น
Iszi

ตัวแปรแบบ zero-based สามารถทำได้ 2 ตัวอักษรอีกต่อไปหากคุณเปลี่ยนเงื่อนไข if เป็น:if(1+($i=$s.indexof("$_")))
Danko Durbić

2

C ++ 11, 173 (รวมถึงอักขระขึ้นบรรทัดใหม่สองตัว)

นี่คือรุ่นบีบอัด:

#include<iostream> 
#include<string> 
int main(){std::string s;std::cin>>s;for(char c:"2468")for(char&k:s)if(k==c){std::cout<<(&k-&s[0])<<','<<c;return 0;}std::cout<<"-1,8";}

นี่คือรุ่นที่อ่านได้:

#include<iostream>
#include<string>
int main() {
    std::string s; // auto s = ""s; (since C++14: -3 characters)
    std::cin >> s;
    for (char c : "2468")
        for (char& k : s)
            if (k == c) {
                std::cout << (&k - &s[0]) << ',' << c;
                return 0;
            }
    std::cout << "-1,8";
}

นี่คือรุ่นที่เก่ากว่า:

C ++ 11, 175 (รวมถึงอักขระขึ้นบรรทัดใหม่สองตัว)

นี่คือรุ่นบีบอัด:

#include<iostream>
#include<string>
int main(){std::string s;std::cin>>s;for(char c:"2468"){int i=s.find(c);if(i<s.size()){std::cout<<i<<','<<c;return 0;}}std::cout<<"-1,8";}

นี่คือรุ่นที่อ่านได้:

#include<iostream>
#include<string>
int main() {
    std::string s;
    std::cin >> s;
    for (char c : "2468") {
        int i = s.find(c);
        if (i < s.size()) {
            std::cout << i << ',' << c; 
            return 0;
        }
    }
    std::cout << "-1,8";
}

ลอง#define o std::cout<<ดู ฉันคิดว่ามันจดจ้องรหัสของคุณด้วย 1 ตัวอักษร

@ user2509848 ไม่จริงยาวกว่า 2 ตัวอักษร แต่ต้องขอบคุณต่อไป :)
รองเท้า

k==c?std::cout<<(...),throw 0:0;- โอเปอเรเตอร์ที่มีเงื่อนไขสามารถแทนที่ifได้เมื่อคุณต้องการนิพจน์ คือการแสดงออกและยังเป็นหนึ่งในตัวละครที่สั้นกว่าthrow return
MSalters


1

C # - 124

ฉันไปปาร์ตี้ช้าไปหน่อย

void Main(string[]a){var x=a[0].Where(w=>char.IsDigit(w));var y=x.Min();Console.Write(y%2==0?a[0].IndexOf(y)+","+y:"-1,0");}

0

Haskell, 79 ตัวอักษร

s&d=filter((==d).snd)$zip[-1..]$'0':s
main=interact$show.head.("24680">>=).(&)

การดำเนินการนี้จะรวดเร็วและหลวมเล็กน้อยด้วยการจัดรูปแบบผลลัพธ์:

& echo 523726 | runhaskell 16083-LowEven.hs 
(1,'2')
& echo 583746 | runhaskell 16083-LowEven.hs 
(4,'4')
& echo 53771 | runhaskell 16083-LowEven.hs 
(-1,'0')
& echo _4___2 | runhaskell 16083-LowEven.hs 
(5,'2')
& echo 25376 | runhaskell 16083-LowEven.hs 
(0,'2')

0

PowerShell: 145 103

การเปลี่ยนแปลงจาก
quelch ข้อผิดพลาดดั้งเดิมที่ถูกลบต่อความคิดเห็นจากผู้ถาม

รหัส:

"$([array]::IndexOf(($s=(read-host)-split''|?{$_}),($x=$s|?{$_%2-eq0}|?{$_-gt0}|sort|select -f 1))),$x"

เกมส์:

"... "ทุกอย่างภายในเครื่องหมายคำพูดจะรวมอยู่ในผลลัพธ์

$(... )ทุกสิ่งระหว่างวงเล็บจะถือว่าเป็นคำสั่งและผลลัพธ์ของรหัสนั้นจะถูกรวมไว้แทนที่จะเป็นคำสั่งเอง

[array]::IndexOf(... )นี่ใช้เพื่อรับดัชนีขององค์ประกอบที่มีอาร์เรย์ พารามิเตอร์แรกคือวัตถุอาร์เรย์ที่จะค้นหา พารามิเตอร์ที่สองคือวัตถุที่จะพบ นี่จะแสดงดัชนีขององค์ประกอบที่ตรงกันแรกเท่านั้น ฉันพยายามเพียงแค่ใช้IndexOfวิธีต่อต้านโดยตรง$s(เช่น: $s.IndexOf($x)แต่สิ่งนี้ล้มเหลวด้วยเหตุผลบางอย่างที่ฉันยังไม่ทราบ - มันอ้างว่าวิธีนี้ไม่มีอยู่ในวัตถุนั้น

(... การแสดงออกภายในวงเล็บจะเป็นครั้งแรกสำหรับพารามิเตอร์)IndexOf

$s= $ s จะเป็นตัวแปรในการจัดเก็บข้อมูลผู้ใช้

(read-host)-split'' รับอินพุตของผู้ใช้และแยกเป็นอาร์เรย์ของอักขระ '

|?{$_}-split''กรองออกองค์ประกอบมากมายที่ว่างเปล่าพิเศษที่สร้างขึ้นโดย

,(... การแสดงออกภายในวงเล็บจะเป็นพารามิเตอร์ที่สองสำหรับ)IndexOf

$x= $ s จะเป็นตัวแปรในการจัดเก็บตัวเลขแม้แต่น้อยที่สุดจากการป้อนข้อมูลของผู้ใช้

$s|?{$_%2-eq0} ดึงตัวเลขออกจาก $ s

|?{$_-gt0} ยกเลิกค่าศูนย์

|sort เรียงลำดับวัตถุที่เหลืออยู่ลำดับเริ่มต้นจะขึ้น

|select -f 1 เลือกวัตถุแรกซึ่งตอนนี้จะเป็นเลขคู่ที่ต่ำที่สุด

,$xโค้ดด้านบนจะแสดงดัชนีของเลขคู่ต่ำสุดของเรา สิ่งนี้จะเพิ่มเครื่องหมายจุลภาคแล้วส่งออกตัวเลขนั้นเอง

หมายเหตุ:

นี่อาจจะยืดกฎข้อที่ 4 นิดหน่อย หากไม่มีเลขคู่เอาท์พุทจะไม่รวมหมายเลขที่สอง

นอกจากนี้สิ่งนี้จะส่งข้อผิดพลาดที่ไม่สิ้นสุดหากอินพุตมีองค์ประกอบที่ไม่ใช่ตัวเลข สคริปต์จะยังคงทำงานและให้ผลผลิตที่เหมาะสม แต่คุณอาจต้องการที่จะตั้งค่า$ErrorActionPreferenceการ'SilentlyContinue'ก่อนที่จะใช้มัน


@ DankoDurbićตอนนี้คุณได้พ่ายแพ้ฉันอย่างเงียบ ๆ คุณจะช่วยฉันคิดว่าทำไมฉันไม่สามารถใช้$s.IndexOfที่นี่? มันทำให้ฉันมีข้อผิดพลาดที่บอกว่าวิธีการไม่ได้มีอยู่สำหรับวัตถุนั้นแม้ว่าจะ$s|gmบอกว่ามันทำ มันใช้งานได้กับระบบที่ฉันใช้อยู่ในตอนนี้ แต่ไม่ใช่ในตอนนี้ที่ฉันพยายามทำในวันนี้ เป็นปัญหาความเข้ากันได้ของรุ่นหรือไม่ ระบบก่อนหน้านี้คือ PSv2 ปัจจุบันคือ PSv4
Iszi

คุณ$sคือstring[]และ$s.indexofไม่ทำงานเพราะ...[System.String[]] doesn't contain a method named 'indexOf'ดูเหมือนว่าสมเหตุสมผล (ฉันใช้ PS 2.0) $s|gmผลตอบแทนที่สมาชิกไม่ได้System.String System.String[]ฉันไม่แน่ใจว่าทำไมมันถึงเป็นเช่นนั้น
Danko Durbić

0

vb.net (108c)

Sub Main()
t=ReadLine()                          '12c
For Each c In "2468"                  '20c  
i=t.IndexOf(c)                        '14c
If i>=0 Then Exit For                 '21c
Next                                  ' 4c
WriteLine("{0},{1}",i,If(i<0,0,t(i))) '37c
End Sub

มีกลิ่นเล็กน้อยเพราะมันใช้ประโยชน์จากการตั้งค่าแบบไดนามิกของ VB Option Explicit ปิดและนำเข้า System.Console


0

VB.net (193c) โดยใช้ LINQ

อันนี้ใช้การสอบถาม LINQ เป็นหลัก

Dim r = From d In "2468" Group Join q In ReadLine.Select(Function(c, p) New With {.c = c, .i = p})
                              On d Equals q.c Into g = Group
                                        Skip While g.Count = 0 ' 138c
WriteLine(If(r.Any,r(0).g(0).i&","&r(0).g(0).c,"-1,0"))        '  55c

0

Golf-Basic 84, 91 ตัวอักษร

:L1/L1_L2i`L1:fpart(L1,2)2_L1:SortA(L1)@cumSum(L1)=length(L1):Thend`-1#d`cumSum(L1):Endd`L1
  • ตรวจสอบให้แน่ใจว่าไม่มี0การป้อนข้อมูล (ไม่แม้แต่ใครบอกว่ามันจะแปลก)
  • รับข้อมูลเข้าสู่ L1 (รายการ 1)
  • วนหาโมดูลัสของ 2 สำหรับแต่ละค่า
  • เรียง L1 จากเล็กไปหามากที่สุด
  • แสดงดัชนี (ทั้ง -1 หรือผลรวมสะสม) และจำนวนที่น้อยที่สุด

0

Bourne shell (sh), 88 chars

(echo 88;sed 's/./\n&/g')|nl -v-1|awk '{print $2,$1}'|sed '/^[^2468]/d'|sort -n|head -n1

ฉันคิดว่าฉันจะทำการประมวลผลแบบสตริงเพื่อความสนุก ในทางเทคนิคแล้วมันอ่านจาก stdin แต่ถ้าคุณเรียกใช้แบบโต้ตอบมันจะพร้อมท์ให้ผู้ใช้ป้อนเนื่องจากคีย์บอร์ดเป็น stdin stream ที่เป็นค่าเริ่มต้น ใช้คำสั่งเชลล์พื้นฐานเพื่อแยกอินพุตบนบรรทัดจำนวนคำสั่งเหล่านั้น (โดยใช้nlยูทิลิตี้ที่ไม่รู้จัก) กรองบรรทัดที่เหมาะสมกับเกณฑ์เรียงลำดับและส่งออกหนึ่งหลักต่ำสุด พิมพ์88 -1หากไม่พบเลขคู่


0

C ++ - 223 221 ตัวอักษร:

#include<iostream>
#include<string>using namespace std;
int main(){int s=9;int p=-1;string x;cout<<"Enter characters: ";cin>>x;for(int i=0;i<x.length();i++){int n=x[i]-48;if(n%2==0&n<s){s=n;p=i;}}cout<<p<<", "<<s;return 0;}

รุ่นที่อ่านได้:

#include<iostream>
#include<string>
using namespace std;

int main() {
    int s = 9;
    int p= - 1;
    string x;

    cout << "Enter characters: ";
    cin >> x;

    for (int i = 0; i < x.length(); i++) {
        int n = x[i] - 48;

        if (n % 2 == 0 & n < s) {
            s = n;
            p = i;
        }
    }

    cout << p << ", " << s;

    return 0;
}

มันยาว แต่ไม่เลวเท่าจาวา


จริงๆแล้วมันคือ 221 + 2 (ตัวอักษรขึ้นบรรทัดใหม่) มิฉะนั้นมันจะไม่คอมไพล์
รองเท้า

โอ้ ตรวจพบ Word เท่านั้น 221 ฉันจะเปลี่ยน

0

Javascript 93 ตัวอักษร

b=prompt();((r=b.match(/[2468]/g)||[-1]).sort(function(a,b){return a-b})[0])+","+b.indexOf(r)

รับหมายเลขเหตุการณ์ทั้งหมดเรียงลำดับอาร์เรย์และพิมพ์ตัวเลขแรก


0

Mathematica, 157 ตัวอักษร

f = Row@{If[(x = Min@#) == Infinity, -1, Position[#, x][[1, 1]]],
      ",", x} &[IntegerDigits@ToExpression@StringReplace[#,
       {"0" -> "1", x_?DigitQ :> x, _ -> "1"}] /. _?OddQ -> Infinity] &

inputs = {"25376", "523726", "583746", "53771", "_4___2"}

f /@ inputs // Column

1,2

2,2

5,4

-1 ∞

6,2


0

จูเลียอายุ 84 ปี

julia> f(a)=(for i=2:2:8;(k=search(a,'0'+i))==0||return(k,i);end;(-1,0))
julia> f(readline(STDIN))
583746
(5,4)
julia> f(readline(STDIN))
_4___2
(6,2)

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


0

JavaScript - 53 ตัวอักษร

for(y=prompt(x=0);x<8&&(i=y.indexOf(x+=2))<0;);x+''+i

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


0

C, 110 ตัวอักษร

i,f,r,c,m=9;main(){while(r=getchar()>31){c=r-48;i++;if(c>=0&&~c&1&&c<m)m=c,f=i;}printf("%i,%i",m>8?-1:f-1,m);}

ungolfed:

i,f,r,c,m=9;
main(){
  while(r=getchar()>31){
    c=r-48;
    i++;
    if(c>=0&&~c&1&&c<m) m=c,f=i;
  }
  printf("%i,%i",m>8?-1:f-1,m);
}

0

Javascript, 69

a=prompt(),b=[-1,9];for(i in a)if(+a[i]%2==0&&+a[i]<b[1])b=[+i,+a[i]]

อ่านค่าทำซ้ำผ่านตัวละครแต่ละตัวถ้าจำนวนการเป็นตัวแทน mod 2 เท่ากับ 0 และจำนวนที่น้อยกว่าที่เก็บไว้แล้วbให้แทนที่ค่าในb




0

JavaScript / jQuery 149

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

$(function(){
var i=prompt(),k=-1,n=0,c,e="2468";
while(n<i.length){c=i.charAt(n);k=e.indexOf(c);if(k>=0){break;}n++;}$('#d').append(k+","+n);
});

แหล่งข้อมูลเต็มรูปแบบ

<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
</head>
<body>
<div id="d"></div>
<script type="text/javascript">
$(function(){
var i=prompt();
var k=-1;
var n=0;
var c;
var e="2468";
while(n<i.length){
c=i.charAt(n);
k=e.indexOf(c);
if(k>=0){
break;
}
n++;
}
$('#d').append(k+","+n);
});
</script>
</body>
</html>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.