Thang máy khách sạn mê tín


54

Sự miêu tả

Đây là một thang máy khách sạn rất mê tín ở Thượng Hải:

               nhập mô tả hình ảnh ở đây

Nó tránh được số 13, bởi vì mười ba là không may mắn trong thế giới phương Tây, và nó tránh được chữ số 4, bởi vì bốn là không may mắn ở các vùng của Châu Á. Nếu khách sạn này cao hơn thì sao?

Đọc số nguyên dương chẵn ntừ STDIN, biểu thị số tầng và in bố cục nút trông như thế nào với STDOUT : -1, theo sau là các n-1số nguyên dương tiếp theo không bằng 13 và không chứa chữ số 4. Sắp xếp các số này các số trong hai cột như trong hình trên: in hai số sàn trên mỗi dòng, cách nhau bởi một tab nằm ngang, để đọc các dòng theo thứ tự ngược từ trái sang phải sẽ tạo ra chuỗi theo thứ tự tăng dần. (Bạn cũng có thể tùy ý in một ký tự dòng mới.)

Các trường hợp thử nghiệm

Đối với đầu vào 14, đầu ra phải như trong hình trên:

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

trong đó khoảng trắng trong mỗi dòng là một ký tự tab ngang.

Đối với đầu vào 2, bạn nên in -1 1.

Đối với đầu vào 100, bạn nên in:

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

Mục tiêu

Đây là . Câu trả lời ngắn nhất trong byte thắng.


2
@Mauris 6138, có thể không, nhưng 113? Tôi nghĩ chìa khóa sẽ là liệu bạn có nói "mười ba" khi bạn đọc to số.
Random832

12
@ Random832 Những gì bạn đề xuất là những thay đổi tùy ý cho thông số kỹ thuật. Các nghi thức của PPCG không khuyến khích những thay đổi đó sau khi đã có câu trả lời, đặc biệt là nếu các câu trả lời hiện có bị vô hiệu một cách hiệu quả, trong trường hợp này
Chấn thương kỹ thuật số

8
FWIW, 4 không may mắn. 4 chỉ nghe rất giống với "chết" hoặc "chết" trong các phương ngữ / ngôn ngữ khác nhau của Trung Quốc.
slebetman

10
@slebetman: Vâng, vâng, đó là lý do tại sao 4 không may mắn. Vẫn là mê tín, dù nguồn gốc là gì! Nhưng đó là một chút lạc đề.
Lynn

13
Chờ đợi! Đếm các nút tôi thấy rằng khách sạn có chính xác 13 tầng (không bao gồm tầng hầm.) Không có cách nào tôi ở đó!
Cấp sông St

Câu trả lời:


8

Bình thường, 27 byte

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

Hãy thử trực tuyến tại đây .

Lấy các số .fđầu tiên Q-1khớp với bộ lọc !=134không có trong chuỗi đại diện của số đó. Sau đó, nó chuẩn bị -1, chia làm đôi, nối với nhau bằng các tab ( C9) và tham gia theo dòng mới.


19

Bash + dụng cụ chung, 51

seq 9$1|sed 13d\;/4/d\;1i-1|rs 0 2|sed $[$1/2]q|tac
  • seq tạo các số nguyên tăng dần từ 1 đến N với thêm 9 chữ số ở phía trước - quá đủ cho đầu vào số nguyên 64 bit
  • sedlọc ra các tầng không may mắn và chèn -1trước dòng 1
  • rs định hình lại thành hai cột được phân tách bằng tab
  • sed dừng sau N / 2 dòng
  • tac đảo ngược thứ tự dòng đầu ra

Tôi có thể cạo 5 byte cho bạn - thay thế sed $[$1/2]qsau rsbằng sed $1qtrước nó. Tôi nghĩ rằng điều đó làm cho nó tương thích POSIX-shell.
Toby Speight

