ใครเป็นคนง่วงนอนที่สุดของพวกเขาทั้งหมด


31

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในสายของตัวละคร-=o.ที่-=o'และ.' s สำรองเสมอตัวละครให้กับตัวละคร -=oสตริงจะมีมากขึ้นมีความยาวมากกว่าหนึ่งที่แปลกและมักจะเริ่มต้นและจบในหนึ่งใน

โดยทั่วไปอินพุตจะมีลักษณะเหมือนใบหน้าอิโมติคอนที่ใช้สายตาร่วมกันในสภาวะต่าง ๆ ของความง่วงเช่น

o.=.=.-.-.o.o

เป้าหมายของคุณคือพิมพ์หรือส่งคืนใบหน้าที่หลับยากหรือตื่นมากที่สุด (ขึ้นอยู่กับคุณที่คุณเลือก) หากมีหลายทางเลือกสำหรับผู้ที่ง่วงนอน / ตื่นมากที่สุดคนใดคนหนึ่งอาจออก

มีเก้าใบหน้าที่แตกต่างและห้าระดับของความง่วงนอน:

-.- is 100% sleepy
-.= is 75% sleepy
-.o is 50% sleepy
=.- is 75% sleepy
=.= is 50% sleepy
=.o is 25% sleepy
o.- is 50% sleepy
o.= is 25% sleepy
o.o is 0% sleepy

ในกรณีที่ไม่ชัดเจนเปอร์เซ็นต์ง่วงนอนจะคำนวณโดยกำหนด1ให้-หลับอย่างสมบูรณ์0.5ถึง=สำหรับครึ่งหลับและ0เพื่อoสำหรับการตื่นตัว จากนั้นผลรวมของค่าสายตาทั้งสองหารด้วยสองคือเปอร์เซ็นต์

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

กรณีทดสอบ

sleepiest

-.- GIVES -.-
=.- GIVES =.-
o.o GIVES o.o
o.-.= GIVES -.=
=.-.= GIVES =.- OR -.=
o.-.= GIVES -.=
-.-.= GIVES -.-
o.o.- GIVES o.-
=.=.=.o GIVES =.=
-.=.=.= GIVES -.=
=.o.-.= GIVES -.=
o.-.o.=.= GIVES o.- OR -.o OR =.=
-.o.-.=.= GIVES -.=
o.o.o.o.o GIVES o.o
-.-.-.-.- GIVES -.-
o.=.=.-.-.o.o GIVES -.-
-.=.-.o.o.=.o.-.o.=.-.o.=.o.- GIVES -.= OR =.-

ตื่นเถิดที่สุด

-.- GIVES -.-
=.- GIVES =.-
o.o GIVES o.o
o.-.= GIVES o.-
=.-.= GIVES =.- OR -.=
o.-.= GIVES o.-
-.-.= GIVES -.=
o.o.- GIVES o.o
=.=.=.o GIVES =.o
-.=.=.= GIVES =.=
=.o.-.= GIVES =.o
o.-.o.=.= GIVES o.=
-.o.-.=.= GIVES -.o OR o.- OR =.=
o.o.o.o.o GIVES o.o
-.-.-.-.- GIVES -.-
o.=.=.-.-.o.o GIVES o.o
-.=.-.o.o.=.o.-.o.=.-.o.=.o.- GIVES o.o

31
ฉันรู้สึก-.-
Kritixi Lithos

คำตอบ:


28

Pyth, 12 10 ไบต์

hoSN%2.:z3

สิ่งนี้พิมพ์อิโมติคอนที่ง่วงนอนที่สุด ตรวจสอบกรณีทดสอบทั้งหมดพร้อมกันในPyth Compilerคอมไพเลอร์

เครดิตไปที่ @ Sp3000 เพื่อให้แนวคิดในการใช้การเรียงลำดับความคิดที่จะใช้การเรียงลำดับ

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

hoSN%2.:z3
              (implicit) Save the in z.
      .:z3    Compute all substrings of length 3.
    %2        Keep every seconds substring. This discards non-emoticons.
 o            Sort the emoticons by the following key:
  SN            Sort the characters of the emoticon.
                This works since '-' < '=' < 'o'.
h             Retrieve the first, minimal element.

18
คาถานี้คืออะไร!
AvZ

@Dennis ฉันยังใหม่กับ Pyth ดังนั้นนี่อาจผิด: ทำไมhS%2.:z3ล่ะ?
Helix Quar

5
@helix เพราะเราต้องการ=.-ที่จะเป็น sleepier กว่า-.oแต่พวกเขากำลังเรียงวิธีการอื่น ๆ ฉันทำผิดพลาดแบบเดียวกัน
xnor

