Lift hotel takhayul


54

Deskripsi

Berikut lift hotel yang sangat takhayul di Shanghai:

               masukkan deskripsi gambar di sini

Ia menghindari angka 13, karena tiga belas tidak beruntung di dunia Barat, dan menghindari angka 4, karena empat tidak beruntung di beberapa bagian Asia. Bagaimana jika hotel ini lebih tinggi?

Baca bilangan bulat genap positif ndari STDIN, yang mewakili jumlah lantai, dan cetak seperti apa tata letak tombol untuk STDOUT:, -1diikuti oleh n-1bilangan bulat positif berikutnya yang tidak sama dengan 13 dan tidak mengandung angka 4. Atur ini angka dalam dua kolom seperti pada gambar di atas: mencetak dua nomor lantai per baris, dipisahkan oleh tab horizontal, sehingga membaca garis dalam urutan terbalik dari kiri ke kanan menghasilkan urutan dalam urutan menaik. (Anda juga dapat mencetak karakter baris baru yang tertinggal.)

Uji kasus

Untuk input 14, output harus seperti pada gambar di atas:

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

di mana spasi di setiap baris adalah karakter tab horisontal tunggal.

Untuk input 2, Anda harus mencetak -1 1.

Untuk input 100, Anda harus mencetak:

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

Tujuan

Ini adalah . Jawaban terpendek dalam byte menang.


2
@Mauris 6138, mungkin tidak, tapi 113? Saya pikir kuncinya adalah apakah Anda mengatakan "tiga belas" ketika Anda membaca nomor dengan keras.
Acak 832

12
@ Random832 Apa yang Anda sarankan adalah perubahan arbitrer yang efektif. Etika PPCG mencegah perubahan seperti itu setelah jawaban diberikan, terutama jika jawaban yang ada secara efektif tidak valid, yang akan menjadi kasus ini
Digital Trauma

8
FWIW, 4 bukan sial. 4 hanya terdengar sangat mirip dengan "mati" atau "mati" dalam berbagai dialek / bahasa Cina.
Slebetman

10
@slebetman: Ya, itu sebabnya 4 tidak beruntung. Ini masih takhyul, apa pun asalnya! Tapi itu agak di luar topik.
Lynn

13
Tunggu! Menghitung tombol, saya melihat bahwa hotel memiliki persis 13 lantai (tidak termasuk ruang bawah tanah.) Tidak mungkin saya tinggal di sana!
Level River St

Jawaban:


8

Pyth, 27 byte

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

Cobalah online di sini .

Mendapat .first Q-1nomor yang sesuai filter !=13dan 4tidak dalam representasi string dari nomor tersebut. Kemudian ia menambahkan -1, memotong dua, bergabung masing-masing dengan tab ( C9) dan bergabung dengan baris baru.


19

Bash + utilitas umum, 51

seq 9$1|sed 13d\;/4/d\;1i-1|rs 0 2|sed $[$1/2]q|tac
  • seq Menghasilkan bilangan bulat naik dari 1 ke N dengan tambahan 9 digit di depan - lebih dari cukup untuk input bilangan bulat 64bit
  • sedmenyaring lantai dan sisipan yang tidak beruntung -1sebelum baris 1
  • rs membentuk kembali menjadi dua kolom yang dipisahkan tab
  • sed berhenti setelah N / 2 baris
  • tac membalikkan urutan jalur keluaran

Saya dapat mencukur 5 byte untuk Anda - ganti sed $[$1/2]qsetelah rsdengan sed $1qsebelumnya. Saya pikir itu membuatnya kompatibel dengan POSIX-shell.
Toby Speight

1
Akhirnya, pendahulunya 1tidak akan cukup untuk mengkompensasi lulus hanya 0,9 ^ dari input melalui (angka tidak mengandung 4sparser dan sparser karena jumlah digit meningkat). Tetapi begitu Anda memiliki lebih dari beberapa ratus juta lantai di hotel Anda, Anda mungkin memiliki masalah lain, seperti menjaga pipa ledeng bekerja, dan mengatur staf rotas.
Toby Speight

@TobySpeight Anda mungkin memiliki elevator ruang angkasa juga :)
Digital Trauma

