Ascenseur de l'hôtel superstitieux

54

La description

Voici un ascenseur d'hôtel très superstitieux à Shanghai:

               entrez la description de l'image ici

Il évite le nombre 13, car treize est une malchance dans le monde occidental et le chiffre 4, car quatre dans une partie de l'Asie. Et si cet hôtel était plus grand?

Lire un entier pair positif ndans STDIN, représentant le nombre d'étages, et imprimer l'apparence de la disposition des boutons dans STDOUT:, -1suivie n-1des entiers positifs suivants qui ne sont pas égaux à 13 et ne contiennent pas le chiffre 4. Organisez ces numéros en deux colonnes, comme dans l'image ci-dessus: imprimez deux numéros d'étage par ligne, séparés par un onglet horizontal, de sorte que la lecture des lignes dans l'ordre inverse de gauche à droite génère la séquence dans l'ordre croissant. (Vous pouvez également éventuellement imprimer un caractère de fin de ligne suivant.)

Cas de test

Pour l'entrée 14, la sortie devrait être comme dans l'image ci-dessus:

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

où les espaces de chaque ligne sont constitués d’un seul caractère de tabulation horizontale.

Pour l'entrée 2, vous devez imprimer -1 1.

Pour l'entrée 100, vous devez imprimer:

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

Objectif

C'est du . La réponse la plus courte en octets l'emporte.

Lynn
la source
2
@Mauris 6138, peut-être pas, mais 113? Je pense que la clé serait de savoir si vous dites «treize ans» lorsque vous lisez le numéro à haute voix.
Random832
12
@ Random832 Ce que vous suggérez sont en réalité des modifications arbitraires de la spécification. L'étiquette du PPCG déconseille de tels changements une fois que les réponses ont été données, en particulier si les réponses existantes sont effectivement invalidées, ce qui serait le cas dans ce cas
Digital Trauma
8
FWIW, 4 n'est pas malchanceux. 4 sonne juste très semblable à "mourir" ou "mort" dans les divers dialectes chinois / langues.
Slebetman
10
@slebetman: Eh bien, oui, c'est pourquoi 4 est malchanceux. C'est toujours de la superstition, quelle qu'en soit l'origine! Mais cela devient un peu hors sujet.
Lynn
13
Attendez! En comptant les boutons, je vois que cet hôtel a exactement 13 étages (sans compter le sous-sol). Il n’est pas question que je reste là!
Level River St

Réponses:

8

Pyth, 27 octets

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

Essayez-le en ligne ici .

Obtient les .fpremiers Q-1nombres qui correspondent au filtre !=13et 4ne sont pas dans la représentation sous forme de chaîne du nombre. Puis, il ajoute des -1tabs ( C9) et des nouvelles lignes.

Maltysen
la source
19

Bash + utils communs, 51

seq 9$1|sed 13d\;/4/d\;1i-1|rs 0 2|sed $[$1/2]q|tac
  • seq génère des entiers ascendants de 1 à N avec un chiffre supplémentaire de 9 devant - plus que suffisant pour une entrée d’entier 64 bits
  • sedélimine les sols et inserts malchanceux -1avant la ligne 1
  • rs remodèle en deux colonnes séparées par des tabulations
  • sed arrête après N / 2 lignes
  • tac inverse l'ordre de la ligne de sortie
Trauma numérique
la source
Je peux raser 5 octets pour vous - remplacez l' sed $[$1/2]qaprès rspar sed $1qavant. Je pense que cela le rend également compatible avec le shell POSIX.
Toby Speight le
1
En fin de compte, la précédente 1ne suffira pas pour compenser le passage de seulement 0,9 ^ n des entrées (les nombres ne contenant pas 4deviennent de moins en moins nombreux à mesure que le nombre de chiffres augmente). Mais une fois que votre hôtel a plus de quelques centaines de millions d’étages, vous avez probablement d’autres problèmes, tels que le bon fonctionnement de la plomberie et l’organisation de rotations du personnel.
Toby Speight le
@TobySpeight, vous pourriez aussi avoir un ascenseur spatial :)
Digital Trauma
@TobySpeight Même avec le nombre entier maximum signé de 64 bits (9223372036854775807), préfixer simplement un 1 est (à peu près) suffisant - au moins avec mon calcul rudimentaire en base 9. Le reste de la réponse est limité à cette plage de toute façon en raison de l' $[]arithmétique de coque . Je pense que c'est une limite raisonnable en l'absence de mention explicite d'arithmétique de précision arbitraire dans la question. Quoi qu'il en soit, je préfixe maintenant un 9au lieu de 1, juste pour être sûr.
Digital Trauma
10

