La route (facile) du code


30

Contribution:

  • Un entier , qui est garanti d'être .n3
  • Un entier , qui est l'un de .d[1,0,1]

Sortie:

Une route de taille , qui sera dans une direction nord-ouest si ; une direction nord si ; ou une direction nord-est si . La route aura toujours trois espaces de large (ou cinq en général si l'on incluait les bordures extérieures). De plus, il y aura une ligne de séparation des routes sur la section inférieure, et après cela en alternance en montant.nd=1d=0d=1

Quelques exemples:

Entrée: Sortie:n=7,d=1

      / / /
     /   /
    / / /
   /   /
  / / /
 /   /
/ / /

Entrée: Sortie:n=4,d=1

\   \
 \ \ \
  \   \
   \ \ \

Règles du défi:

  • N'importe quelle quantité d'espaces de début / de fin et / ou de nouvelles lignes sont acceptables, tant qu'elle imprime la route requise quelque part sur l'écran.
  • Au lieu des options vous êtes également autorisé à utiliser les options ou place. Vous pouvez également choisir laquelle des trois options correspond à laquelle des trois directions. (Assurez-vous de mentionner les options que vous avez utilisées si elles diffèrent respectivement de pour celles utilisées dans cette description du défi!)[1,0,1][0,1,2][1,2,3][1,0,1][north-west, north, north-east]
  • Tout format de sortie raisonnable est acceptable. Le plus courant est bien sûr de l'imprimer sur STDOUT, mais le renvoyer sous forme de chaîne ou de liste de caractères 2D convient également.

Règles générales:

  • C'est le , donc la réponse la plus courte en octets l'emporte.
    Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues autres que le golf de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation.
  • Des règles standard s'appliquent à votre réponse avec des règles d'E / S par défaut , vous êtes donc autorisé à utiliser STDIN / STDOUT, des fonctions / méthodes avec les paramètres appropriés et des programmes complets de type retour. Ton appel.
  • Les failles par défaut sont interdites.
  • Si possible, veuillez ajouter un lien avec un test pour votre code (par exemple TIO ).
  • De plus, l'ajout d'une explication à votre réponse est fortement recommandé.

Cas de test:

Les deux exemples ci-dessus, et:

Entrée: Sortie:n=10,d=0

|   |
| | |
|   |
| | |
|   |
| | |
|   |
| | |
|   |
| | |

3
Titre alternatif: "Mad Max Code Warrior"
akozi

1
Le premier exemple n'est-il pas incorrect? Il a une bande médiane sur chaque ligne impaire au lieu de chaque ligne paire
moonheart08

2
@ moonheart08 Non. Celui du bas aura toujours une ligne de séparation de route, que l'entrée soit impaire ou paire. Après cela, il alterne en montant. J'ai un peu modifié le texte pour, je l'espère, le clarifier.
Kevin Cruijssen

Oh, donc je me trompe. Bien. Merci de clarifier.
moonheart08

Réponses:


2

Toile , 23 22 octets

B}⁴H‟m↶⁷?/|∙/╋]\|∙\╋]}

Essayez-le ici!

Utilise les entrées de direction 0, 1 et 2.

Explication:

...‟    push "--¶¶- ¶¶--"
    m   mold the horizontal length to the 1st input - a horizontal road
     ↶  rotate counter-clockwise - so the separator is on the bottom
        also replaces the dashes with bars

⁷?     ]     ]}  switch over the 2nd input:
                 default case (input 2):
  /                pad with spaces to a "/" diagonal
   |∙/╋            replace "|" with "/"
                 case 0:
        \          pad with spaces to a "\" diagonal
         |∙\╋      replace "|" with ""

case 1 is empty, but because of a bug, the trailing "}" is still required

Pourriez-vous ajouter une explication? :)
Kevin Cruijssen

1
@KevinCruijssen ajouté.
dzaima

16

Python 2 , 79 78 73 72 octets

n,d=input()
c='|\/'[d]
i=n
while i:print' '*(n-i*d)+c,i%2*c or' ',c;i-=1

Essayez-le en ligne!

Prend [1,0,-1]pour[north-west, north, north-east]

-1 octet, merci à Neil


3
Jeez, ce que je ne donnerais pas pour le découpage de type Python dans Kotlin
Adam