@TobySpeight Bahkan dengan maksimum 64 bit integer yang ditandatangani sebagai input (9223372036854775807), cukup dengan awalan 1 sudah (hampir) cukup - setidaknya dengan perhitungan basis 9 saya yang belum sempurna. Sisa jawabannya terbatas pada kisaran ini saja karena $[]aritmatika shell . Saya pikir ini adalah batasan yang masuk akal karena tidak adanya penyebutan eksplisit aritmatika presisi arbitrer dalam pertanyaan. Apapun, saya sekarang awalan 9bukan 1, hanya untuk berada di sisi yang aman.
Trauma Digital

10

JavaScript ES6, 236 234 233 210 195 188 byte

Menyimpan banyak byte berkat kami dan teman-teman!

Menggunakan function*generator. Mungkin cara yang lebih singkat untuk melakukan ini, tapi itu menyenangkan. Sangat menyenangkan. Saya berani bertaruh golf bisa dilakukan. Benda-benda aneh itu adalah 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)
usandfriends

@usandfriends Terima kasih! Saya lupa tentang konversi tipe otomatis.
Conor O'Brien

.joindengan tab dan ganti spasi /-?\d+ \d+/gdengan tab, hapus .map(x=>x.replace(/ /,"\t"))(harus menyimpan 23 byte)
usandfriends

1
.filter(x=>x!=".0")==> .filter(x=>+x), (-5 bytes)
usandfriends

2
^ Gores itu , hapus saja seluruh .filter(..)bagian! Coba l.push(a);==> +a&&l.push(a);(-15 bytes)
usandfriends

7

C, 282 Bytes

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

Diformat:

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

Fitur :

Dapat menghitung hingga 2095.984 lantai, jika setiap lantai 19.5mtinggi (termasuk langit-langit) maka bangunan ini cukup panjang untuk dililitkan di garis katulistiwa! 2095984*19.5=40871688m=~40000km=one 'lap' around the planet.


1
Jawaban yang bagus, tetapi geografi Anda sedikit berbeda. Jarak dari garis khatulistiwa ke kutub utara adalah 10.000 km menurut definisi en.wikipedia.org/wiki/Metre yang berarti keliling garis khatulistiwa sedikit lebih dari 40000 km.
Level River St

1
Komentar yang bagus, tetapi definisi meter Anda agak ketinggalan jaman. ;-)
murphy

@steveverrill saya hanya menggunakan nomor pertama saya turun dari google, saya akan memperbarui perhitungan.
x13

Anda dapat menyimpan beberapa byte dengan menjatuhkan "int" dari main. Apakah kawat gigi di sekitar E benar-benar diperlukan? Pertama whiledapat dikonversi ke fordan ini memungkinkan Anda untuk menjatuhkan beberapa kurung kurawal. t/=10byte lebih pendek dari t=t/10. Tambahkan 1 ke c di forloop Anda untuk menyimpan beberapa byte -> a[c+1]menjadi a[c], sementara semua nomor lainnya memiliki panjang yang sama. Saya juga menggabungkan dua printfs di loop bersama-sama, dan menjatuhkan kurung kurawal lagi.
aragaer

Saya pikir definisi Anda tentang "ketinggian lantai" mungkin sedikit berbeda - lantai tipikal adalah sekitar 3m, bukan 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

Ruang kosong lucu di sana adalah tab literal. Seperti yang dicatat Conor O'Brien, ini lebih pendek satu byte daripada melakukan \t.

Tidak Disatukan:

# 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

Saya pikir Anda dapat menggunakan i-13sebagai gantinyai!=13
12Me21

6

JavaScript, 116 122

Edit Disimpan 6 byte thx @Neil

Solusi array sederhana - bahkan tidak menggunakan ES6

Coba dengan browser apa saja

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


Anda dapat menyimpan 6 byte dengan menggunakan !/4/.test(v).
Neil

Anda dapat menyimpan satu byte dengan ' 'alih - alih '\t'(tab literal)
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

Cobalah online!

Ada karakter tab dalam string yang SE tidak render (terima kasih kepada Sp3000 karena disarankan untuk menggunakannya, menghemat byte).

Tes lantai cmulai dari lantai -1sampai kuota nlantai tercapai. Untuk setiap lantai, tes bahwa itu tidak mengandung 4atau tidak sama 0atau 13. Jika demikian, tambahkan ke string elevator sdan turunkan kuota n.

Trik dengan pemformatan string digunakan untuk membuat dua lantai per kolom agar muncul dalam urutan yang tepat saat prepended. Setiap baris baru disiapkan sebagai '%d\t%%d\n', sehingga ketika dua lantai diganti secara berurutan, yang pertama di sebelah kiri dan yang kedua di sebelah kanan. Sebagai contoh,

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