JavaScript ES6, 236 234 233 210 195 188 octets

J'ai sauvé un tas d'octets grâce à usandfriends!

Utilise le function*pour les générateurs. Probablement un moyen plus court de faire cela, mais c'était amusant. Bien amusant. Je parie que le golf peut être fait. Ces étranges espaces blancs sont des onglets.

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`
`
Conor O'Brien
la source
z=+prompt(i=x=0,l=[]);==> z=prompt(i=x=0,l=[]);(-1 octet)
amis copains
@usandfriends Merci! J'ai oublié la conversion de type automatique.
Conor O'Brien
.joinavec onglet et remplacez l'espace dans /-?\d+ \d+/gonglet, supprimez .map(x=>x.replace(/ /,"\t"))(devrait enregistrer 23 octets)
usandfriends
1
.filter(x=>x!=".0")==> .filter(x=>+x), (-5 bytes)
amis copains
2
^ Grattez cela , retirez simplement la .filter(..)partie entière ! Essayez l.push(a);==> +a&&l.push(a);(-15 octets)
amis copains
7

C, 282 octets

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

Formaté:

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

Traits :

Il peut calculer jusqu'à 2095984 étages, si chaque étage est 19.5mhaut (plafond compris), alors ce bâtiment est suffisamment long pour être enroulé autour de l'équateur! 2095984*19.5=40871688m=~40000km=one 'lap' around the planet.

x13
la source
1
Bonne réponse, mais votre géographie est un peu en retrait. La distance entre l'équateur et le pôle nord est de 10000 km par définition en.wikipedia.org/wiki/Metre, ce qui signifie que la circonférence de l'équateur est légèrement supérieure à 40000 km.
Level River St
1
Beau commentaire, mais votre définition du compteur est un peu dépassée. ;-)
murphy
@steveverrill Je viens d'utiliser le premier numéro que j'ai obtenu de Google, je vais mettre à jour le calcul.
x13
Vous pouvez économiser quelques octets en supprimant "int" de main. Les accolades autour de E sont-elles vraiment nécessaires? Premier whilepeut être converti en foret cela vous permet de déposer des accolades. t/=10est un octet plus court que t=t/10. Ajoutez 1 à c dans votre forboucle pour enregistrer quelques octets -> a[c+1]devient a[c], alors que tous les autres nombres ont la même longueur. Je combinerais également deux printfs dans la boucle et laisserais tomber les accolades.
aragaer
Je pense que votre définition de "hauteur de plancher" est peut-être un peu éloignée - un plancher typique mesure environ 3 m de haut, pas 19,5 m de haut.
nneonneo
6

Julia, 134 132 octets

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

Cet espace blanc amusant contient un onglet littéral. Comme l'a noté Conor O'Brien, il s'agit d'un octet plus court que le faire \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
Alex A.
la source
6

Python 2, 120 à 110 octets

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
TFeld
la source
Je pense que vous pouvez utiliser i-13au lieu dei!=13
12Me21
6

JavaScript, 116 122

Modifier 6 octets enregistrés @Neil

Solution de baie simple - sans même utiliser ES6

Essayez avec n'importe quel navigateur

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

edc65
la source
Vous pouvez enregistrer 6 octets en utilisant !/4/.test(v).
Neil
Vous pouvez enregistrer un seul octet avec ' 'au lieu de '\t'(onglet littéral)
Mwr247
6

Python 2 , 94 octets

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

Essayez-le en ligne!

