มันเป็นวันอะไร (บน Flooptonia)?


34

คุณเป็นนักเดินทางอวกาศเพื่อไปยังดาวเคราะห์ Flooptonia! เที่ยวบินจะใช้เวลาอีก 47,315 ปีดังนั้นเพื่อให้ผ่านเวลาก่อนที่คุณจะถูกแช่แข็ง cryogenically คุณตัดสินใจที่จะเขียนโปรแกรมเพื่อช่วยให้คุณเข้าใจปฏิทิน Flooptonian

นี่คือปฏิทิน Flooptonian ที่มีความยาว 208 วัน:

Month       Days    Input Range
Qupu        22      [0-22)
Blinkorp    17      [22-39)
Paas        24      [39-63)
Karpasus    17      [63-80)
Floopdoor   1       [80]
Dumaflop    28      [81-109)
Lindilo     32      [109-141)
Fwup        67      [141-208)

ท้าทาย

โปรแกรมของคุณกำหนดวันจำนวนเต็มในปี (ช่วง[0-208)) คือการส่งออกวันที่สอดคล้องกันของเดือนและชื่อของเดือน (เช่น13 Dumaflop)

อย่างไรก็ตามมีข้อยกเว้นคือ: Floopdoor เป็นช่วงเวลาพิเศษสำหรับ Flooptonians ซึ่งเห็นได้ชัดว่าสมควรได้รับหน้าปฏิทินของตัวเอง ด้วยเหตุผลดังกล่าว Floopdoor จึงไม่ได้ถูกเขียนด้วยหนึ่งวัน (นั่นคือผลลัพธ์Floopdoorไม่ใช่1 Floopdoor)

กรณีทดสอบ

0   => 1 Qupu
32  => 11 Blinkorp
62  => 24 Paas
77  => 15 Karpasus
80  => Floopdoor
99  => 19 Dumaflop
128 => 20 Lindilo
207 => 67 Fwup

กฎระเบียบ

  • คุณต้องเขียนโปรแกรมที่สมบูรณ์
  • คุณสามารถสันนิษฐานได้ว่าอินพุตนั้นถูกต้องเสมอ
  • ผลลัพธ์ของคุณอาจมีการขึ้นบรรทัดใหม่ แต่จะต้องไม่มีอักขระเพิ่ม กรณีนี้ควรตรงกับตัวอย่างที่ให้มาด้วย
  • คุณสามารถใช้ฟังก์ชันวันที่ / เวลา
  • ความยาวโค้ดจะถูกวัดเป็นไบต์

2
มันคือ "Floopdo o r" หรือ "Floopdor" หรือไม่? แผนภูมิแรกมีส่วนเสริมoแต่กรณีอื่น ๆ ของชื่อไม่มี
jwodder

4
ดังนั้น ... ในอีก 47k ปีจะไม่มีอะไรเปลี่ยนแปลง?
ไม่ใช่ Charles

2
@NotthatCharles ยิ่งกว่านั้นถ้าดาวเคราะห์นั้นอยู่ไกลออกไปมันจะไม่ล้าสมัยเมื่อคุณได้มันมาตั้งแต่แรก?
SuperJedi224

3
ราวกับว่าปฏิทินเกรโกเรียนไม่ดีพอ
Arturo Torres Sánchez

3
@ ArturoTorresSánchezอย่างน้อยก็ไม่มีปีอธิกสุรทิน แต่มีเรื่องราวอื่น ๆ เกี่ยวกับ Flooptonia อีกหรือมีการสร้างฉากปริศนานี้โดยเฉพาะทั้งหมดหรือไม่? Fwup คำพูดของพวกเขาสำหรับฤดูหนาว? หรือฉันควรเอาหางกลับมาที่ Worldbuilding?
Damian Yerrick

คำตอบ:


14

Pyth - 105 103 90 88 ไบต์

ใช้การแปลงฐาน ตารางการค้นหาอย่างง่ายสองตารางโดยมีหนึ่งตารางสำหรับชื่อและอีกหนึ่งตารางสำหรับวันที่เริ่มต้นและตารางที่สามในตอนท้ายของ Floopdoor

KhfgQhTC,aCM"mQP?'"Zcs@LGjC"îºBüÏl}W\"p%åtml-¢pTÇÉ(°±`"23\c+?nQ80+-hQhKdkreK3

