Batıl otel asansörü


54

Açıklama

İşte Şangay'da çok batıl bir otel asansörü:

               görüntü tanımını buraya girin

13 sayıdan kaçınıyor, çünkü Batı dünyasında on üç şanssız, 4 rakamı kaçıyor, çünkü dördü Asya'nın bazı bölgelerinde şanssız. Ya bu otel daha uzunsa?

nKat sayısını temsil eden STDIN'den pozitif bir tamsayı okuyun ve düğme düzeninin STDOUT'a nasıl görüneceğini yazdırın -1, ardından n-113'e eşit olmayan ve 4 rakamını içermeyen bir sonraki pozitif tamsayıları izleyin. Yukarıdaki resimdeki gibi iki sütundaki sayılar: Satır başına iki kat numarası, yatay bir sekmeyle ayrılmış olarak yazdırın; (İsteğe bağlı olarak, izleyen bir yeni satır karakteri de yazdırabilirsiniz.)

Test durumları

Giriş için 14çıktı yukarıdaki resimde olduğu gibi olmalıdır:

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

her satırdaki boşluk, tek bir yatay sekme karakteridir.

Giriş için 2yazdırmanız gerekir -1 1.

Giriş için 100yazdırmanız gerekir:

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

Hedef

Bu . Bayt cinsinden en kısa cevap kazanır.


2
@ Mauris 6138, belki değil, ama 113? Bence anahtar, yüksek sesle okuduğunuzda "on üç" mü söyleyeceğinizi söyler .
Random832

12
@ Random832 Önerdiğiniz şey, teknik özelliklerde rastgele yapılan değişiklikler. PPCG görgü kuralları, cevaplar verildikten sonra, özellikle de mevcut cevaplar etkin biçimde geçersiz kılındığında, bu durumda olacakları takdirde, bu tür değişiklikleri önermez
Digital Trauma, 6

8
FWIW, 4 şanssız değil. 4 farklı çince lehçelerinde / dillerinde "ölüme" veya "ölüme" çok benziyor.
Slebetman

10
@slebetman: Evet, bu yüzden 4 şanssız. Hala batıl inanç, kökeni ne olursa olsun! Ama bu biraz konu dışı oluyor.
Lynn

13
Bekle! Düğmeleri sayıyorum (bodrum hariç) tam 13 kat olduğunu görüyorum. Orada kalmam mümkün değil!
Seviye Nehri St

Yanıtlar:


8

Pyth, 27 bayt

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

Burada çevrimiçi deneyin .

Alır .first Q-1filtreyle eşleşen sayıları !=13ve 4sayının dize temsilinde değildir. Sonra hazırlar -1, ikiye böler , her birini sekmelere ( C9) ve yeni satırlara katılır.


19

Bash + ortak kullanım alanları, 51

seq 9$1|sed 13d\;/4/d\;1i-1|rs 0 2|sed $[$1/2]q|tac
  • seq 1'den N'ye kadar artan tam sayıları, önünde fazladan 9 basamaklı bir sayı oluşturur - 64bit tam sayı girişi için fazlasıyla yeterli
  • sed-1hat 1'den önce şanssız yerleri ve ekleri filtreler
  • rs sekmeyle ayrılmış iki sütuna yeniden şekil verir
  • sed N / 2 satırından sonra durur
  • tac çıkış satırı sırasını tersine çevirir

Senin için 5 bayt tıraş edebilirsiniz - yerine sed $[$1/2]qsonra rsbirlikte sed $1qondan önce. Bunun POSIX kabuğunu da uyumlu hale getirdiğini düşünüyorum.
Toby Speight

1
Sonunda, önceki 1girişler arasında girişlerin yalnızca 0.9 ^ 4n'sinin geçmesini telafi etmek için yeterli olmayacaktır (rakam sayısı arttıkça sparser ve sparser içermeyen sayılar ). Ancak otelinizde birkaç yüz milyondan fazla kat bulunduğunuzda, muhtemelen sıhhi tesisatın çalışmasını sağlamak ve personelin verilerini düzenlemek gibi başka problemleriniz de vardır.
Toby Speight

@TobySpeight'ta bir uzay asansörünüz de olabilir :)
Digital Trauma

@TobySpeight Giriş olarak max imzalı 64bit tamsayı olsa bile (9223372036854775807), bir 1 ekinin eklenmesi yeterlidir (hemen hemen) - en azından temel 9 hesaplamamla. Cevabın geri kalanı, kabuk $[]aritmetiğinden dolayı zaten bu aralıkla sınırlıdır . Bunun, soruda rastgele kesinlik aritmetiğinden açıkça söz edilmemesi durumunda makul bir sınırlama olduğunu düşünüyorum. Ne olursa olsun, şimdi sadece güvenli tarafta olmak 9yerine bir önek ekliyorum 1.
Dijital Travma,

