Ordre antiferromagnétique


16

Antiferromagnetic ordering

L'antiferromagnétisme est ce que les chercheurs d'IBM utilisaient pour passer d'un disque de 1 téraoctet à un disque de 100 téraoctet dans la même quantité d'atomes.

Dans les matériaux qui présentent un antiferromagnétisme, les moments magnétiques des atomes ou des molécules, généralement liés aux spins d'électrons, s'alignent de façon régulière avec les spins voisins (sur différents sous-réseaux) pointant dans des directions opposées.

Votre travail consiste à écrire un programme qui dessine l'ordre des atomes antiferromagnétiques comme l'image ci-dessus. Vous devez être en mesure d'avoir au moins quatre ensembles de paires, bien que vous puissiez en avoir plus.

Chaque paire doit être représentée comme suit, bien qu'il s'agisse de flèches réelles :

 de haut en bas
en bas
 de haut en bas

Votre sortie peut être en art ascii ou en sortie graphique.

Vous ne pouvez créer qu'une fonction ou un programme entier, mais il doit prendre une entrée et dessiner autant de paires. Exemples avec seulement des mots :

Entrée: 1

 de haut en bas
en bas
 de haut en bas

Entrée: 2

 haut bas bas 
vers le bas vers le haut  
 haut bas bas

Flèches acceptables:

  • et
  • et
  • /|\ et \|/

Veuillez mettre vos réponses au format Langue, X octets , car elles sont faciles à lire. Le moins d'octets gagne!


5
"Toutes les flèches" me semble assez ambigu - qu'en est-il ^v?
Sp3000

1
@ Sp3000 Non, car ils n'ont pas la petite queue.
phase

2
Ces flèches sont-elles autorisées: et ? ( points de code unicode U + 21C5 et U + 21F5 )
Digital Trauma

1
@DigitalTrauma Ils sont parfaits!
phase

11
@Phase J'ai annulé votre modification. Changer le score d'octets en caractères changera considérablement les scores pour beaucoup de ces réponses. Changer les règles après avoir obtenu 15 réponses est généralement mal vu.
Digital Trauma

Réponses:


16

APL, 18 12 octets

⍉(2×⎕)3⍴'↑↓'

Cela construit une matrice 2n x 3, où n est l'entrée ( ), remplie des caractères et . La transposition ( ) de cette matrice est ensuite imprimée.

Vous pouvez l' essayer en ligne .


Bon abus du jeu de caractères APL. Je suppose que d'autres réponses peuvent également utiliser ce jeu de caractères.
jimmy23013

1
@ jimmy23013: La page de codes APL est basée sur EBCDIC. Je ne sais pas combien de langues peuvent gérer cela.
Dennis

@Dennis Le programme lui-même ne peut-il pas être en ASCII (ou du charabia en EBCDIC) pendant qu'il imprime des chaînes EBCDIC? Le raccourci pour les nouvelles lignes disparaîtrait cependant. Alternativement, la console Windows semblait s'imprimer \x18\x19comme ↑↓.
jimmy23013


@ jimmy23013: Oui, je viens de parler des anciennes consoles dans le chat . Le charabia pourrait fonctionner, mais cela vaut probablement une méta-discussion.
Dennis

12

Pyth, 15 octets (11 caractères)

V3.>*Q"↑↓"N

Essayez-le en ligne: Démonstration

Explication:

              implicit: Q = input number
V3            for N in [0, 1, 2]:
      "↑↓"       string "↑↓"
    *Q           repeat Q times
  .>      N      rotate the string by N

12

Java, 313 296 octets

Voici un exemple qui affiche graphiquement des flèches:

import java.awt.*;void f(int n){new Frame(){public void paint(Graphics g){for(int k=0,l,m,o;k<n*6;o=k%6,l=o/2*10+32,m=k/6*20+(k++%2==0?19:29),g.fillPolygon(new int[]{m+4,m,m+4,m+4,m+6,m+6,m+10},o==1|o==2|o==5?new int[]{l+9,l+5,l+5,l,l,l+5,l+5}:new int[]{l,l+5,l+5,l+9,l+9,l+5,l+5},7));}}.show();}

