迷信的なホテルのエレベーター


54

説明

上海にある非常に迷信的なホテルエレベーターを次に示します。

               ここに画像の説明を入力してください

13は西側世界では不運であるため13を避け、4はアジアの一部で不運であるため4を避けます。このホテルが高かった場合はどうなりますか?

nフロアの数を表す正の偶数整数をSTDINから読み取り、STDOUTにボタンレイアウトがどのように見えるかを出力します。13に等しくなく、数字4を含まない-1次のn-1正の整数が続きます。上の画像のような2列の数字:水平タブで区切られた行ごとに2つのフロア番号を印刷し、左から右に逆の順序で行を読み取ると、昇順でシーケンスが生成されるようにします。(オプションで、末尾の改行文字も印刷できます。)

テストケース

入力の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?重要なのは、数字を読み上げたときに「13」と言うかどうかだと思います。
Random832

12
@ Random832提案するのは、仕様に対する実質的に任意の変更です。答えは、彼らが、この場合にも思われる、既存の回答は効果的に無効にされている場合は特に、与えられた後PPCGのエチケットは、このような変化を阻止
デジタルトラウマ

8
FWIW、4は不運ではありません。4は、さまざまな中国の方言/言語の「死」または「死」に非常によく似ています。
スリーブマン

10
@slebetman:そうですね、そういうわけで 4は不運です。起源が何であれ、それはまだ迷信です!しかし、それは少し話題から外れています。
リン

13
待つ!ボタンを数えると、ホテルにはちょうど13階(地下室を除く)があることがわかります。そこにとどまる方法はありません
レベルリバーセント

回答:



19

Bash +一般的なユーティリティ、51

seq 9$1|sed 13d\;/4/d\;1i-1|rs 0 2|sed $[$1/2]q|tac
  • seq 1からNまでの昇順の整数を生成します。前に9桁が追加されます-64ビット整数入力には十分です
  • sed不幸なフロアを除外し、-11行目の前に挿入します
  • rs タブで区切られた2つの列に変形します
  • sed N / 2行後に停止
  • tac 出力行の順序を逆にします

私はあなたのために5バイトを剃ることができます- sed $[$1/2]qrssed $1q前に置き換えます。POSIXシェルとの互換性も得られると思います。
トビー・スパイト

1
最終的に、前述の方法で1は、入力の0.9 ^ nのみを渡すことを補償するのに十分ではありません(4桁数が増えるにつれて、get sparserおよびsparser を含まない数値)。しかし、ホテルのフロアが数億を超えると、配管の機能を維持したり、スタッフのロータスを整理したりするなど、他の問題が発生する可能性があります。
トビー・スペイト

@TobySpeightにはスペースエレベーターもあるかもしれません:)
デジタルトラウマ

@TobySpeight入力として最大の符号付き64ビット整数(9223372036854775807)であっても、少なくとも基本的な9の計算では、1をプレフィックスするだけで(ほぼ)十分です。とにかく、シェル$[]算術のため、残りの答えはこの範囲に制限されます。これは、問題に任意精度演算の明示的な言及がない場合、合理的な制限だと思います。とにかく、私は安全のために、の9代わりにの 接頭辞を付けてい1ます。
デジタル外傷

10

JavaScriptのES6、236の 234 233 210 195 188バイト

usandfriendsに感謝します。

function*forジェネレーターを使用します。おそらくこれを行うより短い方法ですが、楽しかったです。ウェイ楽しいです。ゴルフができると確信します。これらの奇妙な空白はタブです。

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ありがとうございます!自動型変換を忘れました。
コナーオブライエン

.joinタブを使用し、スペースをタブに置き換え/-?\d+ \d+/g、削除します.map(x=>x.replace(/ /,"\t"))(23バイトを節約する必要があります)
-usandfriends