10

JavaScript ES6, 236 234 233 210 195 188 bayt

Tüm arkadaşlarımıza bir bayt kurtardık!

function*Jeneratörler için kullanır . Muhtemelen bunu yapmanın daha kısa bir yolu, ama eğlenceliydi. Çok eğlenceli. Bahse girerim biraz golf yapılabilir. Bu garip boşluktaki şeyler sekmelerdir.

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 bayt)
usandfriends

@ binfriends Teşekkürler! Otomatik tür dönüştürmeyi unuttum.
Conor O'Brien,

.joinsekmeyle ve boşluğu sekmeyle değiştirin /-?\d+ \d+/g, çıkarın .map(x=>x.replace(/ /,"\t"))(23 bayt kurtarması gerekir)
usandfriends

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

2
^ Kazıyın , sadece bütün .filter(..)kısmını çıkarın ! Deneyin l.push(a);==> +a&&l.push(a);(-15 bytes)
usandfriends

7

C, 282 Bayt

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

Biçimlendirilmiş:

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

Özellikleri :

Her kat 19.5myüksekse (tavan dahil), bu bina ekvatorun etrafına sarılacak kadar uzunsa, 2095984 katları hesaplayabilir ! 2095984*19.5=40871688m=~40000km=one 'lap' around the planet.


1
Güzel cevap, ama coğrafyaların biraz kapalı. Ekvatordan kuzey kutbuna olan mesafe tanımı gereği 10000km en.wikipedia.org/wiki/Metre yani ekvatorun çevresi 40000km'nin biraz üzerindedir.
Seviye Nehri St

1
Güzel yorum, ancak sayaç tanımınız biraz modası geçmiş. ;-)
murphy

@ steveverrill google’dan çıktığım ilk numarayı kullandım, hesaplamayı güncelleyeceğim.
x13

"İnt" tuşunu main'den bırakarak birkaç bayttan tasarruf edebilirsiniz. E etrafındaki diş telleri gerçekten gerekli mi? İlk whileolarak dönüştürülebilir forve bu da bazı kaşlı ayraçları bırakmanıza izin verir. t/=10ondan daha kısa bir bayttır t=t/10. forBirkaç bayttan tasarruf etmek için c döngüsüne 1 ekleyin -> a[c+1]olur a[c], diğer tüm sayılar aynı uzunluktadır. İki printfdöngüyü de birlikte birleştirirdim ve tekrar kaşlı ayraçları bıraktım .
aragaer

Bence "zemin yüksekliği" tanımınız biraz uzakta olabilir - tipik bir zemin yüksekliği 19,5 metre değil, yaklaşık 3 metredir.
nneonneo

6

Julia, 134 132 bayt

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

Oradaki komik boşluk, bir edebi sekme. Conor O'Brien'un belirttiği gibi, bu işlem yapmaktan daha kısa bir bayttır \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 bayt

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

Kullanabileceğin düşünmek i-13yerinei!=13
12Me21

6

JavaScript, 116 122

Düzenle Kaydetti 6 bytes thx @Neil

Basit dizi çözümü - ES6 kullanmıyorsunuz

Herhangi bir tarayıcıyla deneyin

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


Kullanarak 6 bayt kaydedebilirsiniz !/4/.test(v).
Neil

Tek bir bayt ' 'yerine '\t'(değişmez sekme)
Mwr247

6

Python 2 , 94 bayt

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

Çevrimiçi deneyin!

Dizede SE'nin oluşturmadığı bir sekme karakteri var (kullanılması önerilen Sp3000 sayesinde bir bayt tasarrufu).

Kattan cbaşlayarak katların -1kotasına nulaşılana kadar katları test eder . Her kat için, 4eşit 0veya eşit olmadığını test eder 13. Öyleyse, onu asansör dizesine shazırlar ve kotayı azaltır n.

Dize biçimlendirmeli bir hile, sütun başına iki katın hazırlandığında uygun sırada görünmesini sağlamak için kullanılır. Her yeni satır, '%d\t%%d\n'iki kat sırayla değiştirildiğinde, birincisi solda, ikincisi sağda olacak şekilde hazırlanır. Örneğin,

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

Çok güzel, ama aslında 96 bayttır . Muhtemelen sondaki virgül mü?
movatica