Dans un format plus lisible:

import java.awt.*;
void f(int n) {
    new Frame() {
        public void paint(Graphics g) {
            for (int k = 0, l, m, o; k < n*6;){
                o = k % 6;
                l = o / 2 * 10 + 32;
                m = k / 6 * 20 + (k++ % 2 == 0 ? 19 : 29);
                g.fillPolygon(new int[] {m+4,m,m+4,m+4,m+6,m+6,m+10},
                              o == 1 || o == 2 || o == 5 ?
                                  new int[] {l+9,l+5,l+5,l,l,l+5,l+5} :
                                  new int[] {l,l+5,l+5,l+9,l+9,l+5,l+5},
                              7);
            }
        }
    }.show();
}

L'affichage pour 5 en entrée:

Display for 5 as input

Vous devrez redimensionner la fenêtre qui apparaît pour voir les flèches. J'ai essayé de faire en sorte qu'aucun d'entre eux n'apparaisse "coupé" par la bordure intérieure de la fenêtre, mais cela peut apparaître de cette façon sur certaines plates-formes.


9

CJam, 18 octets (14 caractères)

ri3*"↑↓"*3/zN*

Générez les colonnes (qui forment un motif répétitif) puis transposez.

Essayez-le en ligne .


Alternative 18 octets:

3,ri"↑↓"*fm>N*

Faites pivoter la chaîne "↑↓"*nde 0, 1 ou 2 fois.


7

CJam (15 caractères, 19 octets)

ri"↑↓"*_(+1$]N*

Démo en ligne


1
La condition de gain est des octets, pas des caractères.
isaacg

@PeterTaylor: la langue spécifiée par le défi , format X octets . Vous l'avez au format char, mais les caractères unicode valent 2 octets donc votre score réel est de 17 octets
Levi

@Levi Selon cela, ils sont chacun 3 octets.
isaacg

@isaacg ah my bad
Levi

7

Befunge, 71 octets

Ma première réponse, alors soyez gentil avec moi: o)

Des problèmes d'alignement ennuyeux ont entraîné quelques octets gaspillés, si vous avez des améliorations pour moi, j'aimerais les entendre!

&::3>:2% #v_0#v" \|/ "<
  >\^,*52<> 0#v" /|\ "<
:#^_$1-:#^_@  >:#,_$\1-

Entrée: 4

 /|\  \|/  /|\  \|/  /|\  \|/  /|\  \|/ 
 \|/  /|\  \|/  /|\  \|/  /|\  \|/  /|\ 
 /|\  \|/  /|\  \|/  /|\  \|/  /|\  \|/ 


5

Pyth, 16 octets (12 caractères)

J"↑↓"V3*~_JQ

Exemple:

Input: 4
Output:
↑↓↑↓↑↓↑↓
↓↑↓↑↓↑↓↑
↑↓↑↓↑↓↑↓

5

Python 2, 131 122 octets

from turtle import*
for k in range(input()*6):z=k/3+k%3&1;pu();goto(k/3*32,z*32^k%3*64);pd();seth(z*180+90);fd(32);stamp()

Eh bien ... j'ai battu C Java je suppose?

enter image description here


J'ai choisi la hauteur 32des flèches, qui est assez grande, donc après un certain temps, la tortue commence à dessiner hors écran. Si vous voulez que tout convienne à de grandes entrées, vous pouvez soit réduire les flèches en remplaçant les 32s, soit utiliser screensize()(je ne suis pas sûr qu'il y ait un méta post sur la sortie hors écran ...)


1
Alors ... quand allez-vous ajouter des graphiques de tortues à Pyth?
Digital Trauma

Sûrement à des fins de golf, vous devez choisir un numéro à un chiffre pour le dimensionnement ...
Beta Decay