1
.filter(x=>x!=".0")==> .filter(x=>+x)、(
-usandfriends

2
^それを傷つけて、ただ全体を削除して.filter(..)ください!Try l.push(a);==> +a&&l.push(a);
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 );
}

特徴 :

最大2095984階まで計算でき19.5mます。各階が高い(天井を含む)場合、この建物は赤道を囲むのに十分な長さです。2095984*19.5=40871688m=~40000km=one 'lap' around the planet


1
いい答えですが、地理は少しずれています。赤道から北極までの距離は、定義によりen.wikipedia.org/wiki/Metreで10000kmです。これは、赤道の周囲が40000kmを少し超えることを意味します。
レベルリバーセント

1
いいコメントですが、メーターの定義は少し時代遅れです。;-)
マーフィー

@steveverrill私はグーグルから降りた最初の数字を使ったばかりで、計算を更新します。
x13

mainから「int」をドロップすることにより、数バイトを節約できます。Eの周りの中括弧は本当に必要ですか?最初whileに変換forできます。これにより、中括弧を削除できます。t/=10は、より短いバイトですt=t/10forループ内でcに1を追加して数バイトを節約します->にa[c+1]なりa[c]ますが、他のすべての数値は同じ長さです。またprintf、ループ内の2つのsを組み合わせて、中括弧を再びドロップします。
アラゲール

「床の高さ」の定義は少しずれていると思います-典型的な床の高さは約19.5mではなく、約3mです。
-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 O'Brienが述べたように、これはを行うよりも短いバイト\tです。

ゴルフをしていない:

# 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

パイソン2、120の 110バイト

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

シンプルなアレイソリューション-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)
ニール

(リテラルタブ)の' '代わりに1バイトを保存できます'\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フロアからフロアをテストします。各フロアについて、それがorに等しいまたはを含まないことをテストします。その場合、それをエレベータ文字列の先頭に追加し、クォータを減らします。-1n4013sn

文字列の書式設定のトリックを使用して、列ごとに2つのフロアを追加し、適切な順序で表示します。それぞれの新しい行はとして準備され'%d\t%%d\n'、2つのフロアが順番に置換されると、最初のフロアが左側に、2番目のフロアが右側になります。例えば、

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

かなりクールですが、実際には96バイトです。おそらく末尾のコンマを削除しますか?
movatica

2
@movaticaチャレンジでは末尾の改行が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)));}}}

ゴルフをしていない:

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

使用されるゴルフのトリック:

  • i(実行中のカウンター)およびj(考慮中の現在の数)は、通常のforステートメントではなく、ループ本体の式内でそれぞれ減少/増加します
  • j+"" の代わりに j.ToString()
  • 内部にすべてを配置して、namespace System.Collections.Genericアクセスできるようにするだけでなく、さらに修飾せずにList<T>名前空間Systemを暗黙的に使用します
  • using名前空間内に配置して、using Linq;代わりに記述できるようにしますusing System.Linq;
  • .Insert(0,j)使用.Add(j)して後で適用するよりも短い.Reverse()

using Linq;が必要なのは不幸なことです、なぜならそれはのためだけに必要であるが.Zip、それをLinq.Enumerable.Zip()より長く書くように。


5

ルビー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

ルビー、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

かなり簡単です。まず、すべてのボタンの値で満たされたテーブルを組み立てます。次に、逆方向に繰り返し処理し、一度に2つの値を印刷します。2番目の値が存在しない場合は何も印刷しません。


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&}は必須です。これは、各行の間に印刷される新しい行です。


いいね!1つの質問:Brachylogのすべての整数演算でCLP(FD)制約を自動的に使用しないのはなぜですか?これは自然な論理的拡張です。
マット

@mat。私は怠け者で、そうしなかったからです。しかし、私はすべきです!
16年

それは素晴らしいことです!すべての整数演算のための組み込みの暗黙的なCLP(FD)制約!宣言型プログラミングの未来を切り開く!「そして、蝋のように千年にあなたの手を印象づけることは、あなたにとって祝福のように思われなければなりません。青銅のように千年の意志を書く祝福。
マット