บีบอัดสตริงไม่ใช่ฐาน 128 แต่เป็นฐาน 23 อันดับแรกมันแปลเป็นดัชนีของตัวอักษร ต้องมีตัวคั่นเพื่อcไม่ให้ปรากฏในชื่อเดือนใด ๆ จากนั้นจะเข้ารหัสให้เป็นฐานสิบจากฐาน 23 จำนวน (ค่าสูงสุดที่ปรากฏคือw) จากนั้นแปลงเป็นฐาน 256

วันที่เริ่มต้นคือ codepoints Unicode ของพวกเขาไม่มีการแปลงฐาน

K                       K =
 hf                     First that matches the filter
  gQ                    >= Q
   hT                   First element of filter var
  C,                    Zip two sequences
   a       Z            Append 0 (I could save a byte here but don't want to mess with null bytes)
    CM"..."             Map the string to its codepoints
   c          \c        Split by "c"
    s                   Sum by string concatenation
     @LG                Map to location in alphabet
      j     23          Base 10 -> Base 23
      C"..."            Base 256 -> Base 10
+                       String concatenation
 ?nQ80                  Ternary if input != 80
  +-hQhK                Input - start date + 1
  k                     Else empty string
 r  3                   Capitalize first letter
  eK                    Of month name

ลองมันออนไลน์ได้ที่นี่

Test Suite


ฉันใหม่กับ Pyth คุณช่วยแยกมันออกมาได้ไหม? ฉันจะขอบคุณมาก
Winny

1
@ Winny ฉันจะเพียงแค่ต้องการที่จะจบกอล์ฟที่ชัดเจนก่อน สัญลักษณ์แปลก ๆ ทั้งหมดเป็นเพราะฉันบีบอัดสัญลักษณ์ 26 ฐาน (ตัวอักษร) ลงในฐาน 256 เพื่อประหยัดพื้นที่
Maltysen

1
@ Winny นั้นเพียงพอหรือไม่ รู้สึกอิสระที่จะ ping ฉันที่นี่ / ในการแชทหากคุณมีคำถามใด ๆ
Maltysen

19

Python 3, 159 156 152 151 150 148 ไบต์

n=int(input())+1
for c,x in zip(b" C","Qupu Blinkorp Paas Karpasus Floopdoor Dumaflop Lindilo Fwup".split()):c>=n>0and print(*[n,x][-c:]);n-=c

วัตถุไบต์ในการzipประกอบด้วยอักขระ unprintable:

for c,x in zip(b"\x16\x11\x18\x11\x01\x1c C", ...): ...

(ขอบคุณ @xnor ที่แนะนำการfor/zipวนซ้ำสำหรับ -3 ไบต์)


11
ช่วงเวลานั้นเมื่อคำตอบของ Python คือ --- <s> กำลังต่อคอไปที่ </s> --- เอาชนะคำตอบของ Pyth
เครื่องมือเพิ่มประสิทธิภาพ

1
การใช้งาน bytestring นั้นมีความคิดสร้างสรรค์!
Winny

ฉันรู้สึกเหมือนมันควรจะเป็นไปได้ที่จะย้ำกว่าbโดยตรงกับแทนในขณะที่มีบางสิ่งบางอย่างเช่นfor for c in b"...":i+=n>0;n-=c
xnor

1
โอ้รอคุณต้องการค่าที่ถูกต้องในnการหยุดลงเช่นกัน ยังควรเป็นไปได้ด้วยสิ่งที่ชอบx=n>c;n-=c*x;i+=xแต่ไม่รู้ว่ามันคุ้มค่าหรือไม่
xnor

13

Piet 2125 ไบต์

มันไม่ได้สั้นที่สุด แต่สวยและมีสีสัน ...

แต่ละพิกเซลวางด้วยตนเองด้วยมือ หากต้องการเรียกใช้งานได้ที่นี่ใน FireFox (Chrome จะไม่ทำงาน) และโหลดด้วยความกว้างของ codel เท่ากับ 1 (มันจะปรากฏเป็นสีดำไม่ต้องกังวล) ป้อนหมายเลขแล้วกดปุ่มเรียกใช้!

โปรแกรมขนาดเล็ก: รุ่นเล็ก


ขยาย (ความกว้างของโมเดล 10): ป้อนคำอธิบายรูปภาพที่นี่


ไม่dead chexเพิ่มลงในจำนวนไบต์หรือไม่
Beta Decay

1
@Beta เพื่อความเป็นธรรมนับลาเป็นจริงขนาดของภาพที่มีขนาดเล็กบนดิสก์ดังนั้นโดยไม่คำนึงถึงการนับไบต์ได้รับการแก้ไข
DeadChex

12

Pyth 178 156 153 147 bytes

J?<Q22,_1"Qupu"?<Q39,21"Blinkorp"?<Q63,38"Paas"?<Q80,62"Karpasus"?<Q81,k"Floopdoor"?<Q109,80"Dumaflop"?<Q141,108"Lindilo",140"Fwup"?nhJkjd,-QhJeJeJ

Permalink

กอล์ฟที่สองที่เคยมีข้อเสนอแนะ Pyth ใด ๆ จะเป็นประโยชน์

คำอธิบาย

J                       (Auto)Assign J a tuple of the first day & month name
 ?<Q22,_1"Qupu"         Recall that Q auto-initialized to raw_input()
 ?<Q39,21"Blinkorp"     ? is ternary
 ?<Q63,38"Paas"         , is a two-pair tuple
 ?<Q80,62"Karpasus"
 ?<Q81,k"Floopdoor"     Special case handled by empty string as first day
 ?<Q109,80"Dumaflop"
 ?<Q141,108"Lindilo"
 ,140"Fwup"             Since input assumed valid, no need to test for Fwup
?nhJk                   Is day not an empty string?
jd,                     join on space
   -QhJ                 Q-(first day or -1 on first month) + 1
   eJ                   The month itself
eJ                      Else print only the month name on Floopdoor

คุณควรจะสามารถใช้การมอบหมายแบบอินไลน์เพื่อกำหนดเงื่อนไขทั้งหมดJ=...ให้อยู่ในเงื่อนไขที่สาม
Maltysen

7

CJam, 98 96 93 ไบต์

0000000: 72 69 63 22 00 16 27 3f 50 51 6d 8d d0 22 66 2d  ric"..'?PQm.."f-
0000010: 5f 7b 30 3c 7d 23 28 5f 40 3d 29 53 40 22 06 32  _{0<}#(_@=)S@".2
0000020: 88 b2 ce d2 87 2f 1e 79 62 1b 7a 11 53 a6 cc 02  ...../.yb.z.S...
0000030: 40 c5 c6 82 d0 dd b7 4b ed ee 1c dc 4f f5 ec 67  @......K....O..g
0000040: 22 32 35 35 62 32 33 62 27 61 66 2b 27 63 2f 3d  "255b23b'af+'c/=
0000050: 5f 2c 39 3d 7b 5c 3f 7d 26 28 65 75 5c           _,9={\?}&(eu\

ด้านบนเป็น hexdump แบบย้อนกลับได้เนื่องจากซอร์สโค้ดมีอักขระที่ไม่สามารถพิมพ์ได้

อักขระที่ไม่สามารถพิมพ์ได้ส่วนใหญ่จะไม่มีปัญหาสำหรับล่ามออนไลน์ แต่ไบต์ว่างในสตริงแรกคือตัวจัดการดีล

ที่ราคาหนึ่งไบต์เราสามารถแก้ไขได้โดยการเพิ่ม 1 ลงในอินพุตและ 1 ในแต่ละจุดรหัสของสตริงแรก คุณสามารถลองรุ่นนี้ในล่าม CJam

หากลิงก์ถาวรไม่ทำงานในเบราว์เซอร์ของคุณคุณสามารถคัดลอกโค้ดจากวางนี้

กรณีทดสอบ

$ LANG=en_US
$ xxd -ps -r > flooptonia.cjam <<< 726963220016273f50516d8dd022662d5f7b303c7d23285f403d29534022063288b2ced2872f1e79621b7a1153a6cc0240c5c682d0ddb74bedee1cdc4ff5ec6722323535623233622761662b27632f3d5f2c393d7b5c3f7d262865755c
$ wc -c flooptonia.cjam 
96 flooptonia.cjam
$ for d in 0 32 62 77 80 99 128 207; do cjam flooptonia.cjam <<< $d; echo; done
1 Qupu
11 Blinkorp
24 Paas
15 Karpasus
Floopdoor
19 Dumaflop
20 Lindilo
67 Fwup

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

ric     e# Read a Long from STDIN and cast to Character.
"…"     e# Push the string that corresponds to [0 22 39 63 80 81 109 141 208].
f-      e# Subtract each character from the input char.
        e# Character Character - -> Long
_{0<}#  e# Find the index of the first negative integer.
(_      e# Subtract 1 from the index and push a copy.
@=)     e# Select the last non-negative integer from the array and add 1.
S@      e# Push a space and rotate the decremented index on top of it.
"…"     e# Push a string that encodes the months' names.
255b23b e# Convert from base 255 to 23.
'af+    e# Add the resulting digits to the character 'a'.
'c/     e# Split at occurrences of 'c' (used as separator).
=       e# Select the chunk that corresponds to the index.
_,9=    e# Check if its length is 9 (Floopdoor).
{\?}&   e# If so, swap and execute ternary if.
        e# Since the string " " is truthy, S Month Day ? -> Month.
(eu\    e# Shift out the first char, convert it to uppercase and swap.

5

SWI-Prolog, 237 232 213 ไบต์

a(X):-L=[22:"Qupu",39:"Blinkorp",63:"Paas",80:"Karpasus",81:"Floopdoor",109:"Dumaflop",141:"Lindilo",208:"Fwup"],nth1(I,L,A:B),X<A,J is I-1,(nth1(J,L,Z:_),Y=X-Z;Y=X),R is Y+1,(X=80,write(B);writef("%w %w",[R,B])).

ที่นี่เราใช้กลไก backtracking อารัมภบทของซ้ำไปซ้ำมาใช้nth1/3ในรายการLที่จะได้รับองค์ประกอบแรกLastDay+1:MonthNameของLที่X < LastDay+1ถือ จากนั้นเราจะค้นหาเดือนก่อนหน้าสิ่งนี้ในรายการเพื่อประเมินวันของเดือน


5

Q, 134 146 Bytes

โปรแกรมที่สอง (146 ไบต์)

v:bin[l:0 22 39 63 80 81 109 141 208;x:(*)"I"$.z.x];1(,/)($)$[v=4;`;(1+x-l v)," "],`Qupu`Blinkorp`Paas`Karpasus`Floopdoor`Dumaflop`Lindilo`Fwup v;

ฟังก์ชันแรกตัด (134 ไบต์)

{v:bin[l:0 22 39 63 80 81 109 141 208;x];(,/)($)$[v=4;`;(1+x-l v)," "],`Qupu`Blinkorp`Paas`Karpasus`Floopdoor`Dumaflop`Lindilo`Fwup v}

การทดสอบ

q){v:bin[l:0 22 39 63 80 81 109 141 208;x];(,/)($)$[v=4;`;(1+x-l v)," "],`Qupu`Blinkorp`Paas`Karpasus`Floopdoor`Dumaflop`Lindilo`Fwup v} each 0 32 62 77 80 99 128 207
"1 Qupu"
"11 Blinkorp"
"24 Paas"
"15 Karpasus"
"Floopdoor"
"19 Dumaflop"
"20 Lindilo"
"67 Fwup"

คุณถูกต้อง - ฉันแก้ไขคำตอบที่จะทำให้มันเป็นโปรแกรมเต็มรูปแบบมากกว่าฟังก์ชั่นและอื่น ๆ ที่จะพิมพ์ที่ stdout w / o เครื่องหมายคำพูดตามกฎคำถาม
scottstein37

4

Julia, 231 216 184 175 ไบต์

r=readline()|>int
l=[141,109,81,80,63,39,22,0]
m=split("Qupu Blinkorp Paas Karpasus Floopdoor Dumaflop Lindilo Fwup")
i=findfirst(j->r>=j,l)
print(i==4?"":r-l[i]+1," ",m[9-i])

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


3

Swift 1.2, 256 bytes

var d=Process.arguments[1].toInt()!,f="Floopdoor",n=[("Qupu",22),("Blinkorp",17),("Paas",24),("Karpasus",17),(f,1),("Dumaflop",28),("Lindilo",32),("Fwup",67)]
for i in 0..<n.count{let m=n[i]
if d>=m.1{d-=m.1}else{println((m.0==f ?"":"\(d+1) ")+m.0)
break}}

ในการรันให้วางโค้ดเพียงอย่างเดียวใน.swiftไฟล์และรันโดยใช้swift <filename> <inputNumber>


3

Java, 357 339 ไบต์

มันไม่ได้มีประสิทธิภาพมากที่สุด แต่ฉันชอบวิธีการทำงาน มันสร้างปฏิทิน Flooptonia ทั้งหมดและค้นหาวันที่ที่เป็นตัวเลข

class X{public static void main(String[]q){String n[]={"Qupu","Blinkorp","Paas","Karpasus","Floopdoor","Dumaflop","Lindilo","Fwup"},l[]=new String[209];int m=0,d=0,i,b[]={0,22,39,63,80,81,109,141,208};for(i=0;i++<208;d++){l[i]=(m==4?"":d+" ")+n[m];if(i>b[m+1]){m++;d=0;}}System.out.print(l[new java.util.Scanner(System.in).nextInt()+2]);}}

Input / Output:

77 --> 15 Karpasus 80 --> Floopdoor

เว้นระยะและแท็บออก:

class X {
    public static void main(String[] q) {
        String n[] = { "Qupu", "Blinkorp", "Paas", "Karpasus", "Floopdoor", "Dumaflop", "Lindilo", "Fwup" },
          l[]=new String[209];
        int m = 0,
          d = 0,
          i,
          b[] = { 0, 22, 39, 63, 80, 81, 109, 141, 208 };
        for(i = 0; i++ < 208; d++) {
            l[i]=(m == 4 ? "" : d + " ") + n[m];
            if(i > b[m+1]){
                m++;
                d = 0;
            }
        }
        System.out.print(l[ new java.util.Scanner(System.in).nextInt() + 2 ]);
    }
}

1
ฉันขอท้าคุณ! ดูคำตอบของฉัน! =)
Luigi Cortese

3

ชวา 275 269 266 257 256 252 246 244 243 ไบต์

class X{public static void main(String[]w){int x=new Short(w[0]),i=1,a[]={-1,21,38,62,79,80,108,140,207};w="Qupu,Blinkorp,Paas,Karpasus,Floopdoor,Dumaflop,Lindilo,Fwup".split(",");while(x>a[i++]);System.out.print((i==6?"":x-a[i-=2]+" ")+w[i]);}}

จัดรูปแบบ:

class X {
    public static void main(String[] w) {
        int x = new Short(w[0]), 
            i = 1, 
            a[] = { -1, 21, 38, 62, 79, 80, 108, 140, 207 };
            w = "Qupu,Blinkorp,Paas,Karpasus,,Dumaflop,Lindilo,Fwup".split(",");
        while (x > a[i++]);
        System.out.print(i == 6 ? "Floopdoor" : x - a[i-=2] + " " + w[i]);
    }
}

น่าสนใจว่าสั้นกว่านี้สองสามไบต์

class X {
    public static void main(String[] w) {
        int x = new Short(w[0]);
        System.out.print(x < 22 ? x + 1 + " Qupu" : x < 39 ? x - 21
                + " Blinkorp" : x < 63 ? x - 38 + " Paas" : x < 80 ? x - 62
                + " Karpasus" : x < 81 ? "Floopdoor" : x < 109 ? x - 80
                + " Dumaflop" : x < 141 ? x - 108 + " Lindilo" : x < 208 ? x
                - 140 + " Fwup" : "");
    }
}

เล่นได้ดีมาก Luigi!
DeadChex

1
บันทึก 6 ไบต์ด้วย "new short (w [0])" แทน "Integer.valueOf (w [0])"
Olivia Trewin

@AndrewTrewin เคล็ดลับที่ดีขอบคุณ!
Luigi Cortese

3

JavaScript ใช้ ES6 171 164 163 ไบต์

ฉันไม่ใช่โปรแกรมเมอร์ JavaScript ที่ดีที่สุด แต่ฉันพยายามอย่างดีที่สุดและจบลงด้วยรหัสต่อไปนี้

f=(n)=>[0,22,39,63,80,81,109,141,208].some((e,j,a)=>n<a[j+1]&&(r=(j-4?n-e+1+' ':'')+"Qupu0Blinkorp0Paas0Karpasus0Floopdoor0Dumaflop0Lindilo0Fwup".split(0)[j]))&&r;

หากต้องการดูผลลัพธ์คุณจะต้องอ้างอิงโค้ดด้านบนในไฟล์ html และใช้รหัสที่คล้ายกับด้านล่าง

<html><body><p id="o"></p><script src="Fp.js"></script><script>t=[0,32,62,77,80,99,128,207];for(i=0;i<t.length;i++)document.getElementById('o').innerHTML+=f(t[i])+'<br/>';</script></body></html>

ในรหัสข้างต้น fp.js เป็นไฟล์ที่มีรหัสจาวาสคริปต์

รวม HTML และรหัส JavaScript กับเยื้องคือ

        f=(n)=>[0,22,39,63,80,81,109,141,208].some(
          (e,j,a)=>n<a[j+1]&&(r=(j-4?n-e+1+' ':'')+"Qupu0Blinkorp0Paas0Karpasus0Floopdoor0Dumaflop0Lindilo0Fwup".split(0)[j]))
        &&r;
        
        
        t = [0, 32, 62, 77, 80, 99, 128, 207];
        for (i = 0; i < t.length; i++) 
            document.getElementById('o').innerHTML += f(t[i]) + '<br/>';

    
<html>
<body>
    <p id="o"></p>    
</body>
</html>

แก้ไข:

ฉันอยากจะขอบคุณวิหารที่ช่วยฉันลบข้อความสั่งคืนและลดรหัสของฉันลง 17 ไบต์

@ipi ขอบคุณที่ช่วยฉันประหยัด 7 ไบต์

หมายเหตุ: คุณสามารถเห็นผลลัพธ์เฉพาะในเบราว์เซอร์ Firefox เวอร์ชัน 22+ และ Google Chrome 45+ เนื่องจากการใช้ฟังก์ชั่นลูกศร ES6


@ vihan1086 ขอบคุณสำหรับคำแนะนำของคุณ
Anandaraj

ฉันไม่สามารถเข้าถึงเบราว์เซอร์ที่มีการสนับสนุนสัญลักษณ์ลูกศรได้ในขณะนี้ (ดังนั้นฉันจึงยังไม่ได้ทดสอบ) แต่คุณควรจะสามารถแทนที่อาเรย์เดือนของคุณด้วย"Qupu0Blinkorp0Paas0Karpasus0Floopdoor0Dumaflop0Lindilo0Fwup".split(0)และประหยัดได้ 7 ไบต์
Sean Latham

ขอบคุณ ipi ฉันแยกด้วยช่องว่าง แต่ศูนย์ช่วยฉันสองไบต์! You must write a complete programฉันคิดว่านี่ต้องทำงานคนเดียวคุณอาจต้องใช้บางสิ่งบางอย่างเช่นพรอมต์ ()
Vartan

@ipi ขอบคุณสำหรับความคิดเห็นของคุณ
Anandaraj

@Vartan ขอบคุณคำตอบของคุณฉันบันทึก 1 ไบต์
Anandaraj

2

Python 2, 168 ไบต์

n=input();e=[-1,21,38,62,80,108,140,207];m=1
while n>e[m]:m+=1
print[`n-e[m-1]`+' '+'Qupu Blinkorp Paas Karpasus Dumaflop Lindilo Fwup'.split()[m-1],'Floopdoor'][n==80]

สิ่งนี้ถือเป็นวัน80ภายใน18 Karpasusแต่ก็ไม่สนใจมันเมื่อถูกเรียกให้พิมพ์ นอกจากนี้input()ฟังก์ชั่นของ Python 2 (ตรงข้ามกับraw_input()) ก็สะดวกที่นี่


2

Perl 5, 140

ต้องทำงานผ่านperl -E:

$i=<>+1;$i-=$b=(22,17,24,17,1,28,32,67)[$c++]while$i>0;say$b>1&&$i+$b.$",(x,Qupu,Blinkorp,Paas,Karpasus,Floopdoor,Dumaflop,Lindilo,Fwup)[$c]

ผลการทดสอบ (รหัสทดสอบที่ถูกขโมยจาก @Dennis):

$for d in 0 32 62 77 80 99 128 207; do perl -E '$i=<>+1;$i-=$b=(22,17,24,17,1,28,32,67)[$c++]while$i>0;say$b>1&&$i+$b.$",(x,Qupu,Blinkorp,Paas,Karpasus,Floopdoor,Dumaflop,Lindilo,Fwup)[$c]' <<< $d; echo; done
1 Qupu

11 Blinkorp

24 Paas

15 Karpasus

Floopdoor

19 Dumaflop

20 Lindilo

67 Fwup

2

Haskell, 171 167 ไบต์

main=interact$f.read
f 80="Floopdoor"
f n=(g=<<zip[22,17,24,18,28,32,67](words"Qupu Blinkorp Paas Karpasus Dumaflop Lindilo Fwup"))!!n
g(n,s)=map((++' ':s).show)[1..n]

โปรแกรมอ่านอินพุตจาก stdin ซึ่งต้องไม่ลงท้ายด้วย NL ยุติการป้อนข้อมูลด้วย EOF / ^ D echo -n 80 | ./what-day-is-itหรือการใช้งานบางอย่างเช่น (บางคนechoไม่เข้าใจ-nสวิตช์และไม่ใช้ NL ตามค่าเริ่มต้น)

วิธีการทำงาน: mainฟังก์ชั่นอ่านอินพุท, แปลงมันเป็นIntegerและการโทรfซึ่งจะส่งกลับตัวอักษรFloopdoorในกรณีที่มีการป้อนข้อมูลของ80หรือสร้างรายการวันที่เป็นไปได้ทั้งหมดคือ["1 Qupu", "2 Qupu", ... "1 Blinkorp", ... "67 Fwup"]จากที่มันเลือกnองค์ประกอบที่ ฉันทำKarpasusนานกว่าหนึ่งวัน 18 Karpasusอยู่ในตำแหน่ง80และแก้ไขสิ่งที่ขาดหายไปFloopdoorในรายการ

แก้ไข: @MtnViewMark มีความคิดของ18 Karpasusเคล็ดลับและบันทึก 4 ไบต์


ฉันคิดว่าคุณสามารถบันทึกได้ 4 ไบต์ด้วยการแกล้ง Karpasus นาน 18 วันการถอด,1และ `x '- เนื่องจาก 80 จะถูกจับโดยการจับคู่รูปแบบสำหรับมัน
MtnViewMark

@MtnViewMark: ฉลาดมาก ขอบคุณมาก.
nimi

1

Swift 2.0, 220 bytes

ไม่มีอะไรที่ฉลาดเพียงกรองจากชุดของ tuples ...

func d(n:Int)->String{return n==80 ?"Floopdoor":[("Qupu",21,0),("Blinkorp",38,22),("Paas",62,39),("Karpasus",79,63),("Dumaflop",108,81),("Lindilo",140,109),("Fwup",208,141)].filter{$0.1>=n}.map{"\($0.0) \(n-$0.2+1)"}[0]}

แก้ไขเพื่อแก้ไขข้อผิดพลาดลบช่องว่าง


5
"คุณต้องเขียนโปรแกรมทั้งหมด" ดังนั้นมันจึงไม่ใช่ฟังก์ชั่น
Alex A.

1

JavaScript (ES6 บน Node.js), 196 ไบต์

รับอาร์กิวเมนต์บรรทัดคำสั่งหนึ่งรายการ:

a=+process.argv[2];for(d of['22Qupu','17Blinkorp','24Paas','17Karpasus','01Floopdoor','28Dumaflop','32Lindilo','67Fwup']){if(a<(z=parseInt(d)))return console.log((z>1?a+1+' ':'')+d.slice(2));a-=z}

การสาธิต

เนื่องจากไม่มีอาร์กิวเมนต์บรรทัดคำสั่ง ( process.argv) ในเบราว์เซอร์โค้ดในตัวอย่างจึงถูกวางไว้ในฟังก์ชันที่รับอาร์กิวเมนต์:

// Snippet stuff
console.log = function(x){O.innerHTML += x + '\n'};

// Flooptonia function
function flooptonia(a) {
  a = +a;
  for (d in y=['22Qupu', '17Blinkorp', '24Paas', '17Karpasus', '01Floopdoor', '28Dumaflop', '32Lindilo', '67Fwup']) {
    if (a < (z = parseInt(y[d]))) return console.log((z > 1 ? a + 1 + ' ' : '') + y[d].slice(2));
    a -= z
  }
}

// Test
['0', '32', '62', '77', '80', '99', '128', '207'].map(flooptonia);
Test values: [0, 32, 62, 77, 80, 99, 128, 207]

<pre id=O></pre>


1

Swift 2.0, 215 204

let(n,t)=(Int(readLine()!)!,[(141,"Fwup"),(109,"Lindilo"),(81,"Dumaflop"),(63,"Karpasus"),(39,"Paas"),(22,"Blinkorp"),(0,"Qupu")])
print({(n==80 ?"Floopdoor":"\(n-$0.0+1) "+$0.1)}(t[t.indexOf{$0.0<=n}!]))

นี่เป็นโปรแกรมเต็มรูปแบบที่ขอให้ผู้ใช้ป้อนหมายเลขใน STDIN


1

Matlab, 187 ไบต์

d=input('');l=[141 109 81 80 63 39 22 0];t=find(d>=l,1);m=strsplit('Fwup Lindilo Dumaflop Floopdoor Karpasus Paas Blinkorp Qupu');f='%d %s';if t==4;f='%d\b%s';end;fprintf(f,d-l(t)+1,m{t})

รุ่นขยาย:

d=input('');
l=[141 109 81 80 63 39 22 0];
t=find(d>=l,1);
m=strsplit('Fwup Lindilo Dumaflop Floopdoor Karpasus Paas Blinkorp Qupu');
f='%d %s';
if t==4;
    f='%d\b%s';
end
fprintf(f,d-l(t)+1,m{t})

อ่านบรรทัดจากคอนโซล ( stdin) ค้นหาองค์ประกอบแรกของรายการย้อนกลับของวันเริ่มต้นเดือนที่อินพุตมีค่ามากกว่าหรือเท่ากับองค์ประกอบอาร์เรย์จากนั้นพิมพ์ตามนั้น

นี่เกือบจะเหมือนกับJuliaคำตอบยกเว้นในขั้นตอนการแสดงผล ( เราไม่สามารถเอาชนะผู้ประกอบการที่สามไม่สามารถใช้งานได้ใน Matlab ) ในการทำให้ต้องมีifคำสั่งอย่างชัดเจนเราใช้เคล็ดลับเล็ก ๆ ( Backspaceตัวละครในรูปแบบการพิมพ์) เพื่อ "ลบ" หมายเลข 1 สำหรับวัน / เดือนพิเศษFloopdoor


ในความร่วมมือกับผู้เข้าร่วมการแชทMatlab และ Octave


1

Javascript ES5 ใช้ 168 ไบต์

m=[-1,21,38,62,79,80,108,140];for(n=prompt(i=0);n>m[i+1]&&i++<8;);alert((i-4?n-m[i]+" ":"")+"Qupu0Blinkorp0Paas0Karpasus0Floopdoor0Dumaflop0Lindilo0Fwup".split(0)[i])

Ungolfed:

m=[-1,21,38,62,79,80,108,140];   // create range of starting indexes - 1

for(                             // begin for loop
  n=prompt(i=0);                 // initialize i to zero and prompt user
  n>m[i+1] && i++ < 8;           // exit if n>0; increment i; exit if i was < 8
  );                             // end for loop

alert(
  (i-4 ? n-m[i]+" ":"") + // special floopdoor case
  "Qupu0Blinkorp0Paas0Karpasus0Floopdoor0Dumaflop0Lindilo0Fwup".split(0)[i]);

  //^  create an array of strings by splitting at zero. Then, select element i

0

C, 241 ไบต์

ไม่มีอะไรน่าตื่นเต้นเกินไป อาจโกนได้ 27 ไบต์หากต้องการโปรแกรมที่สมบูรณ์

main(c,s)char**s;{c=atoi(s[1]);c-80?printf("%d ",c<22?c+1:c<39?c-21:c<63?c-38:c<80?c-62:c<109?c-80:c<141?c-108:c-140):0;puts(c<22?"Qupu":c<39?"Blinkorp":c<63?"Paas":c<80?"Karpasus":c<81?"Floopdoor":c<109?"Dumaflop":c<141?"Lindilo":"Fwup");}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.