i%2*c or' 'enregistre un octet.
Neil

7

Python 2 , 66 octets

n,d=input()
s=' '+'|\/'[d]
for c in(s*n)[n:]:print' '*n+s,c+s;n+=d

Essayez-le en ligne!

Utilise d=-1pour NE, d=0pour N et d=1pour NW. Profite que les espaces principaux sont autorisés. La règle selon laquelle le segment inférieur de la route a un séparateur a rendu difficile la bonne parité; il est réalisé par le découpage en (s*n)[n:]prenant la seconde moitié des 2nalternances entre l'espace et le caractère routier.


6

1. Python 3.5, 122 120 octets

Le script prend deux paramètres: n, d.

d: 0, 1, 2 -> \ | /

tio.run

import sys;(n,d)=[*map(int,sys.argv[1:3])];c="\\|/"[d]
for i in range(n):j=n+~i;print(" "*(i,0,j)[d],c,c*(j%2<1)or" ",c)

sortie:

$ ./script.py 6 2
      /   /
     / / /
    /   /
   / / /
  /   /
 / / /
$ ./script.py 6 1
 |   |
 | | |
 |   |
 | | |
 |   |
 | | |
$ ./script.py 6 0
 \   \
  \ \ \
   \   \
    \ \ \
     \   \
      \ \ \

Explication

# parse input params
(n,d)=[*map(int,sys.argv[1:3])]

# select char for "road"
c="\\|/"[d]

# loop n-times
for i in range(n):

    # complement (how many lines to end)
    j=n+~i

    # print
    #   space i or 0 or j times
    #   road, center of road if j is even else space, road
    print(" "*(i,0,j)[d], c, c*(j%2<1) or " ", c)

edit: -2 octets grâce à Kevin Cruijssen


3
Bonne réponse! :) Deux petites choses au golf: n-1-ipeuvent être n+~i( astuce pertinente ) et j%2==0peuvent l'être j%2<1. Si vous ne les avez pas encore vus, Conseils pour jouer au golf en Python et Conseils pour jouer au golf dans <toutes les langues> peuvent être intéressants à lire.
Kevin Cruijssen

1
Merci :) Je n'ai pas encore vu ça n+~i, mais ça a l'air utile. Merci également pour la mise en évidence du code.
René

Vous êtes les bienvenus! Profitez de votre séjour et jouez au golf de nombreuses réponses. :) Oh, et passez un bon week-end.
Kevin Cruijssen

j%2*" "or cenregistre un autre couple d'octets.
Neil

5

PowerShell , 88 82 80 74 71 octets

-8 octets grâce à Mazzy
-6 octets grâce à AdmBorkBork et Mazzy
-3 octets grâce à AdmBorkBork

param($n,$d)$n..1|%{' '*($_,($n-$_))[$d]+($y='/\|'[$d])," $y"[$_%2],$y}

Essayez-le en ligne!