@BetaDecay Pour le dimensionnement à un chiffre, la queue est à peine visible, car elle est masquée par la tortue
Sp3000

4

GNU sed, 25 octets

J'ai trouvé les symboles de flèche et unicode, qui permettent plus de raccourcissement et ils ont été autorisés par ce commentaire :

h
s/1/⇅/g
H
G
s/1/⇵/g

L'entrée est unaire , donc par exemple 4 est 1111:

$ echo 1 | sed -f antiferro.sed
⇅
⇵
⇅
$ echo 1111 | sed -f antiferro.sed
⇅⇅⇅⇅
⇵⇵⇵⇵
⇅⇅⇅⇅
$ 

Réponse précédente au cas où et refusée:

GNU sed, 39 octets

s/1/↑↓/g
s/.*/&a&↑\n&/
s/a↑/\n/

3
Chaque fois que je vois "GNU sed" en haut d'un post, je n'ai même pas besoin de faire défiler vers le bas pour savoir qui l'a posté.
Alex A.

@AlexA. Ce mec? ;-)
Digital Trauma

L'entrée est unaire?! Est-ce un général pour la langue ou quelque chose dans lequel vous avez programmé?
Beta Decay

1
Quelle réponse néfaste :-)
xebtl

1
@BetaDecay est la propriété unique des chaînes unaires - leur valeur numérique est égale à leur longueur. La méta question / réponse permet cela strictement pour les langues qui n'ont pas d'arithmétique native (par exemple sed). Ceci est particulièrement pratique pour cette question, car la sortie de la longueur requise peut facilement être générée à partir de l'entrée unaire. Cheaty? peut-être - mais le consensus de la méta-réponse semble être d'accord avec ça.
Digital Trauma

3

Swift 2, 66 octets

let f={n in(0..<n*3).map{print("↑↓",appendNewline:$0%n==n-1)}}

Si Swift était juste un peu moins verbeux, ce ne serait même pas si mal pour le golf (je vous regarde, paramètre nommé appendNewline)


3

Ruby 39 (ou 44) caractères, 43 (ou 48) octets

Selon https://mothereff.in/byte-counter, les flèches sont de 3 octets chacune!

->(n){a=['↑↓'*n]*3;a[1]=a[1].reverse;a}

Une fonction anonyme qui renvoie un tableau. Si la fonction doit imprimer le tableau, elle doit se terminer par puts a5 octets supplémentaires.

Exemple d'utilisation

f=->(n){a=['↑↓'*n]*3;a[1]=a[1].reverse;a}

puts f.call(6)

Donne

↑↓↑↓↑↓↑↓
↓↑↓↑↓↑↓↑
↑↓↑↓↑↓↑↓

3

J, 41 35 32 octets (28 caractères)

3$(,:|.)(2*".1!:1[1)$ucp'↑↓'

Je n'ai jamais rien programmé en J, donc cela m'a pris du temps, et ce n'est certainement pas la meilleure façon de le faire.

Cela attend que vous saisissiez un nombre lors de l'exécution avant de sortir les flèches.


Que voulez-vous dire que vous n'avez rien programmé en J? Je semble me souvenir d'une certaine réponse J qui vous a fait dépasser 1 000 répétitions. ;)
Alex A.

@AlexA. Faire de l'arithmétique simple n'est pas vraiment ce que j'appellerais de la programmation. Quand j'ai posté cette réponse, je ne savais vraiment rien de J à part la priorité de droite à gauche
Fatalize

2

Javascript (ES6), 66 63 53 47 bytes (62 55 49 41 characters)

f=n=>`⇅
⇵
⇅`.replace(/./g,'$&'.repeat(n))

Props to Digital Trauma for finding the ⇅ and ⇵ characters and allowing me to shave off more bytes.


2

J, 30 bytes