Il y a un caractère de tabulation dans la chaîne que SE ne rend pas (merci à Sp3000 de suggérer de l'utiliser, en sauvegardant un octet).

Tester les sols à cpartir du sol -1jusqu’à natteindre le quota de sols. Pour chaque étage, teste qu'il ne contient pas 4ni ni égal 0ni 13. Si tel est le cas, l'ajoute à la chaîne d'élévateur set décrémente le quota n.

Une astuce avec un formatage de chaîne est utilisée pour que les deux étages par colonne apparaissent dans le bon ordre une fois ajoutés. Chaque nouvelle ligne est préparée comme '%d\t%%d\n', de sorte que lorsque deux étages sont substitués dans l’ordre, le premier est à gauche et le second à droite. Par exemple,

('%d\t%%d\n'%2)%3 == ('2\t%d\n')%3 == '2\t3\n'  
Xnor
la source
Plutôt cool, mais en réalité c'est 96 octets . Supprimer probablement la virgule de fuite?
movatica
2
@movatica Bonne prise sur la virgule de fin, car le défi spécifie que la nouvelle ligne est bonne. La différence de 1 octet était due au fait que le bloc de code SE ne peut pas afficher les onglets, j'ai donc mis un \t. Ah, les jours avant TIO existaient.
xnor
5

C #, 296 octets

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

Astuces de golf utilisées:

  • i (le compteur en cours d'exécution) et j (le nombre actuel considéré) sont respectivement décrémentés / incrémentés à l'intérieur de l'expression dans le corps de la boucle au lieu de l'instruction for
  • j+"" au lieu de j.ToString()
  • Placez tout à l'intérieur, namespace System.Collections.Genericnon seulement pour que nous puissions accéder List<T>, mais également implicitement pour utiliser l'espace de noms Systemsans autre qualification
  • Placez l' usingintérieur du nom pour pouvoir écrire using Linq;au lieu deusing System.Linq;
  • .Insert(0,j)est plus courte que l'utilisation .Add(j)et l'application ultérieure.Reverse()

Il est regrettable que cela using Linq;soit nécessaire, car il n’est nécessaire que pour .Zip, mais l’écrire tel quel Linq.Enumerable.Zip()est plus long.

Timwi
la source
5

Ruby 2.3, 84 83 caractères

(Option de ligne de commande code 82 caractères + 1 caractères)

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

Échantillon échantillon:

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 caractères

(Code de 91 caractères + option de ligne de commande de 1 caractère)

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

Échantillon échantillon:

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
homme au travail
la source
4

Lua, 169 octets

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

De manière assez simple, nous assemblons d’abord une table contenant toutes les valeurs des boutons. Ensuite, nous le parcourons en arrière, en imprimant deux valeurs à la fois, ou rien si la deuxième valeur n’existe pas.

Nikolai97
la source
4

Mathematica, 105 octets

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

Remplacez le \tpar un caractère de tabulation réel.

LegionMammal978
la source
4

Brachylog , 105 octets

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

Cela aurait été beaucoup plus court avec le support CLPFD, ici je dois essayer de manière itérative des entiers dans le premier sous-prédicat.

La nouvelle ligne avant "w,?bb:2&}est obligatoire. Il s'agit de la nouvelle ligne imprimée entre chaque ligne.

Fataliser
la source
Agréable! Une question: pourquoi ne pas faire en sorte que toute l' arithmétique des nombres entiers dans Brachylog utilise automatiquement les contraintes CLP (FD)? Ce serait une extension logique naturelle.
Mat
@mat parce que je suis paresseux et je ne l'ai pas fait. Mais je devrais!
Fataliser
Ce serait génial! Contraintes CLP (FD) implicites intégrées pour toute arithmétique entière! Paver l'avenir de la programmation déclarative! "Et cela doit sembler une bénédiction pour vous d'imprimer votre main sur des millénaires comme sur de la cire. Béni soit d'écrire sur la volonté de millénaires comme sur du bronze - plus dur que le bronze, plus noble que le bronze. Seul le plus noble est tout à fait dur."
mat
@mat Pourriez-vous vous joindre à moi dans cet espace de discussion pour en discuter? J'ai besoin des conseils de quelqu'un manifestement plus expérimenté que moi avec Prolog.
Fataliser
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'est comme une fonction seulement. Je suis nouveau en C #. Augmentation était de rendre valable pour 40-49, et notamment usings

Ungolfed, en tant que programme complet en cours:

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 expliqué

Je crée deux listes et je les alterne, les inversant, les parcourant l'une après l'autre et prenant l'autre par index.

OIE
la source
Je ne connais pas grand chose à propos de C # mais ne pouvez-vous pas le remplacer if(s==1)par if(s)(
transtypage
Non, parce que le reste est pour s == 2, bien que je puisse faire les drapeaux 0 et 1 au lieu de 1 et 2. Je vais essayer.
Goose
3

Python 3, 155 octets

Je pense que l'écoute, l'inversion et l'auto-compression du générateur de numéros d'étage s()ont peut-être été trop astucieux pour son propre bien, mais d'autres ont déjà fait l'alternative (sauter deux éléments à la fois), sans parler de l'utilisation de Python 2 qui économise des octets. sur certains points clés.

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)

L'alternative plus courte, mais déjà faite, prend 140 octets.

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)
Tim Pederick
la source
Pour la deuxième alternative, (0!=n!=13)!=('4'in str(n))5 octets de moins que not(n in(0,13)or'4'in str(n)).
movatica
3

Japt, 42 octets

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

Les quatre espaces doivent être un caractère de tabulation réel. Essayez-le en ligne!

Comment ça fonctionne

          // 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
ETHproductions
la source
3

Lua, 141 octets

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