Utilise [0,1,2] pour NW, NE, N. Utilise ddeux fois comme index de liste pour obtenir d'abord la méthode d'espacement (supprime la liste lors de l'utilisation de 2 qui renvoie 0) et ensuite quel caractère utiliser lors du tracé des lignes. Ajoute une liste à la chaîne d'espaces (qui comporte naturellement des espaces entre les membres lorsqu'ils sont ajoutés comme tels) qui construit la route. Bascule également entre une voie ouverte ou un tiret basé sur les mathématiques modulo.


1
80 octets si utilise [0,1,2] pour [NW, NE, N]
mazzy

1
@mazzy Smart. J'ai complètement oublié de tomber intentionnellement hors d'une liste.
Veskah

1
Super idée avec array.toString d'AdmBorkBork! Merci. 74 octets
mazzy

3
71 octets en indexant la partie médiane dans une chaîne plutôt que dans un tableau.
AdmBorkBork


5

Fusain , 33 29 23 octets

↷NNη⊘⊕ηUE¹¦¹F⟦²±²⟧«Jι⁰η

Essayez-le en ligne! Le lien est vers la version détaillée du code. Maintenant que tous les bogues sous-jacents de charbon de bois semblent être corrigés, je peux annoncer le code optimal. Explication:

↶N

Faites pivoter la direction du curseur dans le sens antihoraire en fonction de la première entrée, de sorte que 1 devienne nord-est, 2 nord et 3 nord-ouest.

Nη

Saisissez la longueur de la route.

⊘⊕ηUE¹¦¹

Imprimez la moitié de la longueur de la route, puis étirez-la en donnant le séparateur de route.

F⟦²±²⟧«Jι⁰η

Imprimez les côtés de la route.

@KevinCruijssen a ensuite soumis une version plus difficile de cette question qui a été supprimée depuis, mais les utilisateurs avec suffisamment de représentants peuvent la voir ici: La (dure) route vers le code L'astuce d'étirement que j'ai utilisée dans cette réponse ne s'applique pas à cette question, donc à la place, je a écrit ce qui suit 47 programme de 45 octets:

F³«J×ι⊘⊕θ⁰≔…⟦¹ ⟧⊕﹪ι²ιFη«↶§κ⁰F⊖§κ¹§ιⅉP§ιⅉ↑↷§κ⁰

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

F³«

Boucle sur les côtés et séparateur.

J×ι⊘⊕θ⁰

Sautez au début du côté.

≔…⟦¹ ⟧⊕﹪ι²ι

Créez un tableau contenant un 1et un espace, mais supprimez à nouveau l'espace si nous dessinons les côtés plutôt que le séparateur.

Fη«

Faites une boucle sur chaque section de route.

↶§κ⁰

Faites pivoter la direction du curseur en conséquence.

F⊖§κ¹

Boucle sur un de moins que la longueur du tronçon de route ...

§ιⅉ

... et imprimer des éléments alternés du tableau. L'alternance est obtenue par indexation cyclique dans le tableau avec la coordonnée Y du curseur.

P§ιⅉ

Imprimez la dernière ligne de cette section de route, mais sans déplacer le curseur ...

... afin que le curseur puisse être déplacé vers le haut, prêt pour la section suivante.

↷§κ⁰

Faites pivoter la direction du curseur en arrière prêt pour la section suivante.


4

Kotlin , 96 92 octets

{n,d->val c="\\|/"[d];(0..n-1).map{println(" ".repeat(n-it*(d-1))+ "$c ${" $c"[it%2]} $c")}}

Accepte [0, 1, 2] au lieu de [-1, 0, 1]

Cela fonctionne de manière similaire aux solutions dans d'autres langues, mais malheureusement, Kotlin ne brille pas vraiment dans celle-ci.

val c=“\\|/“; récupère le caractère à utiliser dans la construction de routes en profitant du fait que Kotlin traite les chaînes comme un tableau de caractères (comme il se doit, en vous regardant Java)

Essayez-le en ligne!


Salut, bienvenue chez PPCG! Il y a un problème mineur dans votre sortie. Les lignes de modification au centre de la route devraient commencer par une ligne en bas pour des entrées régulières, plutôt qu'en haut. Vous pouvez comparer votre sortie 4avec mon exemple de 4pour voir la différence que je veux dire. Je ne connais pas bien Kotlin, mais je pense que vous pouvez le résoudre (et jouer au golf 4 octets en même temps) en changeant [(it+1)%2]pour [it%2]. :) En dehors de cela, c'est une bonne réponse, alors +1 de ma part.
Kevin Cruijssen

Génial, merci beaucoup pour l'accueil et l'aide! Je vais le changer
Adam

4

Code TSQL, 171 117 octets

J'ai réalisé que cela pourrait être écrit beaucoup plus court que du code.

DECLARE @n INT=7,@d INT=0

,@ INT=0a:PRINT
space(@n-@*@d)+stuff(replicate(substring('\|/',@d+2,1)+' ',3),3,@%2,space(@%2))SET
@+=1IF @n>@ GOTO a

Requête TSQL, 137 octets

USE master
DECLARE @n INT=6,@ INT=-1

SELECT space(@n-y*@)+z+iif(y%2=1,z,'  ')+z 
FROM(SELECT top(@n)row_number()over(order
by @)y,' '+substring('\|/',@+2,1)z FROM spt_values)x

USE master n'est pas nécessaire si votre base de données est déjà master. Certains utilisateurs ont cependant une base de données par défaut différente.

Le script lors de son essai est légèrement différent. J'ai dû remplacer l'espace ascii-32 par ascii-160, les espaces n'étaient pas affichés.

Essaye le

J'ai fait quelques ajustements et réalisé que je pouvais remplacer

commander par 1/0

avec

commandé par @


2
Comment se order by 1/0fait- il qu'il n'y ait pas d'erreur de division par zéro?
HoneyBadger

car 1/0 n'est pas calculé. où existe (sélectionnez 1/0) aura le même effet
t-clausen.dk

Déplacement de ma question vers StackOverflow
HoneyBadger

3

JavaScript (ES8),  90 87  85 octets

(direction)(length)012

d=>g=(n,w=n)=>n?(c='/|\\'[d]).padStart([n--,,w-n][d])+` ${n&1?' ':c} ${c}
`+g(n,w):''

Essayez-le en ligne!


JavaScript (ES6), 90 octets

Celui-ci dessine le caractère de sortie par caractère avec un peu plus de maths au lieu de la .padStart()méthode.

(direction)(length)123

d=>n=>(g=x=>y?` /|\\
`[x+5?17+y%2*4>>--x+5-[,n+1-y,n,y][d]&1&&d:(x=n,y--,4)]+g(x):'')(y=n)

Essayez-le en ligne!


3

Gelée ,  31  30 octets

⁶ẋẋƤḂ};€ị“\/|”ẋ3KƊ}Ṛ⁹¡⁶-2¦€ÐeṚ