|:((2*".1!:1<1),3)$ucp'↑↓'

2

C, 169 170 162 125 123 105 119 107 bytes

So, I though I might as well give this a go, even though this is obviously not the winner :)

Golfed:

n,i,j;main(){n=getchar();n=atoi(&n);for(;j++<3;){for(i=0;i++<n;)printf("%.3s ","⇅⇵"+(j%2)*3);puts("");}}

Ungolfed:

#include <stdio.h>
#include <stdlib.h>

/* n -> Number of columns, i & j -> Loop counters */
n,i,j;

main()
{
    /* Get the number of iterations from stdin */
    n = getchar();
    n = atoi(&n); /* Thanks @AndreaBiondo */

    for (; j++ < 3;)
    {
        /* Print rows of arrows */
        for (i = 0; i++ < n;)
            printf("%.3s ","⇅⇵" + (j % 2) * 3);

        /* Print a newline */
        puts("");
    }
}

Example:

Input: 4
⇵ ⇵ ⇵ ⇵ 
⇅ ⇅ ⇅ ⇅ 
⇵ ⇵ ⇵ ⇵ 

Update:

See it run here


You can do for(j=0;j++<3;) and the same with i
lirtosiast

@ThomasKwa aha... well spotted. thanks
Levi

i and j are globals, so they're initialized to zero. You can drop i=0 and j=0.
Andrea Biondo

Also, you can exploit little-endianess and zero initialization to use n as a buffer: n=getchar();n=atoi(&n);
Andrea Biondo

@AndreaBiondo when i remove i=0 and j=0, all the output is on one line. can you reproduce this? i'm using gcc 4.9.2
Levi

2

Octave, 37 bytes

EDIT: corrected from the earlier stripe-antiferromagnetic version. Thanks @beta-decay for catching my mistake.

f=@(n)repmat(["⇅";"⇵";"⇅"],1,n)

Defines a function f(n). Sample output:

octave:4> f(1)
ans =

⇅
⇵
⇅

octave:5> f(5)
ans =

⇅⇅⇅⇅⇅
⇵⇵⇵⇵⇵
⇅⇅⇅⇅⇅

1

CoffeeScript, 60 bytes (58 chars)

Comprehensions make it easy without recursion:

f=(n,x='')->x+='\n⇵⇅'[i%(n+1)&&1+i%2]for i in[1..n*3+2];x

1

Ruby, 33 bytes

As a function:

f=->n{[s="↑↓"*n,s.reverse,s]}

Example:

> puts f[3]
↑↓↑↓↑↓
↓↑↓↑↓↑
↑↓↑↓↑↓

Ruby, 37 bytes

Full program which takes input from stdin:

puts s="↑↓"*gets.to_i,s.reverse,s

You can make only a function or a whole program, but it must take an input and draw that many pairs.
Dennis

@Dennis ok, I'm on it
daniero

We seem to have a misunderstanding. I posted the quote to show that a function is in fact valid, since you implied in your original revision that a full program was required by the question.
Dennis

@Dennis No problem. I was just thinking that returning 3 strings wasn't really "drawing", but I guess it doesn't matter. Anyways, got both versions golfed down a bit :)
daniero

1

><>, 55 Bytes

