ลิฟท์โรงแรมไสยศาสตร์


54

ลักษณะ

นี่คือลิฟต์โรงแรมที่มีความเชื่อโชคลางมากในเซี่ยงไฮ้:

               ป้อนคำอธิบายรูปภาพที่นี่

หลีกเลี่ยงหมายเลข 13 เพราะสิบสามคนโชคร้ายในโลกตะวันตกและหลีกเลี่ยงตัวเลข 4 เพราะสี่คนโชคร้ายในภูมิภาคเอเชีย เกิดอะไรขึ้นถ้าโรงแรมนี้สูงขึ้น

อ่านเลขจำนวนเต็มบวกnจาก STDIN แทนจำนวนชั้นและพิมพ์ว่าเค้าโครงปุ่มมีลักษณะเป็นอย่างไร: -1ตามด้วยn-1จำนวนเต็มบวกถัดไปที่ไม่เท่ากับ 13 และไม่มีตัวเลข 4 จัดเรียงสิ่งเหล่านี้ ตัวเลขในสองคอลัมน์เช่นในภาพด้านบน: พิมพ์หมายเลขสองชั้นต่อบรรทัดคั่นด้วยแท็บแนวนอนเพื่อให้การอ่านบรรทัดในลำดับย้อนกลับจากซ้ายไปขวาให้ลำดับในการเรียงลำดับ (คุณอาจพิมพ์อักขระขึ้นบรรทัดใหม่ที่ต่อท้ายด้วยก็ได้)

กรณีทดสอบ

สำหรับอินพุต14เอาต์พุตควรเป็นดังในภาพด้านบน:

15  16
11  12
9   10
7   8
5   6
2   3
-1  1

โดยที่ช่องว่างในแต่ละบรรทัดเป็นอักขระแท็บแนวนอนเดียว

สำหรับการป้อนข้อมูลที่คุณควรพิมพ์2-1 1

สำหรับอินพุต100คุณควรพิมพ์:

120 121
118 119
116 117
113 115
111 112
109 110
107 108
105 106
102 103
100 101
98  99
96  97
93  95
91  92
89  90
87  88
85  86
82  83
80  81
78  79
76  77
73  75
71  72
69  70
67  68
65  66
62  63
60  61
58  59
56  57
53  55
51  52
39  50
37  38
35  36
32  33
30  31
28  29
26  27
23  25
21  22
19  20
17  18
15  16
11  12
9   10
7   8
5   6
2   3
-1  1

เป้าหมาย

นี่คือรหัสกอล์ฟคำตอบที่สั้นที่สุดในการชนะไบต์


2
@Mauris 6138 อาจจะไม่ใช่ แต่ 113? ฉันคิดว่ากุญแจสำคัญคือคุณจะพูดว่า "สิบสาม" เมื่อคุณอ่านตัวเลขออกมาดัง ๆ
Random832

12
@ Random832 สิ่งที่คุณแนะนำคือการเปลี่ยนแปลงข้อกำหนดอย่างมีประสิทธิภาพ มารยาท PPCG ไม่สนับสนุนการเปลี่ยนแปลงดังกล่าวหลังจากได้รับคำตอบโดยเฉพาะอย่างยิ่งหากคำตอบที่มีอยู่ถูกยกเลิกอย่างมีประสิทธิภาพซึ่งพวกเขาจะเป็นในกรณีนี้
Digital Trauma

8
FWIW 4 โชคไม่ดี 4 ฟังดูคล้ายกับ "ตาย" หรือ "ตาย" ในภาษา / ภาษาจีนต่างๆ
slebetman

10
@slebetman: ใช่แล้วนั่นคือเหตุผลที่ 4 โชคไม่ดี มันยังคงเป็นความเชื่อโชคลาง แต่นั่นเป็นเรื่องเล็กน้อย
ลินน์ม

13
รอ! นับจำนวนปุ่มที่ฉันเห็นว่าโรงแรมมีทั้งหมด 13 ชั้น (ไม่รวมชั้นใต้ดิน) ไม่มีทางที่ฉันจะอยู่ที่ นั่น!
ระดับแม่น้ำ St

คำตอบ:


8

Pyth, 27 ไบต์