Un lien dyadique acceptant la longueur à gauche et la direction négative * à droite qui donne un tableau 2D de caractères.
*[north-west, north, north-east]=[1, 0, -1]

Essayez-le en ligne! (le pied de page appelle le lien, rejoint les caractères de nouvelle ligne et imprime le résultat)

Comment?

⁶ẋẋƤḂ};€ị“\/|”ẋ3KƊ}Ṛ⁹¡⁶-2¦€ÐeṚ - Link: integer, L; integer, D
⁶                              - space character
 ẋ                             - repeat L times
     }                         - using the right argument (D):
    Ḃ                          -   mod 2 (0 if D = 0, 1 otherwise ...A would work too)
   Ƥ                           - for each prefix (of the list of spaces):
  ẋ                            -   repeat (D mod 2 times)
                  }            - using the right argument (D):
                 Ɗ             -   last three links as a monad:
        ị“\/|”                 -     index into "\/|" (1-indexed & modular)
              ẋ3               -     repeat three times - e.g. "\\\"
                K              -     join with spaces          "\ \ \"
      ;€                       - concatenate €ach (altered prefix with that list)
                     ¡         - repeat action...
                    ⁹          - ...number of times: right argument (-1 repeats 0 times)
                   Ṛ           - ...action: reverse (i.e. reverse if north-west)
                           Ðe  - for even indexes:
                         ¦€    -   sparse application for €ach...
                       -2      -   ...to indices: [-2] (the middle of the road)
                      ⁶        -   ...action: a space character
                             Ṛ - reverse

2

Python 2, 127 octets

n,d=input()
c='|/\\'[d]
for i in range(n):t=0if d==0else(i if d<0else n-i);print(' '*t+'{} {} {}'.format(c,' 'if i%2==0else c,c))

Essayez-le en ligne!

Deux premières lignes tirées de @TFeld.


1
Salut, bienvenue chez PPCG! Je crains que les soumissions devront être soit une fonction prenant des paramètres, soit un programme complet prenant des arguments ou des entrées de STDIN. Les extraits comme ceux que vous utilisez actuellement ne sont pas autorisés, je le crains. Vous pouvez ajouter un interligne D,N=input()(et utiliser Python 2 au lieu de 3) pour résoudre ce problème. Ou vous pouvez le changer en une fonction lambda prenant ces deux paramètres.
Kevin Cruijssen

1
Belle solution. " ".join(..).format
Je l'ai

1
i%2*c or' 'enregistre quelques octets de plus, même si j'ai remarqué que le séparateur est incorrect pour les routes de longueur irrégulière.
Neil

2

Python 2 , 93 octets

n,d=input();p=''
while n:g='|/\\'[d];n-=1;print['',' '*n,p][d]+g+' %s '%(g,' ')[n%2]+g;p+=' '