Cukup keren, tapi sebenarnya 96 byte . Mungkin menghapus koma tertinggal?
movatica

2
@movatica Tangkapan yang bagus pada koma jejak, karena tantangan menentukan baris baru tidak apa-apa. Perbedaan 1 byte adalah karena blok kode SE tidak dapat menampilkan tab, jadi saya memasukkan \t. Ah, hari-hari sebelum TIO ada.
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)));}}}

Tidak Disatukan:

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

Trik golf yang digunakan:

  • i (penghitung berjalan) dan j (angka saat ini dalam pertimbangan) masing-masing dikurangi / bertambah, masing-masing, di dalam ekspresi dalam tubuh loop bukan pernyataan untuk seperti biasa
  • j+"" dari pada j.ToString()
  • Tempatkan semua yang ada di dalam namespace System.Collections.Generictidak hanya agar kita dapat mengakses List<T>, tetapi juga secara implisit menggunakan namespace Systemtanpa kualifikasi lebih lanjut
  • Tempatkan usingdi dalam namespace sehingga kita dapat menulis using Linq;bukanusing System.Linq;
  • .Insert(0,j)lebih pendek daripada menggunakan .Add(j)dan kemudian menerapkan.Reverse()

Sangat disayangkan bahwa using Linq;itu perlu, karena itu diperlukan hanya untuk .Zip, tetapi menulis itu Linq.Enumerable.Zip()lebih lama.


5

Ruby 2.3, 84 83 karakter

(82 karakter kode + 1 opsi opsi perintah)

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

Contoh dijalankan:

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 karakter

(91 karakter kode + 1 opsi baris perintah karakter)

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

Contoh dijalankan:

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 Bytes

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

Cukup lurus ke depan, pertama-tama kita merakit tabel yang diisi dengan semua nilai tombol. Kemudian kita beralih ke belakang, mencetak dua nilai sekaligus, atau tidak sama sekali jika nilai kedua tidak ada.


4

Mathematica, 105 byte

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

Ganti \tdengan karakter tab yang sebenarnya.


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

Akan jauh lebih pendek dengan dukungan CLPFD, di sini saya harus mencoba bilangan bulat di sub-predikat pertama.

Baris baru sebelumnya "w,?bb:2&}adalah wajib, ini adalah baris baru yang dicetak di antara setiap baris.


Bagus! Satu pertanyaan: Mengapa tidak membuat semua bilangan bulat aritmatika di Brachylog menggunakan kendala CLP (FD) secara otomatis? Ini akan menjadi ekstensi logis alami.
mat

@ Ah karena aku malas dan tidak. Tetapi saya harus!
Fatalkan

Itu akan luar biasa! Batasan CLP (FD) implisit bawaan untuk semua aritmatika integer! Membuka masa depan pemrograman deklaratif! "Dan tampaknya merupakan berkat bagimu untuk mengesankan tanganmu pada milenium seperti pada lilin. Berkat untuk menulis pada kehendak milenium seperti pada perunggu - lebih keras dari perunggu, lebih mulia dari perunggu. Hanya yang paling mulia yang sama sekali sulit."
mat

@mat Bisakah Anda bergabung dengan saya di ruang obrolan ini untuk membahas hal ini? Saya butuh saran dari seseorang yang jelas lebih berpengalaman dengan Prolog daripada saya.
Fatalkan

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

Ini hanya sebagai fungsi. Saya baru mengenal C #. Peningkatan adalah untuk membuat valid untuk 40-49, dan untuk termasuk usings

Tidak digabungkan, sebagai program berjalan yang lengkap:

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

Dijelaskan

Saya membuat dua daftar, dan bergantian antara mendorong ke mereka, membalikkannya, loop melalui satu, dan ambil yang lain dengan indeks.


Saya tidak tahu banyak tentang C # tetapi tidak dapatkah Anda menggantinya if(s==1)dengan if(s)(pemain otomatis dari int ke boolean?)
Fatalize

Nah, karena yang lain adalah untuk s == 2, walaupun saya bisa membuat flag 0 dan 1 bukannya 1 dan 2. Saya akan mencobanya.
Angsa

3

Python 3, 155 byte

Saya pikir mendengarkan, membalikkan, dan membuat zip sendiri generator nomor lantai s()mungkin terlalu pintar untuk kebaikannya sendiri, tetapi yang lain sudah melakukan alternatif (melompati dua item sekaligus), belum lagi menggunakan Python 2 yang menghemat byte pada beberapa poin penting.

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)