jjLC9_c+_1.f&!@\4`ZnZ13tQ)2

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

รับค่าหมายเลข.first Q-1ที่ตรงกับตัวกรอง!=13และ4ไม่ได้อยู่ในการแทนค่าสตริงของตัวเลข จากนั้นจะเป็นการเตรียมการ-1สับครึ่งแบ่งแต่ละรายการด้วยแท็บ ( C9) และเชื่อมต่อด้วยการขึ้นบรรทัดใหม่


19

Bash + utils ทั่วไป, 51

seq 9$1|sed 13d\;/4/d\;1i-1|rs 0 2|sed $[$1/2]q|tac
  • seq สร้างจำนวนเต็มน้อยไปหามากจาก 1 ถึง N ด้วยตัวเลข 9 หลักที่ด้านหน้า - เพียงพอสำหรับอินพุตจำนวนเต็ม 64 บิต
  • sedกรองพื้นและส่วนแทรกที่ไม่มีโชค-1ก่อนบรรทัด 1
  • rs ปรับรูปร่างเป็นสองคอลัมน์ที่คั่นด้วยแท็บ
  • sed หยุดหลังจากบรรทัด N / 2
  • tac กลับคำสั่งสายออก

ฉันสามารถโกน 5 ไบต์ให้คุณ - แทนที่sed $[$1/2]qหลังจากrsด้วยsed $1qก่อนหน้านี้ ฉันคิดว่ามันทำให้ POSIX-shell เข้ากันได้เช่นกัน
Toby Speight

1
ในที่สุดก่อนหน้านี้1จะไม่เพียงพอที่จะชดเชยการส่งผ่านเพียง 0.9 ^ n ของอินพุตผ่าน (ตัวเลขที่ไม่ประกอบด้วย4sparser และ sparser เมื่อจำนวนหลักเพิ่มขึ้น) แต่เมื่อคุณมีมากกว่าสองร้อยล้านชั้นในโรงแรมของคุณคุณอาจมีปัญหาอื่น ๆ เช่นทำให้ระบบประปาทำงานได้ดี
Toby Speight

@TobySpeight คุณอาจมีลิฟต์อวกาศด้วยเช่นกัน :)
บาดเจ็บทางดิจิตอล

@TobySpeight ถึงแม้จะมีจำนวนเต็มสูงสุด 64 บิตเป็น input (9223372036854775807) เพียง prefixing 1 คือ (ประมาณ) เพียงพอ - อย่างน้อยกับพื้นฐานการคำนวณพื้นฐาน 9 ของฉัน ส่วนที่เหลือของคำตอบจะถูก จำกัด อยู่ที่ช่วงนี้เนื่องจากเชลล์$[]เลขคณิต ฉันคิดว่านี่เป็นข้อ จำกัด ที่สมเหตุสมผลในกรณีที่ไม่มีการพูดถึงความแม่นยำทางคณิตศาสตร์โดยพลการในคำถาม ไม่ว่าตอนนี้ฉันจะใส่คำนำหน้า9แทน 1เพื่อให้ปลอดภัย
บาดเจ็บทางดิจิตอล

10

JavaScript ES6, 236 234 233 210 195 188 ไบต์

บันทึกทั้งกลุ่ม 'ขอบคุณไบต์สำหรับเราและเพื่อน ๆ !

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

z=prompt(i=x=0,l=[]);y=(function*(){while(i<z-x)yield(i?(/4/.test(i)||i==13?--x&&".":i):-1)+(0*++i)})();while(a=y.next().value)+a&&l.push(a);l.join`    `.match(/-?\d+  \d+/g).reverse().join`
`

z=+prompt(i=x=0,l=[]);==> z=prompt(i=x=0,l=[]);(-1 ไบต์)
usandfriends

@usandfriends ขอบคุณ! ฉันลืมเกี่ยวกับการแปลงประเภทอัตโนมัติ
Conor O'Brien

.joinด้วยแท็บและแทนที่ช่องว่าง/-?\d+ \d+/gด้วยแท็บลบ.map(x=>x.replace(/ /,"\t"))(ควรบันทึก 23 ไบต์)
usandfriends

1
.filter(x=>x!=".0")==> .filter(x=>+x), (-5 ไบต์)
usandfriends

2
^ ข่วนว่าเพียงแค่ลบ.filter(..)ส่วนทั้งหมด! ลองl.push(a);==> +a&&l.push(a);(-15 bytes)
usandfriends

7

C, 282 ไบต์

int main(int r,char*v[]){int c=atoi(v[1]),a[c],b,E=1E9,g,i,t,o=t=g=(E)-2;while(i++<c){while(t>0){r=t%10;t=t/10;if(r==4||g==(E)+13||g<=o||g==E)t=++g;}a[i-1]=o=t=g;}for(c-=3;c>=0;c-=2){printf("%d\t",a[c+1]-E);printf("%d\n",a[c+2]-E);}printf("%d\t",a[0]-E);if(i%2)printf("%d",a[1]-E);}

ฟอร์แมตแล้ว:

int main ( int r , char * v[] ) {
    int c = atoi ( v[ 1 ] ) , a[c] , b , E = 1E9 , g , i , t , o = t = g = ( E ) - 2;
    while ( i ++ < c ) {
        while ( t > 0 ) {
            r = t % 10;
            t = t / 10;
            if ( r == 4 || g == ( E ) + 13 || g <= o || g == E )t = ++ g;
        }
        a[ i - 1 ] = o = t = g;
    }
    for ( c -= 3 ; c >= 0 ; c -= 2 ) {
        printf ( "%d\t" , a[ c + 1 ] - E );
        printf ( "%d\n" , a[ c + 2 ] - E );
    }
    printf ( "%d\t" , a[ 0 ] - E );
    if ( i % 2 )printf ( "%d" , a[ 1 ] - E );
}

คุณสมบัติ:

สามารถคำนวณได้มากถึง 2095,984 ชั้นหากแต่ละชั้น19.5mสูง (รวมถึงเพดาน) อาคารนี้มีความยาวพอที่จะพันรอบเส้นศูนย์สูตรได้! 2095984*19.5=40871688m=~40000km=one 'lap' around the planet.


1
คำตอบที่ดี แต่ภูมิศาสตร์ของคุณค่อนข้างดี ระยะทางจากเส้นศูนย์สูตรไปยังขั้วโลกเหนือคือ 10,000 กม. ตามคำจำกัดความen.wikipedia.org/wiki/Metreซึ่งหมายถึงเส้นรอบวงของเส้นศูนย์สูตรนั้นยาวกว่า 40000 กม. เล็กน้อย
Level River St

1
แสดงความคิดเห็นดี แต่นิยามมิเตอร์ของคุณล้าสมัยไปแล้ว ;-)
murphy

@ สตีฟเวอร์ริลล์ฉันใช้หมายเลขแรกที่ฉันลงจาก google ฉันจะอัปเดตการคำนวณ
x13

คุณสามารถบันทึกไม่กี่ไบต์โดยวาง "int" จากหลัก การจัดฟันรอบ E เป็นสิ่งที่จำเป็นจริงๆหรือไม่? ก่อนอื่นwhileสามารถแปลงเป็นforและสิ่งนี้ช่วยให้คุณวางวงเล็บปีกกาบางอย่าง เป็นไบต์สั้นกว่าt/=10 t=t/10เพิ่ม 1 ถึงคในตัวคุณforห่วงที่จะบันทึกไบต์คู่ -> a[c+1]กลายเป็นa[c]ในขณะที่ตัวเลขอื่น ๆ ทุกคนมีระยะเวลาเดียวกัน ฉันจะรวมสองprintfs ในห่วงเข้าด้วยกันและลดเครื่องหมายปีกกาอีกครั้ง
aragaer

ฉันคิดว่าความหมายของคุณเกี่ยวกับ "ความสูงของพื้น" อาจจะลดลงเล็กน้อย - พื้นทั่วไปสูงประมาณ 3 เมตรไม่สูง 19.5 เมตร
nneonneo

6

จูเลีย, 134 132 ไบต์

x=[-1;filter(i->i!=13&&'4'"$i",1:2(n=parse(readline())))][1:n]
for i=2:2:endof(x) println(join((r=reverse)(r(x)[i-1:i]),"  "))end

ช่องว่างที่ตลกนั่นมีแท็บตัวอักษร ในฐานะที่เป็น Conor \tโอไบรอันตั้งข้อสังเกตนี้เป็นไบต์สั้นกว่าการทำ

Ungolfed:

# Read an integer from STDIN
n = parse(readline())

# Generate all numbers from 1 to 2n, exclude 0, 13, and all numbers containing 4,
# prepend -1, then take the first n
x = [-1; filter(i -> i != 13 && '4'  "$i", 1:2n)][1:n]

# Loop over pairs, print tab-separated
for i = 2:2:endof(x)
    println(join(reverse(reverse(x)[i-1:i]), "  "))
end

6

Python 2, 120 110 bytes

N=input()
n=['-1']+[`i`for i in range(N*2)if i!=13and'4'not in`i`][1:N]
while n:x=n.pop();print n.pop()+'\t'+x

ฉันคิดว่าคุณสามารถใช้i-13แทนi!=13
12Me21

6

JavaScript, 116 122

แก้ไขที่บันทึกไว้ 6 ไบต์ thx @Neil

Simple array solution - ไม่ได้ใช้ ES6

ลองกับเบราว์เซอร์ใดก็ได้

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

n=prompt();for(r=[-1],v=1;n;v++)v!=13&!/4/.test(v)&&--n&&r.push(v);for(;r[0];)console.log(a=r.pop(b=r.pop())+'\t'+b)
<pre id=O></pre>


คุณสามารถบันทึก 6 !/4/.test(v)ไบต์โดยใช้
Neil

คุณสามารถประหยัด byte เดียวกับ' 'แทน'\t'(แท็บตัวอักษร)
Mwr247

6

Python 2 , 94 ไบต์

n=input();c=-1;s=''
while n:
 if('4'in`c`)==0!=c!=13:n-=1;s=(n%2*'%d	%%d\n'+s)%c
 c+=1
print s

ลองออนไลน์!

มีอักขระแท็บในสตริงที่ SE ไม่แสดงผล (ขอบคุณ Sp3000 สำหรับการแนะนำให้ใช้และบันทึกไบต์)

ทดสอบพื้นcตั้งแต่พื้น-1จนถึงโควต้าnถึง สำหรับแต่ละชั้นทดสอบว่ามันไม่ได้มี4มิได้เท่ากับหรือ0 13ถ้าเป็นเช่นนั้นมัน prepends สตริงลิฟท์sและ decrements nโควต้า

เคล็ดลับที่มีการจัดรูปแบบสตริงใช้เพื่อให้ได้สองชั้นต่อคอลัมน์เพื่อให้ปรากฏในลำดับที่ถูกต้องเมื่อเติมไว้ แต่ละบรรทัดใหม่ถูกจัดเตรียมไว้'%d\t%%d\n'เพื่อให้เมื่อมีการทดแทนสองชั้นตามลำดับบรรทัดแรกจะอยู่ทางซ้ายและบรรทัดที่สองอยู่ทางขวา ตัวอย่างเช่น,

('%d\t%%d\n'%2)%3 == ('2\t%d\n')%3 == '2\t3\n'  

พริตตี้เย็น แต่ก็จริง96 ไบต์ อาจลบเครื่องหมายจุลภาคต่อท้ายหรือไม่
movatica

2
@movatica จับคอมม่าที่ต่อท้ายได้ดีเนื่องจากความท้าทายระบุ newline ที่ตามมาคือ OK ความแตกต่างที่ 1 ไบต์เป็นเพราะรหัสบล็อก SE \tไม่สามารถแสดงแท็บดังนั้นฉันใส่ใน อาวันก่อนที่ TIO มีอยู่
xnor

5

C #, 296 ไบต์

namespace System.Collections.Generic{using Linq;class X{static void Main(){var a=new List<int>();var b=new List<int>();for(int i=int.Parse(Console.ReadLine()),j=-2;i>0;)if(++j!=13&&j!=0&&!(j+"").Contains("4"))(i--%2<1?a:b).Insert(0,j);Console.Write(string.Join("\n",a.Zip(b,(x,y)=>x+"\t"+y)));}}}

Ungolfed:

namespace System.Collections.Generic
{
    using Linq;
    class X
    {
        static void Main()
        {
            var a = new List<int>();
            var b = new List<int>();
            for (int i = int.Parse(Console.ReadLine()), j = -2; i > 0;)
                if (++j != 13 && j != 0 && !(j + "").Contains("4"))
                    (i-- % 2 < 1 ? a : b).Insert(0, j);
            Console.Write(string.Join("\n", a.Zip(b, (x, y) => x + "\t" + y)));
        }
    }
}

เทคนิคการตีกอล์ฟที่ใช้:

  • ฉัน (เคาน์เตอร์วิ่ง) และj (หมายเลขปัจจุบันภายใต้การพิจารณา) จะลดลง / เพิ่มขึ้นตามลำดับภายในการแสดงออกในร่างกายห่วงแทนคำสั่งสำหรับตามปกติ
  • j+"" แทน j.ToString()
  • วางทุกอย่างภายในnamespace System.Collections.Genericไม่เพียงเพื่อให้เราสามารถเข้าถึงList<T>แต่ยังใช้ namespace โดยปริยายSystemโดยไม่มีการรับรองเพิ่มเติม
  • วางusingข้างในเนมสเปซเพื่อให้เราสามารถเขียนusing Linq;แทนusing System.Linq;
  • .Insert(0,j)สั้นกว่าการใช้.Add(j)และการสมัครในภายหลัง.Reverse()

มันเป็นเรื่องที่โชคร้ายที่using Linq;มีความจำเป็นเพราะมันเป็นสิ่งจำเป็นเท่านั้น.Zipแต่เขียนมันเป็นLinq.Enumerable.Zip()อีกต่อไป


5

Ruby 2.3, 84 83 ตัวอักษร

(ตัวเลือกบรรทัดคำสั่งรหัส 82 อักขระ + 1 อักขระ)

puts (["-1",*?1..?1+$_].grep_v(/^13$|4/)[0..$_.to_i]*?\t).scan(/\S+\t\d+/).reverse

วิ่งตัวอย่าง:

bash-4.3$ ruby -ne 'puts (["-1",*?1..?1+$_].grep_v(/^13$|4/)[0..$_.to_i]*?\t).scan(/\S+\t\d+/).reverse' <<< '14'
15      16
11      12
9       10
7       8
5       6
2       3
-1      1

Ruby, 93 92 ตัวอักษร

(ตัวเลือกรหัส 91 ตัวอักษร + 1 ตัวเลือกบรรทัดคำสั่ง)

puts ([-1,*1..2*n=$_.to_i].reject{|i|i==13||i.to_s[?4]}[0..n]*?\t).scan(/\S+\t\d+/).reverse

วิ่งตัวอย่าง:

bash-4.3$ ruby -ne 'puts ([-1,*1..2*n=$_.to_i].reject{|i|i==13||i.to_s[?4]}[0..n]*?\t).scan(/\S+\t\d+/).reverse' <<< '14'
15      16
11      12
9       10
7       8
5       6
2       3
-1      1

4

Lua, 169 ไบต์

t={-1}i=1 repeat if(i..""):find("4")or i==13 then else table.insert(t,i)end i=i+1 until #t==arg[1] for i=#t%2==0 and#t-1 or#t,1,-2 do print(t[i],t[i+1]and t[i+1]or"")end

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


4

Mathematica, 105 ไบต์

StringRiffle[Reverse[Select[Range[2#]-2,#!=13&&#!=0&&DigitCount[#,10,4]<1&][[;;#]]~Partition~2],"
","\t"]&

แทนที่\tด้วยอักขระแท็บจริง


4

Brachylogขนาด 105 ไบต์

,Ll?,Lbb:1{h_.|[L:I]hhH,I+1=J((13;J:Zm4),L:J:1&.;Lb:J:1&:[J]c.)}:[1:-1]c{_|hJ,?bhw,[9:J]:"~c~w
"w,?bb:2&}

จะสั้นกว่านี้มากด้วยการสนับสนุน CLPFD ที่นี่ฉันต้องลองจำนวนเต็มซ้ำในภาคย่อยแรก

บรรทัดใหม่ก่อน"w,?bb:2&}จำเป็นต้องมีนี่คือบรรทัดใหม่ที่พิมพ์ระหว่างทุกแถว


ดี! คำถามหนึ่ง: ทำไมไม่คำนวณเลขจำนวนเต็มทั้งหมดใน Brachylog ใช้ข้อ จำกัด ของ CLP (FD) โดยอัตโนมัติ นี่จะเป็นส่วนขยายตรรกะตามธรรมชาติ
พรม

@mat เพราะฉันขี้เกียจและฉันก็ไม่ได้ แต่ฉันควร!
ทำให้เสียชีวิต

นั่นจะยอดเยี่ยม! Built-in ข้อ จำกัด CLP (FD) โดยนัยสำหรับเลขจำนวนเต็มทั้งหมด! ปูอนาคตของการเขียนโปรแกรมที่เปิดเผย! "และมันจะต้องมีความสุขสำหรับคุณที่จะสร้างความประทับใจให้กับมือนับพันปีเหมือนขี้ผึ้งความสุขที่จะเขียนถึงความประสงค์ของสหัสวรรษเหมือนทองสัมฤทธิ์ - ยากกว่าสีบรอนซ์สูงกว่าขุนนางบรอนซ์
พรม

@mat คุณสามารถเข้าร่วมฉันในห้องสนทนานี้เพื่อหารือเรื่องนี้ได้หรือไม่? ฉันต้องการคำแนะนำจากบางคนที่มีประสบการณ์กับ Prolog มากกว่าฉันอย่างเห็นได้ชัด
ทำให้เสียชีวิต

3

C #, 277 343

using System;using System.Collections.Generic;static void f(int v){List<int>a=new List<int>();List<int>b=new List<int>();int s=1;for(int i=-1;i<v-1;i++){if(i==13||i.ToString().Contains("4")||i==0){ v++;continue;}if(s==1){s=2;a.Add(i);}else{s=1;b.Add(i);}}a.Reverse();b.Reverse();int l=0;foreach(int y in a){Console.WriteLine(y+" "+b[l]);l++;}}

นี่เป็นฟังก์ชั่นเท่านั้น ฉันใหม่กับ C # เพิ่มขึ้นเพื่อให้ถูกต้องสำหรับ 40-49 และรวมถึงusings

Ungolfed เป็นโปรแกรมที่ทำงานสมบูรณ์:

using System;
using System.Collections.Generic;

class P {
    static void Main()
    {
        List<int> a = new List<int>();
        List<int> b = new List<int>();
        int v = Int32.Parse(Console.ReadLine());
        int s = 1;
        for (int i = -1; i < v - 1; i++)
        {
            if (i == 13 || i.ToString().Contains("4") || i == 0)
            {
                v++;
                continue;
            }
            if (s == 1)
            {
                s = 2;
                a.Add(i);
            }
            else {
                s = 1;
                b.Add(i);
            }
        }
        a.Reverse();
        b.Reverse();
        int l = 0;
        foreach (int y in a)
        {
            Console.WriteLine(y + " " + b[l]);
            l++;
        }
        Console.ReadLine();
    }
}

อธิบาย

ฉันสร้างรายการสองรายการและสลับกันระหว่างการกดไปที่รายการย้อนกลับวนรอบรายการหนึ่งและคว้ารายการอื่นด้วยดัชนี


ฉันไม่ค่อยรู้อะไรเกี่ยวกับ C # แต่คุณไม่สามารถแทนที่if(s==1)ด้วยif(s)(cast อัตโนมัติจาก int เป็นบูลีน?)
Fatalize

ไม่ได้เพราะอย่างอื่นมีไว้เพื่อ s == 2 แม้ว่าฉันจะทำให้ค่าสถานะเป็น 0 และ 1 แทน 1 และ 2 ฉันจะลองดู
Goose

3

Python 3, 155 ไบต์

ฉันคิดว่าการฟังการย้อนกลับและการซิปตัวกำเนิดเลขพื้นs()อาจจะฉลาดเกินไปสำหรับตัวของมันเอง แต่คนอื่นทำทางเลือกอื่นแล้ว (popping สองรายการพร้อมกัน) ไม่พูดถึงการใช้ Python 2 ซึ่งช่วยประหยัดไบต์ ในประเด็นสำคัญบางประการ

def s(m,n=-1):
 while m:
  if not(n in(0,13)or'4'in str(n)):yield n;m-=1
  n+=1
*f,=s(int(input()))
g=iter(f[::-1])
h=zip(g,g)
for a,b in h:print(b,'\t',a)

ทางเลือกที่สั้นกว่า แต่ทำดีกว่าจะใช้เวลา 140 ไบต์

def s(m,n=-1):
 while m:
  if not(n in(0,13)or'4'in str(n)):yield n;m-=1
  n+=1
*f,=s(int(input()))
while f:a=f.pop();print(f.pop(),'\t',a)

สำหรับทางเลือกที่สอง(0!=n!=13)!=('4'in str(n))คือ 5 not(n in(0,13)or'4'in str(n))ไบต์สั้นกว่า
movatica

3

Japt, 42 ไบต์

JoU*2 k0 kD f@!Xs f4} ¯U ã f@Yv} w ®q'    } ·

ช่องว่างทั้งสี่ควรเป็นอักขระแท็บที่แท้จริง ลองออนไลน์!

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

          // Implicit: U = input integer, D = 13
JoU*2     // Create the range of integers [-1,U*2).
k0 kD     // Remove 0 and 13.
f@!Xs f4} // Filter out the items X where X.toString().match(/4/g) is not null, i.e. the numbers that contain a 4.
¯U ã      // Slice to the first U items, and generate all adjacent pairs of items.
f@Yv}     // Filter out the items where the index Y is odd. This discards every other pair.
w         // Reverse.
®q'\t}    // Join each item with tabs.
·         // Join the whole list with newlines.
          // Implicit: output last expression

3

Lua, 141 ไบต์

n,s=1,'-1 1'function g()repeat n=n+1 until s.find(n,4)==z and n~=13 return n end for i=4,io.read(),2 do s=g()..' '..g().."\n"..s end print(s)

Ungolfed

n,s = 1,'-1'1' --n is the current floor number, S is the string to be printed
function g() --This function raises n to the next valid floor
    repeat --Same as while loop except it runs the following block before checking the expression
        n = n + 1 --Self-explanatory, increases n by one
    until --Checks the expression, if it is true, it breaks out of the loop
        s.find(n,4) == z --[[Strings have a member :find(X) where it finds the position of
                             X in the string (X can also be a pattern). However, calling it 
                             by .find(S,X) executes find on S with argument X. I can't 
                             directly do n:find(4) because n is a number. This is a "hack" 
                             (sort of) to cut down some bytes. Also, if X is not a string,
                             lua tries to (in this case, succeeds) cast X to a
                             string and then look for it. I check if this is equal to z
                             because z is nil (because it is undefined), and find returns
                             nil if X is not found in S.
                             TL;DR: Checks if 4 is not the last digit.]]
        and n ~= 13 --Self-explanatory, checks if n is not 13
        return n --Self-explanatory, returns n
end
for i = 4, io.read(), 2 do --[[Start at floor 3 (shows 4 because we're going by target
                               floor, not by starting floor), continue until we reach
                               floor io.read() (io.read returns user input), increment by
                               2 floors per iteration)]]
    s = g() .. ' ' .. g() .. "\n" .. s --[[Prepend the next floor, a space, the next floor,
                               and a newline to s]]
end
print(s) --Self-explanatory, output the string

ลองใช้ออนไลน์ (คุณต้องคลิก 'เรียกใช้' ที่ด้านบนแล้วคลิกเทอร์มินัลที่ด้านล่างก่อนพิมพ์อินพุตฉันกำลังมองหาวิธีที่ดีกว่าในการทดสอบ lua ออนไลน์ด้วย stdin และ stdout)


3

05AB1E , 25 23 22 ไบต์

-1 ไบต์ต้องขอบคุณ @ ASCII เท่านั้น

·Ý<0K13Kʒ4å_}s£2ôR9çý»

ลองออนไลน์!

คำอธิบาย

                           # Implicit input: integer n
·Ý<                        # Push list [-1,0,1,...,2n-1]
   0K                      # Remove 0 from [-1,0,1,...,2n-1]
     13K                   # Remove 13 from [-1,1,...,2n-1]
        ʒ4å_}              # Filter out every number containing a 4 from the list
             s£            # Pick out the n first element in the list
               2ôR         # Splice list into parts of length 2
                  9çý      # Join with tab character (ascii value 9)
                     »     # Join with newlines


อา ฉันรู้ว่ามีวิธีที่จะทำให้0 13ªส่วนที่น่าเกลียดดีขึ้นเล็กน้อย ขอบคุณ!
Wisław

รอ. ไม่มีตรรกะและใน 05AB1E หรือไม่ O_o
ASCII เท่านั้น

1
ถ้า 1 เป็นจริงและ 0 เป็นเท็จการคูณจะทำงานเป็นตรรกะและ
Wisław

ไบต์ -1 โดยการเปลี่ยนไปʒ4å_} 4мïêPS: ตามความคิดเห็นก่อนหน้านี้ของคุณ: 0 13ªอาจเป็นไปได้¾13ªเช่นกัน
Kevin Cruijssen

3

C ++ 11, 259 258 203 202 195 194 ไบต์

เฉือนออก 1 \tไบต์ขอบคุณความคิดเนอร์โอไบรอันที่จะใช้แท็บตัวอักษรแทน

UPD 2: ตัดออก 55 ไบต์พร้อมตรรกะที่ปรับปรุงแล้วและการใช้เครื่องหมายจุลภาคในทางที่ผิด

UPD 3: ไบต์อื่นปิดลงด้วย catcat

UPD 4: 7 bytes ได้รับความอนุเคราะห์จาก catcat

UPD 5: และอีกหนึ่งไบต์ปิดโดยแมวป่า

มีความสุขที่ได้รวมอยู่ในสถานที่และยังคงเอาชนะ C และ C # โซลูชั่น

#include<iostream>
#include<string>
int main(){std::string o="-1    1",c,b;int n,i=2,s=2;for(std::cin>>n;s<n;o=i==14|~c.find(52)?o:(++s&1?b=c,"":b+'    '+c+'\n')+o)c=std::to_string(i++);std::cout<<o;}

Ungolfed:

#include <iostream>
#include <string>

int main()
{
    std::string o = "-1 1", c, b;
    int n, i = 2, s = 2;
    for (std::cin >> n;
         s < n;
         o = i == 14 | ~c.find(52) ? o : (++s & 1 ? b = c, "" : b + '   ' + c + '\n') + o
    )
        c = std::to_string(i++);
    std::cout << o;
}

iostreamรวมถึงstringเพื่อให้คุณสามารถข้ามการรวมที่สองสำหรับการลดจำนวน bytecount :)
movatica

@movatica ไม่เป็นไปตาม cppreference.com และการรวบรวมใน VS2019 ล้มเหลวหากไม่มี ดังนั้นถ้ามันรวบรวมที่อื่นมันเป็นเรื่องเฉพาะสำหรับการใช้งานไลบรารีมาตรฐานบางอย่าง
Alexander Revo

ตกลงดูเหมือนว่าจะเป็นสิ่ง gcc
movatica


2

Java, 333 ไบต์

import java.util.*;interface E{static void main(String[]a){byte i=-1;Stack<Byte>s=new Stack<>();while(s.size()<Byte.valueOf(a[0])){if(i==13|i==0|String.valueOf(i).contains("4")){i++;continue;}s.add(i);i++;}if(s.size()%2!=0){System.out.println(s.pop());}while(!s.isEmpty()){int r=s.pop();int l=s.pop();System.out.println(l+"\t"+r);}}}

เพิ่มหมายเลขพื้นที่อนุญาตให้กับสแต็กจากนั้นดึงกลับออกมาเพื่อพิมพ์

ฉันเล่นโดยใช้ IntStream แต่การนำเข้าทั้งหมดนี้จบลงด้วยการที่เล็กลง


2

สกาลา 147

val n=io.StdIn.readInt;(-1 to 4*n).filter(i=>i!=0&&i!=13&&(!(i+"").contains(52))).take(n).reverse.grouped(2).toList.map{i=>println(i(1)+"\t"+i(0))}

เห็นได้ชัดว่านี่เป็นเวอร์ชั่น Scala'd
CJ Dennis

2

Python 3, 117 ไบต์

n=int(input())
l=[-1]+[i for i in range(n*2)if(i!=13)*(not'4'in str(i))][1:n]
while l:x=l.pop();print(l.pop(),'\t',x)

เวอร์ชันที่แก้ไขของโพสต์ python 2 เพื่อให้พอดีกับสเปค python 3


2

PowerShell, 106 107ไบต์

$c=,-1+$(while($i+1-lt"$args"){if(++$c-notmatch'^13$|4'){$c;++$i}})
while($c){$a,$b,$c=$c;$s="$a    $b
$s"}$s

Ungolfed

# Calculate floors:
$c=,-1 # Array with one element
  +
  $( # Result of subexpression
    while($i+1-lt"$args"){ # Uninitialized $i is 0, +1 ensures loop start from 1
      if(
        ++$c-match'^13$|4' # Expression increments uninitialized $c (i.e. start from 1)
                           # and matches resulting number to regex.
      ){
        $c;++$i # Return $c and increment $i counter 
      }
    }
  )

# Print floors:
while($c){ # Loop until no more elements in $c
  $a,$b,$c=$c # Use PS's multiple assignment feature
              # $a - first element of $c array
              # $b - second element of $c array
              # $c - the rest of elements of $c array
  $s="$a    $b
$s" # Create string with tabs and newlines,
    # literal characters are used
}
$s # Output resulting string

ตัวอย่าง

PS > .\Elevator.ps1 14
15  16
11  12
9   10
7   8
5   6
2   3
-1  1

2

Haskell 202 ไบต์

t=(-1):[x|x<-[1..],x/=13,all (/='4')(show x)]
by2 []=[[]]
by2 [a]=[[a]]
by2 [a,b]=[[a,b]]
by2 (a:b:xs)=[a,b]:(by2 xs)
main=do
 n<-getLine
 putStr$unlines$map unwords$by2$map show$reverse$take(read n) t

ฉันเป็นผู้เริ่มต้น ...

  • สร้างรายการค่าที่ไม่มีที่สิ้นสุดก่อน (รายการ t)
  • ฟังก์ชั่น by2 จัดกลุ่มรายการเป็นรายการย่อยของ 2 องค์ประกอบ
  • หลักรับค่า
    • ใช้องค์ประกอบค่าของรายการt
    • กลับรายการเพื่อให้มีองค์ประกอบยิ่งใหญ่ก่อน
    • ฟังก์ชั่นแผนที่แสดงการแปลงรายการ int เป็นรายการสตริง
    • องค์ประกอบกลุ่ม 2 2 ด้วยฟังก์ชั่น by2
    • เรามีรายการเช่น [["4", "5"], ["6", "7"]] เปลี่ยนรูปเช่น ["4 5", "6 7"] ด้วยฟังก์ชันunwords ที่แมปไว้ในรายการ
    • ยกเลิกการทำรายการ (แต่ละองค์ประกอบของรายการแยกกันด้วย '\ n')
    • เสร็จสิ้นด้วย putStrLn เพื่อเขียนสตริงบน terminal

คุณสามารถบันทึกหลายไบต์ในการกำหนดby2โดยใช้ชื่อตัวละคร 1 ตัวและเรียงลำดับใหม่: ใช้บรรทัดสุดท้ายของคุณตามb x = [x]หลังจากนั้น
ballesta25

2

Javascript ES6 114 ไบต์

n=>[...Array(n)].map(_=>{while(/^13$|4|^0/.test(++i));return i;},i=-2).join`    `.match(/-?\d+  \d+/g).reverse().join`\n`

การใช้

f=n=>[...Array(n)].map(_=>{while(/^13$|4|^0/.test(++i));return i;},i=-2).join`  `.match(/-?\d+  \d+/g).reverse().join`\n`

f (100);


2

Perl 6 , 73 ไบต์

{.join("    ").say for (-1,|grep {$_-13&!/4/},1..Inf)[^$_].rotor(2).reverse}

สมมติว่ามีจำนวนชั้นที่เท่ากันเนื่องจากคำแถลงปัญหาดูเหมือนว่าจะถือว่าเป็นอย่างดีและอย่างน้อยหนึ่งวิธีแก้ปัญหาที่ให้ไว้อื่น ๆ สำหรับจำนวนชั้นที่แปลก เพียงเพิ่ม,:partialเป็นอาร์กิวเมนต์ตัวที่สองrotorสำหรับอีกเก้าไบต์เพื่อรองรับจำนวนคี่



2

เยลลี่ 20 ไบต์

ḟ13D_4Ȧµ#o-s2Ṛj€9Ọ¤Y

ลองออนไลน์!

อย่างไร?

ḟ13D_4Ȧµ#o-s2Ṛj€9Ọ¤Y - Main Link: no arguments
        #            - start at n=0 and collect the first INPUT values which are truthy under:
       µ             -   the monad (i.e. f(n)):        e.g.:    0      3      4      13     42        813
ḟ13                  -     filter out thirteens                 [0]    [3]    [4]    []     [42]      [813]
   D                 -     convert to decimal lists             [[0]]  [[3]]  [[4]]  []     [[4,2]]   [[8,1,3]]
    _4               -     subtract four (vectorises)           [[-4]] [[-1]] [[0]]  []     [[0,-2]]  [[4,-3,-1]
      Ȧ              -     any & all?                           1      1      0      0      0         1
         o-          - logical OR with -1 (replace floor 0 with floor -1)
           s2        - split into twos
             Ṛ       - reverse
                  ¤  - nilad followed by link(s) as a nilad:
                9    -   literal nine
                 Ọ   -   to character (a tab)
              j€     - join €ach
                   Y - join with newlines
                     - implicit print

1

JavaScript (ES6), 151 146

alert([for(a of Array((n=+prompt(i=0))*2).keys())if((i+=t=/4/.test(a)||a==13,!t&&a<n+i))a].reduce((a,b,j,r)=>j%2-1?(b||-1)+`  ${r[j+1]}
`+a:a,''))

ทำสิ่งนี้ก่อนที่ฉันจะรู้ตัวว่า edc65 ทำสิ่งที่สั้นลงไปแล้ว โอ้ดี!


1

R , 106 ไบต์

n=scan();x=-1:n^2;x=x[-grep(4,x)][-14][-2][n:1];cat(paste0(matrix(x,2,n/2)[2:1,],c("	","\n"),collapse=""))

ลองออนไลน์!

1n2n3n9c("\t","\n")\t

n=scan();                                        # read number of floors n
x=-1:n^2;                                        # initial vector of numbers
x=x[-grep(4,x)]                                  # remove floors with a 4
               [-14]                             # remove floor 13
                    [-2]                         # remove floor 0
                        [n:1];                   # keep lowest n remaining floors, highest to lowest
cat(paste0( 
  matrix(x,2,n/2)                                # split vector of floors into 2 rows
                 [2:1,],                         # take row 2 then row 1
                        c("   ","\n"),           # separate integers with alternating tabs and newlines (uses recycling)
                                    collapse=""))

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