Essayez-le en ligne (vous devez cliquer sur «exécuter» en haut, puis sur le terminal en bas avant de taper le texte saisi; je cherche un meilleur moyen de tester lua en ligne avec stdin et stdout)

QuertyKeyboard
la source
3

05AB1E , 25 23 22 octets

-1 octet grâce à @ ASCII uniquement

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

Essayez-le en ligne!

Explication

                           # 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
Wisław
la source
1
22?
ASCII uniquement le
Ah Je savais qu'il y avait un moyen d'améliorer cette 0 13ªpartie laide . Merci!
Wisław le
attendez. il n'y a pas de logique et dans 05AB1E? O_o
ASCII uniquement le
1
Si 1 est vrai et 0 est faux, la multiplication fonctionne de manière logique et
Wisław le
-1 octet en passant ʒ4å_}à 4мïê. PS: sur la base de votre commentaire précédent: 0 13ªaurait pu l'être ¾13ªaussi.
Kevin Cruijssen
3

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

Réduit d'un octet, grâce à l'idée de Conor O'Brien d'utiliser un onglet littéral au lieu de \t.

UPD 2: réduction de 55 octets avec une logique améliorée et un abus de virgule.

UPD 3: un autre octet désactivé grâce à ceilingcat.

UPD 4: 7 octets de courtoisie de ceilingcat.

UPD 5: et un autre octet désactivé par ceilingcat.

Heureux d'avoir tout inclus en place ET de battre les solutions C et C #.

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

Ungolfed:

#include <iostream>
#include <string>

int main()
{
    std::string o = "-1 1", c, b;
    int n, i = 2, s = 2;
    for (std::cin >> n;
         s < n;
         o = i == 14 | ~c.find(52) ? o : (++s & 1 ? b = c, "" : b + '   ' + c + '\n') + o
    )
        c = std::to_string(i++);
    std::cout << o;
}
Alexander Revo
la source
iostreamcomprend string, de sorte que vous pouvez ignorer le deuxième inclure pour une forte diminution du nombre de byt :)
movatica
@movatica Pas selon cppreference.com, et la compilation dans VS2019 échoue sans cela. Donc, si elle compile quelque part, elle est spécifique à cette implémentation de librairie standard.
Alexander Revo
ok, semble être une chose gcc.
movatica
191 octets
ceilingcat
2

Java, 333 octets

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

Ajoute les numéros d'étage autorisés à une pile, puis les retire pour les imprimer.

J'ai joué avec IntStream, mais avec toutes les importations, celle-ci est devenue plus petite.

Brett C.
la source
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))}
Nitin Nizhawan
la source
Ceci est évidemment la version en baisse Scala'd.
CJ Dennis
2

Python 3, 117 octets

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)

Version modifiée de la publication python 2 pour s’adapter à la spécification Python 3.

Chiel ten Brinke
la source
2

PowerShell, 106 107 octets

$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

Exemple

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

Haskell 202 octets

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

Je suis débutant en haskell…

  • commencez par créer la liste infinie de valeurs. (t liste)
  • function by2 regroupe une liste en sous-listes de 2 éléments.
  • principal prendre la valeur.
    • prendre des éléments de valeur de t liste
    • inverser la liste pour avoir d’abord des éléments superbes
    • map show function pour convertir la liste int en liste
    • élément de groupe 2 par 2 avec fonction by2
    • Nous avons une liste comme [["4", "5"], ["6", "7"]] transformée comme ["4 5", "6 7"] avec la fonction des mots non définis mappée sur la liste
    • annule la liste (chaque élément de la liste est séparé par '\ n')
    • terminez avec putStrLn pour écrire une chaîne sur le terminal.
Capello
la source
Vous pouvez enregistrer plusieurs octets lors de la définition by2en utilisant un nom à 1 caractère et en le réorganisant: utilisez votre dernière ligne telle quelle, puis b x = [x]après.
ballesta25
2

Javascript ES6 114 octets

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

Usage

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

Charlie Wynn
la source
2

Perl 6 , 73 octets

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

Suppose un nombre pair d’étages, puisque l’énoncé du problème semble le supposer également et qu’au moins une autre solution proposée rompt avec un nombre impair d’étages. Ajoutez simplement ,:partialun deuxième argument à rotor, pour neuf octets supplémentaires, afin de prendre en charge un nombre impair d'étages.

Sean
la source
55 octets
Jo King le
2

Gelée , 20 octets

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

Essayez-le en ligne!

Comment?

ḟ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
Jonathan Allan
la source
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,''))

A fait cela avant que je réalise que edc65 en avait déjà fait un plus court. Tant pis!

Mwr247
la source
1

R , 106 octets

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

Essayez-le en ligne!

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=""))
Robin Ryder
la source