Essayez-le en ligne!


Changer +' %s '+pour ,'%s',enregistrer 2 octets
TFeld

@TFeld Dans ce cas, vous pourriez aussi bien supprimer '%s'%complètement.
Neil



1

Rouge , 157 octets

func[s d][p: pick"\|/"d set[a b]reduce pick[[4 1]0[5 + s -1]]d 
repeat n s[print pad/left form reduce pick[[p" "p][p p p]]odd?(n + pick[1 0]odd? s)a: a + b]]

Essayez-le en ligne!

  • 1 Nord-Ouest
  • 2 Nord
  • 3 Nord-Est


1

Swift 4,2 , 112 108 octets

-4 octets grâce au Sriotchilism O'Zaic

let c=["\\","|","/"][d];(0..<n).map{print((0..<n-$0*(d-1)).map{_ in" "}.joined()+c+" \($0%2==0 ?c:" ") "+c)}

[0,1,2] au lieu de [-1,0,1].

Essayez-le en ligne!

Explication

let c=["\\","|","/"][d]

Détermine le panneau de signalisation à utiliser. (Je parie que cela peut être raccourci d'une manière ou d'une autre)

(0..<n).map{

Itère sur toute la longueur de la rue.

(0..<n-$0*(d-1)).map{_ in" "}.joined()

Ajoute les espaces devant la rue.

\($0%2==0 ?c:" ")"

Ajoute le signe du milieu à toutes les autres lignes.

Mon tout premier ☝️, je suis heureux de tout conseil d'optimisation. Tiré principalement de ce fil: Conseils pour jouer au golf dans Swift .


1
Bienvenue sur le site! Il semble que vous ayez oublié de supprimer l'espace entre inet " "dans votre code même si vous l'avez supprimé dans vos exemples.
Wheat Wizard

1
Je ne sais pas rapide mais ça ressemble à vos interpolations sur les extrémités des cordes ( \(c)dans les deux cas). Vous pouvez économiser des octets en concaténant simplement le cà la chaîne. Essayez-le en ligne!
Wheat Wizard

1
Merci, vous avez raison! nous a sauvés 3 octets 🚀
palme

1

Perl 6 , 66 octets

->\n,\d{{(' 'x--$ *d%-+^n~(' ',<\ | />[d+1])[1,(n+$++)%2,1])xx n}}

Essayez-le en ligne!

Renvoie une liste de lignes.

Explication

->\n,\d{                                                         }  # Block taking n, d
        {                                                       }   # Reset $ variables
         (                                                 )xx n    # Repeat n times
          ' 'x  # Space times
              --$ *d  # (-1,-2,-3,...) if d=1
                      # (0,0,0,...) if d=0
                      # (1,2,3,...) if d=-1
                    %-+^n  # modulo -~n = n+1
                         ~  # Concat
                          (' ',<\ | />[d+1])  # Space or line
                                            [1,(n+$++)%2,1]  # Alternate middle char

1

Rubis , 90 octets

n,a=*$*.map{|i|-i.to_i}
c='|\/'[a]
n.upto(-1){|i|puts' '*(i*a-n)+c+' '+[' ',c][i%2]+' '+c}

Essayez-le en ligne!

MISE À JOUR: Merci, Kevin, d'avoir souligné que ma soumission d'origine manquait d'espaces entre les bords de route et les marqueurs (c.-à-d. Routes à 3 largeurs au lieu de 5 largeurs). Cela dit, il pourrait y avoir une solution plus courte pour cela que c+' '+...+' '+c.

Informations directionnelles: -1, 0, 1cartes vers{ north-west, north, north-east }

Arguments: ceci lit les arguments de ligne de commande tels que 4 -1(une route à quatre rangées, inclinée vers le nord-ouest).

Remarque supplémentaire: cela a été testé localement avec Ruby v2.6.1, et il semble que Try It Online utilise Ruby v2.5.3. Je n'ai aucune raison de penser que cela ne fonctionnerait pas avec toutes les autres versions de Ruby.


Salut, bienvenue chez PPCG! Les directions et les routes changeantes sont correctes dans votre sortie, donc bien fait. Il y a juste une erreur mineure dans la sortie actuelle: la route doit être large de trois espaces au lieu de 1. Actuellement, votre route est |||ou |<sp>|, mais elle doit être |<sp>|<sp>|ou |<sp><sp><sp>|(où <sp>est un espace). Je ne connais pas Ruby, mais il semble que vous puissiez le résoudre en passant c+[' ',c][i%2]+cà c+' '+[' ',c][i%2]+' '+c. :)
Kevin Cruijssen

