Fractions intermédiaires

13

Fractions intermédiaires

Le défi:

Vous devrez créer du code qui prend au moins 3 entrées; 2 entiers et "une représentation de fraction" - quel que soit le type qui convient à votre langue pour représenter les incréments de fraction) ie. Si vous choisissez une chaîne, l'entrée serait "1/4" ou vous pourriez choisir 2 entrées entières supplémentaires ou un tuple ou w / e.

L'entrée peut être n'importe où raisonnable (STDIN, arguments de fonction, à partir d'un fichier, etc.), tout comme la sortie (STDOUT, valeur de retour de fonction, dans un fichier, etc.)

Règles:

  1. La "fraction" d'entrée sera toujours une fraction valide, inférieure à 1; exemple "1/4"
  2. Le deuxième entier d'entrée aura toujours une valeur plus élevée que le premier entier. IE, le premier entier d'entrée aura toujours une valeur inférieure à la seconde.
  3. Les entiers d'entrée peuvent être négatifs.
  4. Les fractions produites doivent être réduites autant que possible (simplifiées)

Le code devra sortir chaque "étape de fraction" entre les 2 nombres par incréments de la fraction d'entrée.

Le code doit être un programme ou une fonction comme indiqué ici

Exemple 1:

Contribution: -2,3,"1/2"

Production:

 -2
 -3/2 
 -1 
 -1/2 
  0 
  1/2 
  1 
  3/2  
  2 
  5/2 
  3

Exemple 2:

Contribution: 1,2,"2/3"

Production:

1
5/3
2

ou

1
4/3
2

Remarque: le comptage peut commencer dans les deux sens (merci @Mego)

Il s'agit de , donc la réponse la plus courte en octets l'emporte.

Alex Carlsen
la source
La fraction peut-elle être considérée comme 2 entrées entières, soit 4 entrées totales?
Mego
Je pense que je ne garderai pas la limite de 3 entrées au maximum - J'aimerais voir le code pour 4 entrées également
Alex Carlsen
Dans ce cas, qu'en est-il d'avoir une liste / tuple / tableau / un autre type itérable contenant deux entiers pour la troisième entrée? Ce n'est pas fondamentalement différent de 4 entrées entières. Vous devez également préciser que la fraction ne sera pas égale à 0.
Mego
@Mego Après y avoir réfléchi, je ne vois pas pourquoi il ne devrait pas être autorisé Changé en "code qui prend au moins 3 entrées"
Alex Carlsen
1
@beaker tant que la sortie est correcte et que l'entrée provient d'au moins 2 entiers, le reste dépend de vous :) - J'ai gardé la partie d'entrée assez ouverte, pour voir différentes réponses
Alex Carlsen

Réponses:

5

Octave, 34 30 octets

@(a,b,c)rats(union([a:c:b],b))

Prend maintenant la fraction comme une expression numérique plutôt que comme numérateur et dénominateur séparés.

Échantillon sur ideone

gobelet
la source
1
Alors pourquoi tu ne peux pas utiliser @(a,b,c)rats(union([a:c:b],b))?
Luis Mendo
@LuisMendo Je peux si les expressions mathématiques sont des entrées acceptables (le résultat effectif d' 1/2une entrée numérique plutôt que chaîne), mais ce n'est pas ainsi que j'ai interprété "une représentation de fraction". Si l'OP accepte, je serai heureux de raser 4 octets.
bécher
Oh je vois. Eh bien, j'utilise cela dans ma réponse Matlab. Il en va de même pour Mathematica, à moins que "nombre rationnel" ne soit un type de données spécifique
Luis Mendo
@beaker j'ai répondu
Alex Carlsen
@VisualBean Code déjà mis à jour.
bécher
11

Mathematica, 16 octets

Range@##⋃{#2}&

Une fonction sans nom qui prend deux entiers et un nombre rationnel et renvoie une liste de nombres, par exemple:

Range@##⋃{#2}&[-2, 3, 1/2]
(* {-2, -(3/2), -1, -(1/2), 0, 1/2, 1, 3/2, 2, 5/2, 3} *)

Mathematica Rangefait exactement ce que le défi demande, sauf qu'il omet la limite supérieure si la différence entre la limite inférieure et la limite supérieure n'est pas exactement un multiple de la taille du pas. Par conséquent, nous prenons le Union(en utilisant ) avec la liste contenant uniquement la limite supérieure qui garantit qu'elle apparaît exactement une fois. Notez que Unioncela triera le résultat mais nous voulons qu'il soit trié de toute façon, car la taille de l'étape est toujours positive. De plus, puisque nous travaillons avec des justifications, elles sont automatiquement réduites autant que possible.

Martin Ender
la source
10

T-SQL 2012+, 831 535 477 270 246 240 219 octets

Veuillez noter qu'il s'agit d'une doublure - sql n'a pas de fonction intégrée pour réduire la fraction. Peut ne pas être la meilleure langue pour ce type de question. Il est lisible par l'homme (en quelque sorte - par rapport à certaines autres langues).

DECLARE @f INT=-5,@t INT=3,@n INT=3,@ INT=8;

WITH C as(SELECT
top((@t*@-@f*@)/@n+1)ROW_NUMBER()OVER(ORDER BY @)M
FROM sys.messages)SELECT(SELECT
IIF(V%@=0,LEFT(V/@,9),CONCAT(V/MAX(M),'/',ABS(@)/MAX(M)))FROM c
WHERE V%M=0AND @%M=0)FROM(SELECT
@f*@+@n*~-M V FROM c)k

Essayez-le en ligne

t-clausen.dk
la source
Le langage n'est-il pas appelé T-SQL, et non "Sqlserver"?
David Conrad
1
@DavidConrad le langage est TSQL, mais il existe différentes versions de sqlserver et le TSQL pour cela fonctionnera pour sqlserver 2012 à cause du mot clé IIF. Qui utiliserait le mot-clé CASE dans les anciennes versions. Ajouté votre suggestion
t-clausen.dk
Bon travail. Vous pouvez économiser en changeant quelques soit @nou @dà la plaine @. Votre requête CTE pour N pourrait être N AS(SELECT N FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))M(N))ou N AS(SELECT 1N FROM sys.all_views). Étant donné qu'il est presque garanti qu'il y en ait quelques centaines dans cette vue, vous pouvez également réduire les jointures croisées. ISNULLest plus court que COALESCEet devrait fonctionner
MickyT
@MickyT grâce à vos suggestions et quelques-unes des miennes, j'ai réussi à réduire la longueur de 296 octets,
t-clausen.dk
Excellent travail là
MickyT
6