1
Cuối cùng, phần trước 1sẽ không đủ để bù cho việc chỉ chuyển 0,9 ^ n các đầu vào thông qua (các số không chứa 4sparser và sperer khi số chữ số tăng). Nhưng một khi bạn có hơn vài trăm triệu tầng trong khách sạn của mình, bạn có thể gặp các vấn đề khác, chẳng hạn như giữ cho hệ thống ống nước hoạt động và tổ chức luân phiên nhân viên.
Toby Speight

@TobySightight bạn cũng có thể có thang máy không gian :)
Chấn thương kỹ thuật số

@TobySpeight Ngay cả với số nguyên 64 bit được ký tối đa làm đầu vào (9223372036854775807), chỉ cần tiền tố 1 là đủ (ít nhất là) - ít nhất là với phép tính cơ sở 9 thô sơ của tôi. Phần còn lại của câu trả lời bị giới hạn trong phạm vi này do $[]số học shell . Tôi nghĩ rằng đây là một giới hạn hợp lý trong trường hợp không đề cập rõ ràng về số học chính xác tùy ý trong câu hỏi. Bất kể, bây giờ tôi đang tiền tố 9thay vì 1, chỉ để ở bên an toàn.
Chấn thương kỹ thuật số

10

Javascript ES6, 236 234 233 210 195 188 byte

Đã lưu cả đống 'một byte nhờ chúng tôi và bạn bè!

Sử dụng function*cho máy phát điện. Có lẽ là một cách ngắn hơn để làm điều này, nhưng nó rất vui. Cách vui. Tôi sẽ đặt cược một số golf có thể được thực hiện. Những thứ khoảng trắng kỳ lạ là các tab.

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 byte)
tôi vào

@usandfriends Cảm ơn bạn! Tôi quên về chuyển đổi loại tự động.
Conor O'Brien

.joinvới tab và thay thế không gian /-?\d+ \d+/gbằng tab, hãy xóa .map(x=>x.replace(/ /,"\t"))(nên lưu 23 byte)
tôi vào

1
.filter(x=>x!=".0")==> .filter(x=>+x), (-5 byte)
tôi vào

2
^ Cào đó , chỉ cần loại bỏ toàn bộ .filter(..)phần! Hãy thử l.push(a);==> +a&&l.push(a);(-15 byte)
tôi vào

7

C, 282 byte

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);}

Định dạng:

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 );
}

Đặc trưng :

Nó có thể tính toán tới 2095984 tầng, nếu mỗi tầng 19.5mcao (bao gồm trần) thì tòa nhà này đủ dài để được quấn quanh đường xích đạo! 2095984*19.5=40871688m=~40000km=one 'lap' around the planet.


1
Câu trả lời hay, nhưng địa lý của bạn hơi xa. Khoảng cách từ xích đạo đến cực bắc là 10000km theo định nghĩa en.wikipedia.org/wiki/Metre có nghĩa là chu vi của đường xích đạo là hơn 40000km.
Cấp sông St

1
Nhận xét tốt đẹp, nhưng định nghĩa của bạn về đồng hồ là một chút lỗi thời. ;-)
murumb

@steveverrill tôi mới sử dụng số đầu tiên tôi đã tắt google, tôi sẽ cập nhật tính toán.
x13

Bạn có thể lưu một vài byte bằng cách bỏ "int" khỏi main. Niềng răng xung quanh E có thực sự cần thiết? Đầu tiên whilecó thể được chuyển đổi thành forvà điều này cho phép bạn thả một số dấu ngoặc nhọn. t/=10là một byte ngắn hơn t=t/10. Thêm 1 vào c trong forvòng lặp của bạn để lưu một vài byte -> a[c+1]trở thành a[c], trong khi tất cả các số khác có cùng độ dài. Tôi cũng kết hợp hai printfs trong vòng lặp với nhau và bỏ niềng răng lại.
aragaer

Tôi nghĩ rằng định nghĩa của bạn về "chiều cao sàn" có thể hơi xa vời - một tầng thông thường cao khoảng 3 m, không phải 19,5m.
nneonneo

6

Julia, 134 132 byte

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