2
@movatica Sondaki virgülün yakalanması iyi, çünkü zorluk sondaki yeni satırı belirliyor. 1 baytlık fark, SE kod bloğunun sekmeleri görüntüleyememesiydi, bu yüzden a \t. Ah, TIO'dan önceki günler vardı.
xnor

5

C #, 296 bayt

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

Kullanılan golf püf noktaları:

  • i (çalışan sayaç) ve j (geçerli sayı), normalde olduğu gibi for ifadesi yerine döngü gövdesindeki ifadede sırasıyla azaltılır / artırılır
  • j+"" onun yerine j.ToString()
  • Her şeye namespace System.Collections.Genericyalnızca erişebilmemiz için değil List<T>, aynı zamanda Systembaşka bir nitelik olmadan ad alanını da kullanabilmek için yerleştirin.
  • Ad alanının usingiçini, using Linq;yerine yazabilmemiz için yerleştirin .using System.Linq;
  • .Insert(0,j)kullanmaktan daha kısa .Add(j)ve daha sonra.Reverse()

Bunun için using Linq;gerekli olması talihsiz bir durumdur, çünkü sadece ihtiyaç duyulmaktadır .Zip, fakat Linq.Enumerable.Zip()daha uzun olduğu gibi yazmaktır.


5

Ruby 2.3, 84 83 karakter

(82 karakter kodu + 1 karakter komut satırı seçeneği)

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

Örnek çalışma:

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 kodu + 1 karakter komut satırı seçeneği)

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

Örnek çalışma:

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 Bayt

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

Oldukça dümdüz, ilk önce tüm buton değerleri ile dolu bir masa monte ediyoruz. Ardından geriye doğru yineleriz, aynı anda iki değer yazdırırız veya ikinci değer yoksa hiçbir şey yapmazız.


4

Mathematica, 105 bayt

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

\tGerçek bir sekme karakteri ile değiştirin .


4

Brachylog , 105 bayt

,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 desteği ile çok daha kısa olurdu, burada ilk alt yüklemede yinelemeli tamsayıları denemeliyim.

Önümüzdeki yeni satır "w,?bb:2&}zorunludur, bu her satır arasında yazdırılan yeni satırdır.


Güzel! Bir soru: Neden Brachylog'daki tüm tamsayı aritmetiğini CLP (FD) sınırlamalarını otomatik olarak kullanmıyorsunuz? Bu doğal bir mantıksal uzantısı olacaktır.
mat

@ mat çünkü ben tembelim ve yapmadım. Ama yapmalıyım!
16'da

Bu harika olurdu! Tüm tamsayı aritmetiği için yerleşik CLP (FD) kısıtlamaları! Bildirimsel programlamanın geleceğini açın! "Ve binyılda elinizi balmumu gibi etkilemek sizi kutsuyormuş gibi görünmeli. Binyılların iradesini tunçtan daha zor - tunçtan daha zor, tunçtan daha asildir."
mat,

@ mat Bu sohbet odasında bana bunu tartışmak için katılabilir misiniz ? Prolog konusunda benden daha deneyimli birisinin tavsiyesine ihtiyacım var.
16'da 9

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

Bu sadece bir fonksiyondur. Ben C # için yeniyim. Artış 40-49 için geçerli olacak ve usings dahil

Ungolfed, eksiksiz bir koşu programı olarak:

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

Açıklaması

İki liste oluşturuyorum ve bunlara itmek arasında geçiş yapıyorum, onları tersine çeviriyorum, bir tanesine dönüyorum ve diğerini indeksle tutuyorum.


Ben C # hakkında pek bir şey bilmiyorum ama sen yerini alabilir if(s==1)tarafından if(s)(boolean int otomatik döküm?)
Fatalize

Hayır, çünkü diğeri s == 2 içindir, 1 ve 2 yerine 0 ve 1 bayrağını yapabilirim.
Kaz

3

Python 3, 155 bayt

Kat numarası üreticisini listelemek, tersine çevirmek ve kendi kendine sıkıştırmak, s()kendi iyiliği için çok akıllıca olabilir, ancak diğerleri zaten baytları koruyan Python 2'yi kullanmaktan bahsetmek yerine alternatifini (bir seferde iki öğe patlatarak) yaptı. bazı önemli noktalarda.

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)

Daha kısa, ancak daha önce bitmiş olan daha iyi bir alternatif 140 bayt alır.

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)

İkinci alternatif için, (0!=n!=13)!=('4'in str(n))ondan daha kısa 5 bayttır not(n in(0,13)or'4'in str(n)).
movatica