9

Python 2, 54 53 ไบต์

f=lambda s:s and max((s+' ')[:3],f(s[2:]),key=sorted)

นี่คือฟังก์ชั่นที่คืนค่าใบหน้าที่ตื่นที่สุด

ขอบคุณมากที่ xnor ที่ให้กลวิธีทางยุทธวิธีมากมายเพื่อร่นอัลกอริทึมดั้งเดิมของฉัน


ฉันรู้สึกโง่ที่ไม่รู้ว่าสัญลักษณ์ต่าง ๆ ถูกจัดเรียงตามความตื่นตัว ฉันคิดว่าคุณสามารถชดเชยmaxมากกว่าที่จะทำซ้ำได้:f=lambda s:s[3:]and max(s[:3],f(s[2:]))or s
xnor

อันที่จริงฉันคิดว่านี่ไม่ได้ผล=.-.oเนื่องจาก=.-vs -.oเป็นข้อยกเว้นของกฎการเรียงลำดับ
xnor

ที่จริงฉันเพิ่งรู้ว่าฉันเข้าใจผิด op ฉันคิดว่าใบหน้าเรียงตามที่ปรากฏในตาราง เนื่องจากข้อสันนิษฐานนี้การส่งของฉันจึงล้มเหลวสำหรับ "= .o.-" ฉันคิดว่าฉันมีวิธีแก้ไข
xsot

@ xsot ฉันเชื่อว่า,key=sortedจะเป็นวิธีแก้ปัญหา แต่นี่คือ 11 ตัวอักษรดังนั้นคุณอาจสั้นกว่านี้
xnor

ใช่นั่นคือการแก้ไขที่ฉันมีในใจ
xsot

6

CJam, 12 ไบต์

q3ew2%{$}$0=

สิ่งนี้พิมพ์อิโมติคอนที่ง่วงนอนที่สุด ลองเล่นซอนี้หรือชุดทดสอบในล่าม CJam

เครดิตไปที่ @ SP3000 สำหรับความคิดที่จะใช้การเรียงลำดับ

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

q            e# Read all input from STDIN.
 3ew         e# Push all overlapping slices of length 3.
    2%       e# Keep every seconds slice. This discards non-emoticons.
      {$}$   e# Sort the slices by their sorted characters.
             e# This works since '-' < '=' < 'o'.
          0= e# Retrieve the first, minimal slice.

4

Dyalog APL, 35 28 ไบต์

{⊃{⍵[⍒{+/'.??o='⍳⍵}¨⍵]}3,/⍵}

นี่คือฟังก์ชั่น monadic ที่นำสายไปทางขวาและส่งผลให้ใบหน้าที่หลับยาก

    {⊃{⍵[⍒{+/'.??o='⍳⍵}¨⍵]}3,/⍵}'o.=.=.-.-.o.o'
-.-

{(⊃⍒3+/'.??o='⍳⍵)⊃3,/⍵}
user46915

และด้วยข้อ จำกัด อินพุตที่??ไม่จำเป็นเช่นกัน
user46915

4

อารัมภบท, 205 189 ไบต์

รหัส

r([X|T],[N|B],M):-N=M,write(X);r(T,B,M).
p(X):-findall(S,sub_atom(X,_,3,_,S),L),findall(E,(nth1(I,L,E),I mod 2=\=0),R),maplist(atom_codes,R,Q),maplist(sum_list,Q,S),min_list(S,M),r(R,S,M).

คำอธิบาย

r([X|T],[N|B],M):-N=M,write(X);r(T,B,M).
p(X):-findall(S,sub_atom(X,_,3,_,S),L),              % L = all sublists of length 3
      findall(E,(nth1(I,L,E),I mod 2=\=0),R),        % R = every other element of L
      maplist(atom_codes,R,Q),                       % Q = list of decimal ascii codes 
                                                           created from R

      maplist(sum_list,Q,S),                         % S = list of sums of R's lists
      min_list(S,M),                                 % M = minimum sum
      r(R,S,M).                                      % Prints first element in R with sum M

ตัวอย่าง

>p('-.=.-.o.o.=.o.-.o.=.-.o.=.o.-').
-.=

แก้ไข:บันทึก 16 ไบต์โดยยกเลิกการรวม r-clauses ด้วย OR


1

Clojure, 82 ไบต์