Khoảng trắng hài hước đó là một tab theo nghĩa đen. Như Conor O'Brien đã lưu ý, đây là một byte ngắn hơn so với làm \t.

Ung dung:

# 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 byte

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

Tôi nghĩ bạn có thể sử dụng i-13thay vìi!=13
12Me21

6

JavaScript, 116 122

Chỉnh sửa đã lưu 6 byte thx @Neil

Giải pháp mảng đơn giản - thậm chí không sử dụng ES6

Thử với bất kỳ trình duyệt nào

/* 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>


Bạn có thể lưu 6 byte bằng cách sử dụng !/4/.test(v).
Neil

Bạn có thể lưu một byte đơn ' 'thay vì '\t'(tab bằng chữ)
Mwr247

6

Python 2 , 94 byte

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

Hãy thử trực tuyến!

Có một ký tự tab trong chuỗi mà SE không kết xuất (nhờ Sp3000 đã đề xuất sử dụng nó, tiết kiệm một byte).

Kiểm tra các tầng cbắt đầu từ tầng -1cho đến khi đạt được hạn ngạch ncủa các tầng. Đối với mỗi tầng, các bài kiểm tra không chứa 4hoặc không bằng 0hoặc 13. Nếu vậy, hãy đưa nó vào chuỗi thang máy svà giảm chỉ tiêu n.

Một mẹo với định dạng chuỗi được sử dụng để khiến hai tầng trên mỗi cột xuất hiện theo đúng thứ tự khi được đặt trước. Mỗi dòng mới được chuẩn bị như '%d\t%%d\n'vậy, khi hai tầng được thay thế theo thứ tự, tầng thứ nhất ở bên trái và tầng thứ hai ở bên phải. Ví dụ,

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

Khá tuyệt, nhưng thực sự là 96 byte . Có lẽ loại bỏ dấu phẩy?
Movatica

2
@movatica Bắt tốt dấu phẩy, vì thử thách chỉ định dòng mới theo dõi là OK. Sự khác biệt 1 byte là do khối mã SE không thể hiển thị các tab, vì vậy tôi đặt vào \t. Ah, những ngày trước khi TIO tồn tại.
xnor

5

C #, 296 byte

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)));}}}

Ung dung:

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)));
        }
    }
}

Thủ thuật đánh golf được sử dụng:

  • i (bộ đếm đang chạy) và j (số hiện tại đang được xem xét) lần lượt được giảm / tăng, bên trong biểu thức trong thân vòng lặp thay vì câu lệnh for như bình thường
  • j+"" thay vì j.ToString()
  • Đặt mọi thứ bên trong namespace System.Collections.Generickhông chỉ để chúng tôi có thể truy cập List<T>mà còn sử dụng ngầm định không gian tên Systemmà không cần chứng nhận thêm
  • Đặt usingbên trong không gian tên để chúng ta có thể viết using Linq;thay vìusing System.Linq;
  • .Insert(0,j)ngắn hơn so với sử dụng .Add(j)và áp dụng sau này.Reverse()

Thật không may là điều đó using Linq;là cần thiết, vì nó chỉ cần thiết cho .Zip, nhưng viết nó Linq.Enumerable.Zip()là dài hơn.


5

Ruby 2.3, 84 83 ký tự

(Tùy chọn dòng lệnh 82 ký tự + 1 ký tự)

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

Chạy mẫu:

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 ký tự

(Mã 91 ký tự + 1 ký tự tùy chọn dòng lệnh)

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

Chạy mẫu:

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 byte

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

Khá thẳng về phía trước, trước tiên chúng tôi lắp ráp một bảng chứa đầy tất cả các giá trị nút. Sau đó, chúng tôi lặp lại qua nó, in hai giá trị tại một thời điểm hoặc không có gì nếu giá trị thứ hai không tồn tại.


4

Toán học, 105 byte

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

Thay thế \tbằng một ký tự tab thực tế.


4

Brachylog , 105 byte

,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&}

Sẽ ngắn hơn rất nhiều với sự hỗ trợ CLPFD, ở đây tôi phải thử lặp lại các số nguyên trong vị từ phụ đầu tiên.

Dòng mới trước "w,?bb:2&}là bắt buộc, đây là dòng mới được in giữa mỗi hàng.


Đẹp! Một câu hỏi: Tại sao không làm cho tất cả số học số nguyên trong Brachylog sử dụng các ràng buộc CLP (FD) tự động? Đây sẽ là một phần mở rộng hợp lý tự nhiên.
chiếu

@mat vì tôi lười và tôi thì không. Nhưng tôi nên!
Gây tử vong vào

Điêu đo thật tuyệt vơi! Tích hợp các ràng buộc CLP (FD) ẩn cho tất cả các số học số nguyên! Mở tương lai của lập trình khai báo! "Và nó có vẻ may mắn đối với bạn để gây ấn tượng với bàn tay của bạn trên hàng thiên niên kỷ như trên tượng sáp. Thật may mắn khi viết lên ý chí của thiên niên kỷ như trên đồng - khó hơn đồng, cao quý hơn đồng. Chỉ có điều cao quý nhất là khó khăn."
chiếu

@mat Bạn có thể tham gia cùng tôi trong phòng chat này để thảo luận về điều này? Tôi cần lời khuyên từ một người rõ ràng có nhiều kinh nghiệm với Prolog hơn tôi.
Gây tử vong vào

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++;}}

Đây chỉ là một chức năng. Tôi mới sử dụng C #. Tăng là để có giá trị trong 40-49 và bao gồm usings

Ungolfed, như một chương trình đang chạy hoàn chỉnh:

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();
    }
}

Giải thích

Tôi tạo hai danh sách và xen kẽ giữa việc đẩy chúng, đảo ngược chúng, lặp qua một và lấy danh sách kia theo chỉ mục.


Tôi không biết nhiều về C # nhưng bạn không thể thay thế if(s==1)bằng if(s)(tự động chuyển từ int sang boolean?)
Fatalize 8/1/2016

Không, bởi vì cái khác là cho s == 2, mặc dù tôi có thể tạo cờ 0 và 1 thay vì 1 và 2. Tôi sẽ thử.
Ngỗng

3

Python 3, 155 byte

Tôi nghĩ rằng việc liệt kê, đảo ngược và tự nén trình tạo số sàn s()có thể quá thông minh vì lợi ích của nó, nhưng những người khác đã thực hiện thay thế (bật hai mục cùng một lúc), chưa kể sử dụng Python 2 giúp tiết kiệm byte trên một số điểm chính.

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)

Sự thay thế ngắn hơn, nhưng đã được thực hiện tốt hơn mất 140 byte.

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)

Đối với phương án thứ hai, (0!=n!=13)!=('4'in str(n))ngắn hơn 5 byte not(n in(0,13)or'4'in str(n)).
Movatica

3

Japt, 42 byte

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

Bốn không gian nên là một tab thực tế. Hãy thử trực tuyến!

Làm thế nào nó hoạt động

          // 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 byte

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)

Ung dung

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

Hãy thử trực tuyến (bạn cần nhấp vào 'thực thi' ở trên cùng và sau đó nhấp vào thiết bị đầu cuối ở phía dưới trước khi nhập dữ liệu; Tôi đang tìm cách tốt hơn để kiểm tra lua trực tuyến với stdin và stdout)


3

05AB1E , 25 23 22 byte

-1 byte chỉ nhờ @ ASCII

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

Hãy thử trực tuyến!

Giải trình

                           # 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


Ah. Tôi biết có một cách để làm cho 0 13ªphần xấu xí đó tốt hơn một chút. Cảm ơn!
Wisław

chờ đợi. không có logic và trong 05AB1E? O_o
ASCII - chỉ

1
Nếu 1 là đúng và 0 là sai thì phép nhân hoạt động như logic và
Wisław

-1 byte bằng cách thay đổi ʒ4å_}thành 4мïê. PS: dựa trên nhận xét trước đó của bạn: 0 13ªcũng có thể ¾13ªnhư vậy.
Kevin Cruijssen

3

C ++ 11, 259 258 203 202 195 194 byte

Cắt giảm 1 byte, nhờ ý tưởng của Conor O'Brien để sử dụng tab theo nghĩa đen thay vì \t.

CẬP NHẬT 2: cắt giảm 55 byte với cải thiện logic và dấu phẩy.

CẬP NHẬT 3: một byte khác nhờ trần nhà.

CẬP NHẬT 4: 7 byte lịch sự của trần nhà.

CẬP NHẬT 5: và một byte khác tắt bởi trần.

Rất vui khi có tất cả bao gồm tại chỗ VÀ vẫn đánh bại các giải pháp C và 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;}

Ung dung:

#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;
}

iostreambao gồm string, vì vậy bạn có thể bỏ qua phần thứ hai bao gồm giảm mạnh số lượng lớn :)
Movatica

@movatica Không theo cppreference.com, và việc biên dịch trong VS2019 không thành công nếu không có nó. Vì vậy, nếu nó biên dịch ở một nơi khác, nó đặc trưng cho việc thực hiện thư viện tiêu chuẩn nhất định đó.
Alexander Revo

ok, có vẻ là một điều gcc.
Movatica


2

Java, 333 byte

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);}}}

Thêm số sàn được phép vào một ngăn xếp sau đó bật lại để in chúng.

Tôi đã chơi xung quanh bằng cách sử dụng IntStream, nhưng với tất cả các lần nhập, cái này cuối cùng lại nhỏ hơn.


2

Scala 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))}

Đây rõ ràng là phiên bản xuống của Scala.
CJ Dennis

2

Python 3, 117 byte

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)

Phiên bản sửa đổi của bài python 2 để phù hợp với đặc điểm kỹ thuật của python 3.


2

PowerShell, 106 107 byte

$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

Ung dung

# 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

Thí dụ

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

2

Haskell 202 byte

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ôi là haskell người mới bắt đầu

  • đầu tiên tạo danh sách vô hạn của các giá trị. (danh sách t)
  • Hàm by2 nhóm một danh sách thành danh sách con gồm 2 phần tử.
  • chính lấy giá trị.
    • lấy các yếu tố giá trị của danh sách t
    • đảo ngược danh sách để có các yếu tố tuyệt vời đầu tiên
    • chức năng hiển thị bản đồ để chuyển đổi danh sách int thành danh sách chuỗi
    • nhóm phần tử 2 by 2 với hàm by2
    • Chúng tôi có một danh sách như [["4", "5"], ["6", "7"]] được chuyển đổi như ["4 5", "6 7"] với chức năng unwords được ánh xạ trong danh sách
    • bỏ đánh dấu danh sách (mỗi thành phần của danh sách được phân tách bằng '\ n')
    • kết thúc với putStrLn để viết chuỗi trên terminal.

Bạn có thể lưu một vài byte trong việc xác định by2bằng cách sử dụng tên 1 ký tự và sắp xếp lại: sử dụng dòng cuối cùng của bạn, sau đó là b x = [x]sau.
ballesta25

2

Javascript ES6 114 byte

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

Sử dụng

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 byte

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

Giả sử số tầng chẵn, vì báo cáo vấn đề dường như cũng giả sử nó và ít nhất một giải pháp được cung cấp khác phá vỡ cho số tầng lẻ. Chỉ cần thêm ,:partiallàm đối số thứ hai vào rotor, để có thêm chín byte, để hỗ trợ số tầng lẻ.



2

Thạch , 20 byte

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

Hãy thử trực tuyến!

Làm sao?

ḟ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,''))

Đã làm điều này trước khi tôi nhận ra edc65 đã thực hiện một bản ngắn hơn. Ồ tốt


1

R , 106 byte

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=""))

Hãy thử trực tuyến!

-1viết sai rồi2viết sai rồi3viết sai rồi9c("\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=""))

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.