@mat これについて議論するために、このチャットルームに参加してください。私より明らかにPrologの経験が豊富な人からのアドバイスが必要です。
16年

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のために有効にすることだった、とを含むためusing

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

説明した

2つのリストを作成し、それらをプッシュ、リバース、1つをループ、もう1つをインデックスで取得することを交互に繰り返します。


C#についてはあまり知りませんがif(s==1)if(s)(intからbooleanへの自動キャスト?)に置き換えることはできません
16年

いや、elseはs == 2のためです。ただし、フラグを1と2の代わりに0と1にすることもできます。
グース

3

Python 3、155バイト

フロア番号ジェネレーターをリスト、反転、および自己圧縮s()することは、それ自体ではあまりにも賢いかもしれませんが、バイトを節約するPython 2を使用することは言うまでもなく、他の人がすでに代替を行っています(一度に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)

2番目の選択肢で(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'    } ·

4つのスペースは実際のタブ文字でなければなりません。オンラインでお試しください!

使い方

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

非ゴルフ

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をオンラインでテストするより良い方法を探しています)


3

05AB1E25 23 22バイト

@ASCIIのみのおかげで-1バイト

·Ý<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ª部分をもう少し良くする方法があることは知っていました。ありがとう!
ヴィスワフ

待つ。05AB1Eには論理的なものはありませんか?O_o
ASCIIのみ

1
1が真、0が偽の場合、乗算は論理として動作します
Wisław

-1バイトに変更ʒ4å_}して4мïê。PS:あなたの以前のコメントに基づく:同様にあった0 13ªかもしれない¾13ª
ケビンクルーッセン

3

C ++ 11、259の 258 203 202 195 194バイト

Conor O'Brienがの代わりにリテラルタブを使用するというアイデアのおかげで、1バイトを削減しました\t

UPD 2:改善されたロジックとコンマの乱用により55バイトを削減しました。

UPD 3:ceilingcatのおかげでもう1バイトオフ。

UPD 4:ceilingcatのおかげで7バイトオフ。

UPD 5:およびceilingcatによる別のバイト。

すべてがインクルードされていて、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;}

ゴルフをしていない:

#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ため、バイトカウントの大幅な減少のために2番目のインクルードをスキップできます:)
movatica

@movatica cppreference.comによると、VS2019でのコンパイルはそれなしでは失敗します。したがって、他の場所でコンパイルする場合、その特定の標準ライブラリの実装に固有です。
アレクサンダー・レボ

OK、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を使用して遊んでみましたが、すべてのインポートでこの1つは小さくなりました。


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

これは明らかにScala'd downバージョンです。
CJデニス

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 3仕様に合わせてpython 2投稿のバージョンを変更しました。


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

非ゴルフ

# 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リスト)
  • function by2は、リストを2つの要素のサブリストにグループ化します。
  • メインは値を取る。
    • tリストの値要素を取る
    • リストを逆にして最初により大きい要素を持たせる
    • intリストを文字列リストに変換するshow関数をマップします
    • by2関数で要素2を2でグループ化
    • [["4"、 "5"]、["6"、 "7"]]のようなリストがあり、unwords関数がリストにマッピングされた["4 5"、 "6 7"]のように変換されています
    • リストの線を外します(リストの各要素は「\ n」で区切られます)
    • putStrLnで終了して、端末に文字列を書き込みます。

by21文字の名前を使用して順序を変更することで、定義時に数バイトを節約できます。最後の行をそのまま使用し、その後で使用します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}

問題ステートメントも同じように仮定しているように見えるため、偶数のフロアを想定し、奇数のフロアに対して少なくとも1つの提供されたソリューションが中断します。奇数のフロアをサポートするために,:partial、2番目の引数としてrotorさらに9バイトを追加します。



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.