Ah bonne prise! Merci de l'avoir signalé, @KevinCruijssen.
Spencer D


1

Japt -R , 40 octets

Æ=Vg"|\\/";²i1S+iX%2?S:U)iSp[TZÊ-YY]gVÃw

Essayez-le en ligne!

Explication:

Æ=Vg"|\\/";²i1S+iX%2?S:U)iSp[TZÊ-YY]gVÃw
                                            // U = road size
                                            // V = direction
Æ                                     Ã     // Loop X through [0...U]
 =        ;                                 //   Set U to:
    "|\\/"                                  //       "|\/"
  Vg                                        //            [V]
           ²                                //  Double U
            i1          )                   //  Insert at index 1:
              S+                            //    " " +
                 X%2?S:U                    //         X%2?" ":U
                i                           //                  + " "
                         i                  //  Insert at index 0:
                          Sp                //    " " repeated this many times:
                            [TZÊ-YY]        //      [0,U.length - X,X]
                                    gV      //                        [V]
                                        w   // Reverse output

Il semble y avoir une erreur mineure dans la sortie. Actuellement, le séparateur de route pour les entrées paires commence en haut plutôt qu'en bas. Tout le reste semble correct, donc j'espère que ce n'est pas trop difficile à résoudre.
Kevin Cruijssen

@KevinCruijssen Ah, merci d'avoir attrapé ça. Avant de mettre à jour ma réponse, pouvez-vous confirmer que cette solution est correcte?
Oliver

Oui, cela semble tout à fait correct. :)
Kevin Cruijssen

1
@KevinCruijssen Ajout d'une explication car je sais que vous les aimez: P
Oliver

Merci, apprécié. :) En effet, j'aime toujours avoir des explications sur les langues de golf. J'ai parfois déjà du mal à comprendre les réponses JavaScript, sans parler du langage golfique de JS. ;)
Kevin Cruijssen

1

Stax , 23 octets

ù╒←∩♂2Ωⁿ¡├∩22♀Ç○=÷â╧δÖ↑

Exécuter et déboguer

L'entrée est deux entiers séparés par un espace.
Le premier est d. -1 spécifie le nord-est. 0 pour le nord. 1 pour le nord-ouest. Le deuxième paramètre est n. Ces deux valeurs seront implicitement analysées à partir de l'entrée et placées sur la pile d'entrée avec nen haut. De plus, dil sera accessible à partir du registre du stax xpuisqu'il s'agit de la première valeur implicitement analysée.

Par exemple, saisissez "1 7"

            Main stack      Explanation
            ----------      -----------
;           [7]             peek from input stack
m                           map over integers [1..n] using the rest of the program
                            output each produced value implicitly
  ;         [1 7]           peek from input stack
  +         [8]             add
  .*"       [8 [42 34]]     2 character string literal with codepoints 42 and 34
  @         [42]            get the element at the specified modular index (8)
  0         [42 0]          literal zero
  "|\/"x@   [42 0 92]       get codepoint from string literal at input d (from x register)
  \         [42 [0 92]]     make pair
  :B        ['\ \ \ ']      encode in custom base; it's binary with custom codepoints
  _x*       ['\ \ \ ' 1]    (loop variable) * (input d)
  ;^        ['\ \ \ ' 1 8]  peek from input stack and increment
  %         ['\ \ \ ' 1]    modulus
  6+        ['\ \ \ ' 7]    add 6
  )         [' \ \ \ ']     left-pad to length

Exécutez celui-ci


Pourriez-vous ajouter une explication? :)
Kevin Cruijssen

1
@KevinCruijssen: Pas du tout.
récursif

0

perl -M5.010 -Mfeature = signatures, 97 octets

sub f($n,$d){$x=qw[| / \\][$d];say" "x($d<1?$_*-$d:$n-$_),$x,$",($n-$_)%2?$":$x,$",$x for 1..$n;}
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.