"⇅⇵⇅"{:&3*1-:0(?;\
|.!09v!?%&:&:{o:}/
oa{~}/|.!09

Try it online here, inputting the desired length as initial stack value.

Non ⇅⇵ solution, 59 Bytes:

"↓↑"{:&3*>1-:0(?;{:{\
 |.!09v!?%&:&:oo}}@:/
9oa{$}/|.!0

1

BBC BASIC, 70 bytes

INPUTx:n$=STRING$(x,"/|\\|/"):PRINTn$:PRINTSTRING$(x,"\|//|\"):PRINTn$

This can probably be golfed more


1

C, 97 bytes

Takes the input from the first command-line parameter, e.g. main 4. Supports up to 357913940 pairs. In C you can't use multibyte characters as chars but they work fine as strings.

i,n;main(c,v)char**v;{n=atoi(v[1]);for(i=6*n+3;i--;)printf("%s",i%(2*n+1)?i%2?"↓":"↑":"\n");}

It is smaller as a function, but the other C answers were complete programs so I did that too. It would be 69 bytes:

i;f(n){for(i=6*n+3;i--;)printf("%s",i%(2*n+1)?i%2?"↓":"↑":"\n");}


1

C, 117 89 85 bytes

i;main(j,v)char**v;{j=2*atol(v[1])+1;for(;i++<3*j;)printf(i%j?i%2?"↑":"↓":"\n");}

Ungolfed:

i;
main(j,v)
char**v; // Credit to @AndreaBiondo for brilliant idea that I will use a lot in future golfed programs :)
{
    j = 2*atol(v[1])+1;
    for(;i++<3*j;)
        printf(i%j?i%2?"↑":"↓":"\n");
}

1

JavaScript (ES6), 66 bytes (62 chars)

That includes the Unicode character counted as three bytes each as well as the mandatory newline counted as one byte.

Uses recursion as inspired by this answer. I tried it non-recursively but generating a defined array took too many characters, although someone else might know how to do it better than me.

f=n=>(g=(a,i)=>i?g(`
↓↑`[i%(n*2+1)&&1+i%2]+a,i-1):a)('',n*6+2)

Demo

As with all ES6 answers, they are demonstrable in Firefox, Edge, and Safari 9 only at time of writing:

f = n => (g = (a, i) => i ? g(`
↓↑` [i % (n * 2 + 1) && 1 + i % 2] + a, i - 1) : a)('', n * 6 + 2)

console.log = x => document.getElementById('O').innerHTML += x + '\n';

console.log(f(1));
console.log(f(2));
console.log(f(4));
console.log(f(32));
<pre><output id=O></output></pre>


1

Java, 150 bytes

static void g(int n){n*=2;f(n,0);f(n,1);f(n,0);}static void f(int n,int d){String l="";for(n+=d;n-->d;)l+=(n%2==0)?"↓":"↑";System.out.println(l);}

Output of g(2):

↑↓↑↓
↓↑↓↑
↑↓↑↓

1
I think that you're required to output arrows, so I'd suggest that you change your example output and code to make it absolutely clear that you aren't breaking the rules :)
Beta Decay

@BetaDecay I see some approved arrows have been listed and I haven't made the cut! So following your advice I've changed it
DeadChex

0

Python 2, 45 55 bytes

edit: modified arrows

Pretty straightforward approach. Doesn't work with unicode arrows, though.

def f(n):x=" /|\\ \\|/"*n;print x+"\n "+x[::-1]+"\n"+x

if you look at the comments in the original post, you will see that you are specifically not allowed to use ^v arrows as they do not have a tail
Levi

1
Thanks, I haven't noticed that. Changed it into "/|\", hope it's ok now.
heo

0

R, 60 62 bytes

Takes input from STDIN and outputs to STDOUT. Creates a 3 x (2 * input) array, adds a column of carriage returns and then outputs the transposed array.

cat(t(cbind(array(c('↑','↓'),c(3,2*scan())),'\n')),sep='')

Test run

cat(t(cbind(array(c('↑','↓'),c(3,2*scan())),'\n')),sep='')
1: 25
2: 
Read 1 item
↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓
↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑
↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓

0

Tcl 49 bytes

No winner but at least it's competitive:

foreach x {⇅ ⇵ ⇅} {puts [string repeat $x $argv]}

You can save bytes using lmap instead of foreach
sergiol

And string repeatcan be abbreviated to string re
sergiol

And I am not sure, but implementing it as a proc retrieving a side effect of lmap returning values and replacing $argv by someone one-letter variable may save bytes.
sergiol

-1

Swift 2.0, 79 bytes

Nothing clever...

let p=3;for x in 0...2{print((0..<p*2).reduce(""){$0+["↑","↓"][($1+x)%2]})}

3
This would need to be put in a function, having to change the code for input isn't allowed
Downgoat
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.