Python 2, 81 octets

from fractions import*
a,b,c=map(Fraction,input())
while a<b:print a;a+=c
print b

Essayez-le en ligne

Mego
la source
5

Haskell, 31 26 octets

f a b c=min[b]$a:f(a+c)b c

Évaluation paresseuse FTW! Démo:

*Main> import Data.Ratio
*Main Data.Ratio> f (-2) 3 (1%2)
[(-2) % 1,(-3) % 2,(-1) % 1,(-1) % 2,0 % 1,1 % 2,1 % 1,3 % 2,2 % 1,5 % 2,3 % 1]
*Main Data.Ratio> f 1 2 (2%3)
[1 % 1,5 % 3,2 % 1]

(J'ai d'abord été tenté par la [a,a+c..b]notation de Haskell , mais elle a quelques bizarreries qui nécessitent quelque chose comme f a b c|l<-[a,a+c..b-c/2]=l++[b|last l<b]41 octets ou f a b c=[x|x<-[a,a+c..],x<b]++[b]33.)

Anders Kaseorg
la source
J'aime votre solution! Cependant, je pense que vous devez également inclure import Data.Ratiodans votre nombre d'octets, je pense que vous ne pouvez pas l'utiliser fsans cela, non?
flawr
2
@flawr: joli cas de bord: vous n'avez pas besoin Data.Ratiode flui-même, car il est polymorphe pour tous les types numériques. Cependant, lorsque vous souhaitez l'appeler avec des valeurs de type Ratio, vous avez besoin de l'importation. Le défi nécessite seulement de "créer du code qui ...", pas de l'utiliser. Je pense que c'est bien sans l'importation.
nimi
1
Plus précisément, il suffit d'importer pour que l' %opérateur crée les fractions de test 1 % 2et 2 % 3. Je ne triche pas ici: vous pouvez vraiment mettre ces 26 octets dans un fichier par eux-mêmes, exécuter l'interpréteur sur ce module et avoir l'interaction que j'affiche. (Vous pourriez même éviter de taper import Data.Ratiodans l'interaction de démonstration, si vous %Data.Ratio.%
épelez
5

MATL , 16 15 octets

3$:3Gvu9X10ZGZD

Cela peut échouer pour les très grands dénominateurs. J'espère que le format de sortie est acceptable.

Essayez-le en ligne!

3$:    % take three inputs and generate range
3G     % push third input again
v      % vertically concatenate. Gives vertical array as output 
u      % get unique elements (i.e. remove the last one if it is repeated)
9X1    % predefined literal 'rat'
0ZG    % set rational format
ZD     % display using that format
Luis Mendo
la source
5

Rubis , 32 54 48 octets

->a,b,c{(a..b).step(c){|x|p x%1>0?x:x.to_i};p b}

Cette solution est basée sur la réponse Python de Mego et suppose que ce csera toujours un Rationalformat de fraction de Ruby. Essayez-le en ligne!

Edit: correction d'un bug où les entiers n'étaient pas présentés comme des entiers. -6 octets grâce à Not That Charles et MegaTom.

Les fonctions sont appelées de cette façon:

