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!

phase
la source
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 .

Alex A.
la source
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
Ou ces pages de codes .
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
Jakube
la source
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.

TNT
la source
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.

Sp3000
la source
7

CJam (15 caractères, 19 octets)

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

Démo en ligne

Peter Taylor
la source
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

 /|\  \|/  /|\  \|/  /|\  \|/  /|\  \|/ 
 \|/  /|\  \|/  /|\  \|/  /|\  \|/  /|\ 
 /|\  \|/  /|\  \|/  /|\  \|/  /|\  \|/ 
Sok
la source
5

Pyth, 16 octets (12 caractères)

J"↑↓"V3*~_JQ

Exemple:

Input: 4
Output:
↑↓↑↓↑↓↑↓
↓↑↓↑↓↑↓↑
↑↓↑↓↑↓↑↓
isaacg
la source
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 ...)

Sp3000
la source
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/
Traumatisme numérique
la source
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)

Kametrixom
la source
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

↑↓↑↓↑↓↑↓
↓↑↓↑↓↑↓↑
↑↓↑↓↑↓↑↓
Level River St
la source
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.

Fatalize
la source
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.

George Reith
la source
2

J, 30 bytes

|:((2*".1!:1<1),3)$ucp'↑↓'
gar
la source
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

Levi
la source
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 =

⇅⇅⇅⇅⇅
⇵⇵⇵⇵⇵
⇅⇅⇅⇅⇅
xebtl
la source
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
rink.attendant.6
la source
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
daniero
la source
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
Fongoid
la source
1

BBC BASIC, 70 bytes

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

This can probably be golfed more

Beta Decay
la source
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");}
Andrea Biondo
la source
1

Python 2, 47 bytes

Port of my BBC BASIC answer, taking advantage of how Python can easily reverse strings.

n=r"/|\\|/"*input();print n+"\n"+n[::-1]+"\n"+n
Beta Decay
la source
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");
}
Cole Cameron
la source
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>

rink.attendant.6
la source
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):

↑↓↑↓
↓↑↓↑
↑↓↑↓
DeadChex
la source
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
heo
la source
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
↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓
↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑
↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓↑↓
MickyT
la source
0

Tcl 49 bytes

No winner but at least it's competitive:

foreach x {⇅ ⇵ ⇅} {puts [string repeat $x $argv]}
slebetman
la source
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]})}
GoatInTheMachine
la source
3
This would need to be put in a function, having to change the code for input isn't allowed
Downgoat