(fn[x](println(apply str(apply min-key #(reduce +(map int %))(partition 3 2 x)))))

โบนัส: ฟังก์ชั่นขนาดเล็กต่อไปนี้พิมพ์ใบหน้าเดียวกัน แต่มีสไตล์มากกว่า!

(fn[x](println(apply min-key #(reduce +(map int %))(partition 3 2 x))))

ทดสอบที่นี่


1

Ruby, 59 ไบต์

ฟังก์ชั่นคืนใบหน้าที่ง่วงนอนโดยใช้เคล็ดลับการจัดเรียง

f=->(s){s.split(?.).each_cons(2).min_by{|e|e.sort}.join(?.)}

เรียกว่าเป็นแบบนี้:

f.call("o.=.=.-.-.o.o")
# => "-.-"

ทำงานตามคำสั่งของตาที่น่าอึดอัดใจเนื่องจากการเรียงของดวงตาภายใน:

f.call("=.-.o")
# => "=.-"

1

Minkolang 0.12 , 119 ไบต์

ตอนแรกฉันพยายามทำสิ่งนี้สั้น ๆ และเล่นกอล์ฟจริงๆ ฉันยอมแพ้แล้วออกไปหา "ความสนุก" อีกสักหน่อย แต่ก็ยังค่อนข้างกอล์ฟ

>2@fv$oI2:[9[i$z3[iciz1+q=]++3=tt"^"3zpt]$x$x]IX3140w
o.o1F
o.=1$
=.o1+
=.=12
o.-1:
-.o11
=.-1+
-.=13
-.-1[
/c0i<
\qO].

ลองที่นี่!

คำอธิบาย

แต่จริงๆคลิกที่ลิงค์ด้านบนและคลิกSlow! อย่างไรก็ตาม...

>2@fv

สิ่งนี้จะข้ามไปfvซึ่งจะมีความสำคัญในภายหลัง

$o                                                  Read in whole input as characters 
  I2:                                               Half the stack length
     [                                              Open for loop (for each face)
      9[                                            Open another for loop - 9 repeats
        i$z                                         Stores loop counter in register
           3[                                       Open another for loop - 3 repeats
             ic                                     Copy char 1/2/3
               iz1+q                                Retrieve char from lookup table
                    =                               1 if equal, 0 otherwise
                     ]                              Close for loop
                      ++                            Add twice
                        3=                          1 if equal to 3, 0 otherwise
                          tt      t                 Ternary - executes first part when 0,
                                                    second part otherwise
                            "^"3zp                  Put a ^ next to the face that matched
                                   ]                Close lookup for loop
                                    $x$x            Dump first two characters
                                        ]           Close for loop
                                         IX         Dump the whole stack
                                           31       Push a 3, then a 1
                                             40w    Wormhole to (4,0) in the code

สิ่งที่ทำทั้งหมดนั้นอยู่^ถัดจากใบหน้าที่เข้าคู่กัน ดังนั้นตอนนี้กล่องรหัสอาจมีลักษณะเช่นนี้:

>2@fv$oI2:[9[i$z3[iciz1+q=]++3=tt"^"3zpt]$x$x]IX3140w
o.o1F
o.=1$
=.o1+
=.=^2   <-- caret
o.-^:   <-- caret
-.o11
=.-1+
-.=^3   <-- caret
-.-1[
/c0i<
\qO].

ไม่มีความคิดเห็นแน่นอน ตอนนี้40wหนอนส่งตัวชี้การเรียนการสอนไปซึ่งทันทีเปลี่ยนเส้นทางลงv Fตอนนี้Fเป็นคำสั่ง "gosub" มันเหมือน goto แต่คุณสามารถกลับไปยังที่ที่คุณโทรหาได้ ในขณะที่Fพบสแต็[3,1]กจะข้ามไปที่1(อาจ) บนแถวที่สอง ในขณะที่ตัวนับโปรแกรมมุ่งหน้าลงด้านล่างมันจะดำเนินต่อไปโดยกด1s ลงบนสแต็กตามทาง นั่นคือ ... จนกว่าจะถึง^จุดที่มันถูกเปลี่ยนเส้นทางกลับไปที่จุดที่มันผลักกัน1อีกครั้ง จากนั้นตัวชี้คำสั่งจะเปิดใช้fงานซึ่งจะเรียกคืนตำแหน่งและทิศทางของมัน (เมื่อFพบก่อนหน้านี้) เพื่อความสะดวกฉันจะใช้รหัสต่อไปนี้และเปลี่ยนเค้าโครง (ใน</\ ทำหน้าที่เปลี่ยนเส้นทางตัวชี้คำสั่งตามต้องการ)

$+                 Sum up the whole stack
  2:               Divide by 2 (because each 1 was pushed twice)
    1+             Add 1 (shift down one row)
      3[           Open for loop - 3 repeats
        i          Push loop counter
         0c        Copy top of stack
           q       Retrieve face character
            O      Output as character
             ].    Close for loop and stop when it's done.

จริงๆแล้วฉันรู้สึกภูมิใจที่ฉันใช้คุณสมบัติหลายอย่างที่ไม่เหมือนใครของ Minkolang ที่ฉันไม่เคยใช้มาก่อน ส่วนใหญ่ประกอบไปด้วยและ gosub อย่างไรก็ตามคุณมีมัน!


1

C, 70 ไบต์

char*f(char*s){char*p=s[3]?f(s+2):s;return*s+s[2]>*p+p[2]?s[3]=0,s:p;}

ฟังก์ชั่นคืนค่าใบหน้าที่น่าตื่นตาที่สุด มันปรับเปลี่ยนสายเข้าในสถานที่เพื่อกลับสตริงที่สิ้นสุดด้วย null


1

Python 2/3, 54 56ไบต์

lambda x:".".join(max(zip(x[::2],x[2::2]),key=sorted))

แค่อยากจะใช้วิธีอื่นเพื่อตอบคำถามซ้ำซากของ xsot

สิ่งนี้จะใช้คู่ที่ดีที่สุด (หรือแย่ที่สุด) ของคู่ตาที่อยู่ติดกันและรวมเข้าด้วยกัน

แทนที่ max ด้วย min เพื่อคืนค่าง่วงนอนมากที่สุด (เช่นนี้จะคืนค่าตื่นตัวมากที่สุด)

ดูเหมือนว่าจะทำงานโดยใช้การทดสอบต่อไปนี้:

for line in """-.- GIVES -.-
    =.- GIVES =.-
    o.o GIVES o.o
    o.-.= GIVES o.-
    =.-.= GIVES =.- OR -.=
    o.-.= GIVES o.-
    -.-.= GIVES -.=
    o.o.- GIVES o.o
    =.=.=.o GIVES =.o
    -.=.=.= GIVES =.=
    =.o.-.= GIVES =.o
    o.-.o.=.= GIVES o.=
    -.o.-.=.= GIVES -.o OR o.- OR =.=
    o.o.o.o.o GIVES o.o
    -.-.-.-.- GIVES -.-
    o.=.=.-.-.o.o GIVES o.o
    -.=.-.o.o.=.o.-.o.=.-.o.=.o.- GIVES o.o""".splitlines():
    inp, _, opts = line.partition(" GIVES ")
    optst = opts.split(" OR ")
    act = f(inp)
    print(inp, "expected", opts, "got", act, "equal?", act in optst)

ซึ่งให้ผลลัพธ์ดังต่อไปนี้:

-.- expected -.- got -.- equal? True
=.- expected =.- got =.- equal? True
o.o expected o.o got o.o equal? True
o.-.= expected o.- got o.- equal? True
=.-.= expected =.- OR -.= got =.- equal? True
o.-.= expected o.- got o.- equal? True
-.-.= expected -.= got -.= equal? True
o.o.- expected o.o got o.o equal? True
=.=.=.o expected =.o got =.o equal? True
-.=.=.= expected =.= got =.= equal? True
=.o.-.= expected =.o got =.o equal? True
o.-.o.=.= expected o.= got o.= equal? True
-.o.-.=.= expected -.o OR o.- OR =.= got =.= equal? True
o.o.o.o.o expected o.o got o.o equal? True
-.-.-.-.- expected -.- got -.- equal? True
o.=.=.-.-.o.o expected o.o got o.o equal? True
-.=.-.o.o.=.o.-.o.=.-.o.=.o.- expected o.o got o.o equal? True

คำถามสองข้ออย่างรวดเร็ว: 1) การติดฉลากเป็น Python 2/3 เมื่อสิ่งที่ใช้ได้กับทั้งสองข้อแนะนำหรือไม่ 2) f=จำเป็นต้องมีส่วนใดส่วนหนึ่งของขนาดรหัสสำหรับความท้าทายนี้หรือไม่? ถ้าผมไม่ทำอย่างนั้นมันจะสร้างแลมบ์ดาแล้วเพียงแค่ทันทีโยนมันออกไปอีกครั้ง ...
TLW

1
1) "Python 2/3" หรือเพียงแค่ "Python" ไม่เป็นไรฉันคิดว่า 2) ถ้าคุณไม่จำเป็นต้องใช้f=ฉันทามติในปัจจุบันดูเหมือนว่าฟังก์ชั่นนิรนามไม่เป็นไรโดยค่าเริ่มต้นดังนั้นคุณจึงสามารถวางf=ในกรณีนี้ได้ xsot ต้องการมันตั้งแต่เรียกซ้ำ)
Sp3000


0

Mathematica, 61 ไบต์

"."
Sort[Partition[#~StringSplit~%,2,1]][[1]]~StringRiffle~%&

ไปสำหรับคนที่ง่วงนอน


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

0

F # 60

fun s->Seq.max[for n in 0..2..String.length s-2->s.[n..n+2]]

คืนค่าใบหน้าที่ตื่นมากที่สุด (เปลี่ยนmaxโดยminสำหรับ sleepest)


0

Perl 5, 127 bytes

%h=qw[- 2 = 1];sub r{$b=0;$b+=$h{$_}for split'',pop;$b}($_)=<>;@a='o.o';while(/.../g){push@a,$& if(r$&)>r$a[-1];--pos}say$a[-1]

(ฉันแน่ใจว่ามันใช้งานได้สั้นกว่า) มันทำงานอย่างไร:

  1. คว้าสตริงสามอักขระแต่ละตัวจากสตริงโดยทับซ้อนกันหนึ่งอัน (นั่นคือสิ่งที่--posทำ)
  2. ต่อท้ายสตริงสามอักขระไปยังอาร์เรย์ถ้าค่าเกินกว่าองค์ประกอบสุดท้ายของอาร์เรย์ ที่นี่ "ค่า" เป็นเพียงผลรวมของค่าของตัวละครในโหมดสลีป
  3. พิมพ์องค์ประกอบสุดท้ายของอาร์เรย์

0

ES6, 81 72 ไบต์

a=>"-.-,-.=,=.-,-.o,=.=,o.-,=.o,o.=,o.o".split`,`.find(b=>a.includes(b))

อาจต้องใช้ Chrome 45 หรือ Firefox 41

ขอบคุณ @ETHproductions สำหรับการบันทึก 9 ไบต์


1
ดี แต่"=.-"ควรจะเปลี่ยนกับ"-.o"; เช่นเดียวกันกับและ"=.o" นอกจากนี้คุณอาจจะสามารถบันทึกไบต์บางส่วนโดยการวางทุกอย่างในหนึ่งสตริงคั่นด้วยเครื่องหมายจุลภาคและการใช้"o.-" .split`,`
ETHproductions

การใช้การแบ่งสามารถบันทึก 9 ตัวอักษร
edc65

@ETHproductions ขออภัยฉันไม่ได้สังเกตว่ารายการต้นฉบับของใบหน้าไม่ได้อยู่ในลำดับการนอนหลับ
Neil

0

> <> , 55 ไบต์

ลองที่นี่!

<v~i:i&0"."0
 >i:@+:&:@)?v&~i0(?v
 ^?)0i:r~r&~<;ooo$r<

เอาท์พุตใบหน้าที่ตื่นตัวที่สุด

เนื่องจากค่า ASCII สำหรับ -, = และ o เพิ่มขึ้นตามลำดับฉันสามารถใช้สิ่งนั้นเพื่อผลประโยชน์ของฉัน โดยพื้นฐานแล้วมันจะเพิ่มค่าของส่วนตาปัจจุบันและก่อนหน้าตรวจสอบว่ามันเป็นค่าที่สูงกว่าก่อนหน้าหรือไม่หากมันเป็นการบันทึกค่าใหม่และอัปเดตใบหน้าที่แสดงถึงใบหน้านั้นจะวนซ้ำจนกว่าจะสิ้นสุดอินพุต จากนั้นเอาท์พุตใบหน้าที่เหลืออยู่ (ฉันดีใจมากที่รหัสทั้งหมดเข้ากันได้ดี)


0

Perl 5 -MList::Util=max -p , 68 ไบต์

s|..(?=(.))|$t=max$t,ord($&)%15%4+ord($1)%15%4 .$&.$1|eg;$_=$t;s/.//

ลองออนไลน์!

จับแต่ละชุดของอักขระสามตัวละเว้น.ตรงกลางแมปการเพิ่มของอีกสองตัวเป็นจำนวนเต็มในช่วง 0-4 เชื่อมต่อที่ด้านหน้าของใบหน้าอิโมติคอนแล้วเรียงลำดับตามนั้น คว้ารายการสุดท้าย (ตื่นตัวมากที่สุด) ลบหมายเลขออกจากด้านหน้าและออกผลลัพธ์

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