> f=->a,b,c{(a..b).step(c){|x|p x%1>0?x:x.to_i};p b}
> f[1,4,Rational(2,3)]
1
(5/3)
(7/3)
3
(11/3)
4
Sherlock9
la source
(3/1) ne devrait pas être simplement 3?
edc65
La Rationalforme la plus simple de 3Ruby est(3/1)
Sherlock9
.step(b,c).mapdevrait réduire le nombre d'octets ici
Pas que Charles
(a==a.to_i)peut être a%1==0de -4 octets.
MegaTom
-2,3,1/2r(exemple 1) imprime le dernier 3deux fois.
Value Ink
3

Julia, 14 octets

f(a,b,c)=a:c:b

Ceci est similaire à la réponse Mathematica, sauf que les plages de Julia sont déjà au format souhaité, donc elles sont encore plus courtes. Renvoie également une collection de nombres. Exemple de sortie:

11-element StepRange{Rational{Int64},Rational{Int64}}:
 -3//1,-5//2,-2//1,-3//2,-1//1,-1//2,0//1,1//2,1//1,3//2,2//1

Notez que les entiers sont affichés avec 1 dans le dénominateur, et une double barre oblique est utilisée pour les fractions. Pour obtenir la sortie exactement telle que définie dans la question, il faut un peu plus de code:

f(a,b,c)=map(x->println(x.num,x.den<2?"":"/$(x.den)"),a:c:b)
Fengyang Wang
la source
3

Matlab avec Symbolic Toolbox / Octave avec SymPy, 27 octets

Merci à @sanchises d'avoir signalé une erreur, maintenant corrigée

@(a,b,c)sym(union(a:c:b,b))

Il s'agit d'une fonction anonyme. Pour l'appeler, affectez-le à une variable ou utilisez ans.

Exemple:

>> @(a,b,c)sym(union(a:c:b,b))
ans = 
    @(a,b,c)sym(union(a:c:b,b))
>> ans(-2,3,1/2)
ans =
[ -2, -3/2, -1, -1/2, 0, 1/2, 1, 3/2, 2, 5/2, 3]
Luis Mendo
la source
Cela n'est pas conforme à la spécification, car la limite supérieure n'est pas toujours incluse (essayez l'exemple 2).
Sanchises
@sanchises Merci! Corrigé maintenant
Luis Mendo
Et aussi, je pense que cvous pouvez utiliser, je cite, le type qui convient à votre langue pour représenter les incréments de fraction [...] ou w / e . Je pense qu'il est assez clair que symbolicc'est un choix logique et autorisé (@VisualBean pourrait vouloir le confirmer). Le résultat de l'opérateur deux-points est ensuite «mis à niveau» vers un symbolictableau, ce qui signifie que vous pouvez vous débarrasser sym()complètement de l' appel.
Sanchises
@sanchises Merci, j'ai demandé des éclaircissements
Luis Mendo
2

Javascript, 108 90 86   81 octets

(a,b,n,d)=>{var s="";for(a=a*d;a<b*d;a+=n)s+=(a%d?a+"/"+d:a/d)+" ";s+=b;return s}

Une fonction anonyme. Après affectation à une variable nommée avec un espace blanc:

var f=(a,b,n,d)=>
{ var s="";
  for(a=a*d; a<b*d; a+=n)
    s+= (a%d ? a + "/" + d : a/d) + " ";
  s+=b;
  return s
}

Exemples de tests:

console.log(f(1,2,1,8)); //writes:
1 9/8 10/8 11/8 12/8 13/8 14/8 15/8 2

console.log(f(-3,3,4,7)); // writes:
-3 -17/7 -13/7 -9/7 -5/7 -1/7 3/7 1 11/7 15/7 19/7 3 

Une approche impérative utilisant javascript, pas de récursivité, bibliothèque ou programmation fonctionnelle.

traktor53
la source
1

Smalltalk - 89 octets

Pour une fois, Smalltalk est presque compétitif!

Number extend[p:e q:i[|h|self to:e by:i do:[:x|h:=x. x printNl].h=e ifFalse:[e printNl]]]

Appelez comme ceci:

> 2 p:5 q:1/2
2
5/2
3
7/2
4
9/2
5

> 1 p:2 q:2/3
1
5/3
2

la source
1

R - 71 octets

Suppose que vous avez déjà installé le MASSpackage

f=function(x,y,z)MASS::fractions(union(seq(x,y,eval(parse(text=z))),y))

> f(1, 2, '1/3')
[1]   1 4/3 5/3   2
> f(2, 5, '1/2')
[1]   2 5/2   3 7/2   4 9/2   5
balle rebondissante
la source
1

Pyret, 56 octets

{(b,e,n,d):link(e,map(_ / d,range(b * d, e * d))).sort()}

Prend le début (b), la fin (e), le numérateur (n) et le dénominateur (d). Crée une plage d'entiers, les divise et ajoute la fin à la liste (en liant puis en triant).

MLavrentyev
la source