Alternatif yang lebih pendek, tetapi sudah dilakukan lebih baik membutuhkan 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)

Untuk alternatif kedua, (0!=n!=13)!=('4'in str(n))lebih pendek 5 byte dari 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'    } ·

Keempat spasi harus merupakan tab char aktual. Cobalah online!

Bagaimana itu bekerja

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

Tidak disatukan

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

Cobalah online (Anda perlu mengklik 'jalankan' di atas dan kemudian klik terminal di bawah sebelum mengetik input; Saya sedang mencari cara yang lebih baik untuk menguji lua online dengan stdin dan stdout)


3

05AB1E , 25 23 22 byte

-1 byte terima kasih hanya untuk @ ASCII

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

Cobalah online!

Penjelasan

                           # 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. Saya tahu ada cara untuk membuat 0 13ªbagian jelek itu menjadi sedikit lebih baik. Terima kasih!
Wisław

Tunggu. tidak ada yang logis dan di 05AB1E? O_o
ASCII

1
Jika 1 benar dan 0 salah, maka perkalian berfungsi sebagai logis dan
Wisław

-1 byte dengan mengubah ʒ4å_}ke 4мïê. PS: berdasarkan komentar Anda sebelumnya: 0 13ªbisa ¾13ªjuga.
Kevin Cruijssen

3

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

Dipotong 1 byte, berkat ide Conor O'Brien untuk menggunakan tab literal alih-alih \t.

UPD 2: memangkas 55 byte dengan peningkatan logika dan penyalahgunaan koma.

UPD 3: byte lain mati berkat ceilingcat.

UPD 4: 7 byte dari courtcat.

UPD 5: dan byte lain dimatikan oleh ceilingcat.

Senang memiliki semua yang ada di tempatnya DAN masih mengalahkan solusi C dan 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;}

Tidak Disatukan:

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

iostreamtermasuk string, sehingga Anda dapat melewati menyertakan kedua untuk penurunan besar dalam bytecount :)
movatica

@movatica Tidak menurut cppreference.com, dan kompilasi di VS2019 gagal tanpanya. Jadi jika ia mengkompilasi di tempat lain itu spesifik untuk implementasi perpustakaan standar tertentu.
Alexander Revo

ok, sepertinya menjadi hal gcc.
movatica


2

Java, 333 Bytes

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

Menambahkan nomor lantai yang dibolehkan ke tumpukan kemudian muncul kembali untuk mencetaknya.

Saya bermain-main menggunakan IntStream, tetapi dengan semua impor yang satu ini akhirnya menjadi lebih kecil.


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

Ini jelas versi Scala'd down.
CJ Dennis

2

Python 3, 117 Bytes

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)

Versi modifikasi dari posting python 2 agar sesuai dengan spesifikasi 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

Tidak disatukan

# 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

Contoh

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

Saya pemula Haskell ...

  • pertama buat daftar nilai yang tak terbatas. (daftar t)
  • fungsi by2 mengelompokkan daftar menjadi sublist dari 2 elemen.
  • utama mengambil nilai.
    • ambil elemen nilai dari daftar t
    • balik daftar untuk memiliki elemen yang hebat terlebih dahulu
    • fungsi tampilan peta untuk mengubah daftar int ke daftar string
    • elemen grup 2 oleh 2 dengan fungsi by2
    • Kami memiliki daftar seperti [[ "4", "5"], [ "6", "7"]] berubah seperti [ "4 5", "6 7"] dengan unwords fungsi dipetakan pada daftar
    • batalkan garis daftar (setiap elemen daftar dipisahkan oleh '\ n')
    • selesai dengan putStrLn untuk menulis string pada terminal.

Anda dapat menyimpan beberapa byte dalam mendefinisikan by2dengan menggunakan nama 1 karakter dan memesan ulang: gunakan baris terakhir Anda apa adanya, kemudian b x = [x]setelah.
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`

Pemakaian

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}

Mengasumsikan jumlah lantai yang genap, karena pernyataan masalah tampaknya mengasumsikannya juga dan setidaknya satu solusi lain memberikan istirahat untuk jumlah lantai ganjil. Tambahkan saja ,:partialsebagai argumen kedua rotor, untuk sembilan byte lebih, untuk mendukung jumlah lantai ganjil.



2

Jelly , 20 byte

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

Cobalah online!

Bagaimana?

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

Apakah ini sebelum saya menyadari bahwa EDC65 telah membuat yang lebih pendek. Baiklah!


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

Cobalah online!

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.