3

Japt, 42 bayt

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

Dört boşluk gerçek bir sekme char olmalıdır. Çevrimiçi deneyin!

Nasıl çalışır

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

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

Çevrimiçi deneyin (giriş yapmadan önce üstte 'çalıştır' ve sonra alttaki terminali tıklamanız gerekir; lua'yı stdin ve stdout ile çevrimiçi olarak test etmek için daha iyi bir yol arıyorum)


3

05AB1E , 25 23 22 bayt

@ ASCII-sadece sayesinde -1 bayt

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

Çevrimiçi deneyin!

açıklama

                           # 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. Bu çirkin 0 13ªkısmı biraz daha iyi yapmanın bir yolu olduğunu biliyordum . Teşekkürler!
Wisław

Bekle. mantıklı ve 05AB1E'de yok mu? O_o
ASCII-sadece

1
Eğer 1 doğru ve 0 yanlış ise çarpma mantıksal olarak çalışır ve
Wisław

Değiştirerek -1 bayt ʒ4å_}için 4мïê. Not: sizin yorumuna dayalı: 0 13ªolabilirdi ¾13ªde.
Kevin Cruijssen

3

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

Conor O'Brien'ın yerine literal tab kullanma fikri sayesinde 1 byte yarıda kesildi \t.

UPD 2: Gelişmiş mantık ve virgül kötüye kullanımı ile 55 bayt attı.

UPD 3: ceilingcat sayesinde başka bir bayt kapalı.

UPD 4: 7 bayt tavanı izniyle.

UPD 5: ve bir tavan baytı tarafından başka bir bayt.

Hepsinin yerinde olması mutlu ve hala C ve C # çözümlerini yeniyor.

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

iostreamiçerir string, böylece ikincil atlamayı bayt sayısında büyük bir düşüş için atlayabilirsiniz :)
movatica

@movatica cppreference.com'a göre değil ve VS2019'daki derleme onsuz başarısız olur. Bu nedenle, başka bir yerde derlerse, belirli standart kütüphane uygulamalarına özgüdür.
Alexander Revo

tamam, bir gcc olayı gibi görünüyor.
movatica


2

Java, 333 Bayt

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

Bir yığına izin verilen kat numaralarını ekler ve ardından yazdırmak için geri fırlatır.

Bir IntStream kullanarak oynuyordum, ancak tüm ithalatlarda bu daha küçük oldu.


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

Açıkçası bu Scala'd versiyonudur.
CJ Dennis,

2

Python 3, 117 Bayt

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 post'un python 3 spesifikasyonuna uyacak şekilde modifiye edilmiş hali.


2

PowerShell, 106 107 bayt

$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

Örnek

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

2

Haskell 202 bayt

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

Ben Haskell acemiyim…

  • ilk önce sonsuz bir değerler listesi oluşturun. (t listesi)
  • işlev 2 ile listeyi 2 öğenin alt listelerinde toplar.
  • ana değeri almak.
    • t listesinin değer elemanlarını almak
    • ilk önce greaters öğelerine sahip olmak için listeyi tersine çevirin
    • int listesini dize listesine dönüştürmek için harita gösterisi işlevi
    • by2 işlevli grup elemanı 2'ye 2
    • [] 4 "," 5 "], [" 6 "," 7 "]] gibi dönüştürülmüş [" 4 5 "," 6 7 "] gibi , listede eşlenmiş şifreleme işlevli bir listemiz var
    • listeyi kaldırır (listenin her öğesi '\ n' ile ayrılır)
    • Terminalde string yazmak için putStrLn ile bitirin.

by21 karakter ismi kullanarak ve yeniden sıralayarak çeşitli baytları tanımlayarak kaydedebilirsiniz : son satırınızı sonradan olduğu gibi kullanın b x = [x].
ballesta25

2

Javascript ES6 114 bayt

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

kullanım

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


2

Perl 6 , 73 bayt

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

Düzgün sayıda kat alır, çünkü sorun ifadesi de varsayıyor gibi görünmektedir ve en az bir başka garip kat sayısı için çözüm araları sağlamıştır. Tek sayıdaki katları desteklemek için dokuz bayta daha ,:partialikinci bir argüman ekleyin rotor.



2

Jöle , 20 bayt

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

Çevrimiçi deneyin!

Nasıl?

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

Bunu daha önce edc65 daha kısa bir tane yapmıştı fark ettim. Oh iyi!


1

R , 106 bayt

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

Çevrimiçi deneyin!

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.