language-agnostic code-golf

language agnostic - Código de golf: módulo de división



language-agnostic code-golf (29)

Reto:

Sin usar el operador de división de módulo ya provisto por su idioma, escriba un programa que tome dos entradas enteras de un usuario y luego muestre el resultado del primer módulo de número dividido por el segundo número. Supongamos que toda la entrada es positiva.

Ejemplo:

Input of first number:2 Input of second number:2 Result:0

Quién gana:

En caso de que no sepa cómo funciona Code Golf, el ganador es la persona que escribe este programa con la menor cantidad de caracteres.


Bash, 21 caracteres

echo $(($1-$1/$2*$2))


C, 226 caracteres

Entrada tardía: decidí ir por el menor número de caracteres , evitando las operaciones aritméticas por completo . En su lugar, uso el sistema de archivos para calcular el resultado:

#include <stdio.h> #define z "%d" #define y(x)x=fopen(#x,"w"); #define g(x)ftell(x) #define i(x)fputs(" ",x); main(a,b){FILE*c,*d;scanf(z z,&a,&b);y(c)y(d)while(g(c)!=a){i(c)i(d)if(g(d)==b)fseek(d,0,0);}printf(z,g(d));}


C: 52

main(a,b){scanf("%d%d",&a,&b);printf("%d",a-a/b*b);}


CSS: 107 caracteres :)

CSS (ungolfed):

li { counter-increment: a; } li:after { content: counter(a); } li:nth-child(3n) { /* replace 3 with 2nd input ("b" in "a % b") */ counter-reset: a; counter-increment: none; }

HTML adjunto: <ol> <li></li> <li></li> <li></li> <!-- etc. --> </ol>

Salida:

Salida http://img155.imageshack.us/img155/4643/modd.png

Esto no funciona en IE (¡sorpresa sorpresa!).


Esquema: 38

(define(m a b)(- a(*(quotient a b)b)))


F #, 268 caracteres

¿Gané?

printf "Input of first number:" let x = stdin.ReadLine() |> int printf "Input of second number:" let y = stdin.ReadLine() |> int let mutable z = x while z >= 0 do z <- z - y // whoops, overshot z <- z + y // I''m not drunk, really printfn "Result:%d" z


Golfscript, 6 7 13 caracteres:

2*~/*-

Uso (única forma de ingresar en golfscript):

echo 14 3 | ruby golfscript.rb modulo.gs 2

Explicación:

2*~ #double the input string and eval (so now 14 3 14 3 are on the stack) / #int divide 14 / 3, gives quotient *- #multiply that result by 3, subtract from 14, gives remainder


Haskell, 30 caracteres

m a b=a-last((a-b):[b,2*b..a])

Este es mi primer código de golf, no dudes en comentar sobre el código y publicar mejoras. ;-)

Sé que no ganaré, pero solo quería compartir mi solución utilizando listas.


Java. Solo por diversión

Suponiendo que s[0] s[1] son ints . No estoy seguro de que esto valga nada, pero fue un poco de diversión.

Tenga en cuenta que esto no sufrirá el efecto de bucle (números grandes) sino que solo funcionará en números enteros. Además, esta solución es igual de rápida, no importa cuán grandes sean los números. Un gran porcentaje de las respuestas proporcionadas generará una gran pila recursiva o tomará un tiempo infinitamente largo si se da un gran número y un pequeño divisor.

public class M { public static void main(String [] s) { int a = Integer.parseInt(s[0]); int b = Integer.parseInt(s[1]); System.out.println(a-a/b*b); } }


Java: 127 caracteres

import java.util.*;enum M{M;M(){Scanner s=new Scanner(System.in);int a=s.nextInt(),b=s.nextInt();System.out.println(a-a/b*b);}}

Tenga en cuenta que el programa funciona, pero también lanza

Exception in thread "main" java.lang.NoSuchMethodError: main

después de que se ingresan las entradas y después de que se emite la salida.


Respuesta, 5 caracteres

2?/*-

Ejecutar utilizando:

RePeNt mod.rpn 17 3 RePeNt "2?/*-" 17 3

RePeNt es un lenguaje de juguete basado en la pila que hice yo mismo cuando cada operador / comando / bucle se ingresa en Notación Polaca Inversa (RPN). Liberaré al intérprete cuando lo haya ordenado un poco.

Command Explanation Stack ------- ----------- ----- n/a The program takes 2 parameters ( 17 3 ) and pushes them 17 3 onto the stack 2 Pushes a 2 onto the stack 17 3 2 ? Pops a number (x) off the stack + copies the last x 17 3 17 3 stack items onto the stack / Divides on stack 17 3 5 * Multiplies on stack 17 15 - Subtracts on stack 2


Unefunge-98: 14 13 22 caracteres

&:7p&:'' //*-.@

Unefunge es la instancia unidimensional de Funge-98: http://quadium.net/funge/spec98.html

Explicación (Comando <- Explicación [Pila]):

& <- Get integer input of value A and store on stack. [A] : <- Duplicate top of stack. [A A] 7 <- Push 7 on stack. Used for the `p` command. [A A 7] p <- Pop top two values (7 then A). Place the character whose ASCII value is A at position 7 in the code (where the space is). [A] & <- Get integer input of value B and store on stack. [A B] : <- Duplicate top of stack. [A B B] '' <- Jump over next character and grap the ASCII value of the jumped character. [A B B A] <- Because of the `p` command, this is actually the character whose ASCII value is A at this point in the code. This was jumped over by the previous instruction. / <- Swap top two values of stack. [A B A B] / <- Pop top two values (B then A). Push (A/B) (integer division) onto stack. [A B (A/B)] * <- Pop top two values ((A/B) then B). Push (B*(A/B)) onto stack. [A (B*(A/B))] - <- Pop top two values ((B*(A/B)) then A). Push (A-(B*(A/B))) onto stack. [(A-(B*(A/B)))] . <- Pop top value and print it as an integer. [] @ <- Exit program.

El código probado está incompleto (pero lo suficientemente completo) El intérprete de Unefunge-98 que escribí para probar el código:

module Unefunge where import Prelude hiding (subtract) import qualified Data.Map as Map import Control.Exception (handle) import Control.Monad import Data.Char (chr, ord) import Data.Map (Map) import System.Environment (getArgs) import System.Exit (exitSuccess, exitFailure, ExitCode (..)) import System.IO (hSetBuffering, BufferMode (..), stdin, stdout) ----------------------------------------------------------- iterateM :: (Monad m) => (a -> m a) -> m a -> m b iterateM f m = m >>= iterateM f . f ----------------------------------------------------------- data Cell = Integer Integer | Char Char ----------------------------------------------------------- newtype Stack = Stack [Integer] mkStack = Stack [] push :: Integer -> Stack -> Stack push x (Stack xs) = Stack (x : xs) pop :: Stack -> Stack pop (Stack xs) = case xs of [] -> Stack [] _:ys -> Stack ys top :: Stack -> Integer top (Stack xs) = case xs of [] -> 0 y:_ -> y ----------------------------------------------------------- data Env = Env { cells :: Map Integer Cell , position :: Integer , stack :: Stack } withStack :: (Stack -> Stack) -> Env -> Env withStack f env = env { stack = f $ stack env } pushStack :: Integer -> Env -> Env pushStack x = withStack $ push x popStack :: Env -> Env popStack = withStack pop topStack :: Env -> Integer topStack = top . stack ----------------------------------------------------------- type Instruction = Env -> IO Env cellAt :: Integer -> Env -> Cell cellAt n = Map.findWithDefault (Char '' '') n . cells currentCell :: Env -> Cell currentCell env = cellAt (position env) env lookupInstruction :: Cell -> Instruction lookupInstruction cell = case cell of Integer n -> pushInteger n Char c -> case c of ''/'''-> fetch ''//'-> swap ''0'' -> pushInteger 0 ''1'' -> pushInteger 1 ''2'' -> pushInteger 2 ''3'' -> pushInteger 3 ''4'' -> pushInteger 4 ''5'' -> pushInteger 5 ''6'' -> pushInteger 6 ''7'' -> pushInteger 7 ''8'' -> pushInteger 8 ''9'' -> pushInteger 9 '' '' -> nop ''+'' -> add ''-'' -> subtract ''*'' -> multiply ''/'' -> divide ''#'' -> trampoline ''&'' -> inputDecimal ''.'' -> outputDecimal '':'' -> duplicate ''p'' -> put ''@'' -> stop instructionAt :: Integer -> Env -> Instruction instructionAt n = lookupInstruction . cellAt n currentInstruction :: Env -> Instruction currentInstruction = lookupInstruction . currentCell runCurrentInstruction :: Instruction runCurrentInstruction env = currentInstruction env env nop :: Instruction nop = return swap :: Instruction swap env = return $ pushStack a $ pushStack b $ popStack $ popStack env where b = topStack env a = topStack $ popStack env inputDecimal :: Instruction inputDecimal env = readLn >>= return . flip pushStack env outputDecimal :: Instruction outputDecimal env = putStr (show n ++ " ") >> return (popStack env) where n = topStack env duplicate :: Instruction duplicate env = return $ pushStack (topStack env) env pushInteger :: Integer -> Instruction pushInteger n = return . pushStack n put :: Instruction put env = return env'' { cells = Map.insert loc c $ cells env''} where loc = topStack env n = topStack $ popStack env env'' = popStack $ popStack env c = Char . chr . fromIntegral $ n trampoline :: Instruction trampoline env = return env { position = position env + 1 } fetch :: Instruction fetch = trampoline >=> /env -> let cell = currentCell env val = case cell of Char c -> fromIntegral $ ord c Integer n -> n in pushInteger val env binOp :: (Integer -> Integer -> Integer) -> Instruction binOp op env = return $ pushStack (a `op` b) $ popStack $ popStack env where b = topStack env a = topStack $ popStack env add :: Instruction add = binOp (+) subtract :: Instruction subtract = binOp (-) multiply :: Instruction multiply = binOp (*) divide :: Instruction divide = binOp div stop :: Instruction stop = const exitSuccess tick :: Instruction tick = trampoline ----------------------------------------------------------- buildCells :: String -> Map Integer Cell buildCells = Map.fromList . zip [0..] . map Char . concat . eols eols :: String -> [String] eols "" = [] eols str = left : case right of "" -> [] ''/r'':''/n'':rest -> eols rest _:rest -> eols rest where (left, right) = break (`elem` "/r/n") str data Args = Args { sourceFileName :: String } processArgs :: IO Args processArgs = do args <- getArgs case args of [] -> do putStrLn "No source file! Exiting." exitFailure fileName:_ -> return $ Args { sourceFileName = fileName } runUnefunge :: Env -> IO ExitCode runUnefunge = iterateM round . return where round = runCurrentInstruction >=> tick main :: IO () main = do args <- processArgs contents <- readFile $ sourceFileName args let env = Env { cells = buildCells contents , position = 0 , stack = mkStack } mapM_ (`hSetBuffering` NoBuffering) [stdin, stdout] handle return $ runUnefunge env return ()


Clojure: 30 caracteres

#(if(>%2%1)%1(recur(-%1%2)%2)))


DC: 7 caracteres (quizás 5;)

??37axp

Utilizado de la siguiente manera:

echo "X/nY" | dc -e "??37axp"

[Y, haciendo referencia a otros ejemplos anteriores, si se permite insertar entradas en el código, puede tener 5 caracteres:

37axp

como en:

dc -e "17 3 37axp"

Solo pensé que vale la pena mencionar]


DC: 8 caracteres

odO/O*-p

$ echo ''17 3 odO/O*-p'' | dc 2


J, 10 caracteres

([-]*<.@%)

Uso:

10 ([-]*<.@%) 3 1

J, 17 caracteres (con entrada como lista)

({.-{:*[:<.{.%{:)

Uso:

({.-{:*[:<.{.%{:) 10 3 1 ({.-{:*[:<.{.%{:) 225 13 4

Explicación:

Tomé un tótem y lo convertí en una sonrisa, y funcionó.


JavaScript, 11 caracteres

a-b*(0|a/b)

Se asume que los enteros de entrada están contenidos en las variables a y b :

a = 2; b = 2; alert(a-b*(0|a/b)); // => 0


PHP, 49 caracteres

Suponiendo que la cadena de consulta ingresa en forma de script.php?a=27&b=7 y las etiquetas cortas están activadas:

<?echo($a=$_GET[''a''])-(int)($a/$b=$_GET[''b''])*$b;

(Eso podría reducirse en cuatro sacando las comillas simples, pero eso arrojaría avisos).

Con el vile register_globals activado, puedes reducirlo a 25 caracteres :

<?echo $a-(int)($a/$b)*b;


Perl, 33 caracteres

La lectura de las entradas probablemente podría acortarse aún más.

($a,$b)=@ARGV;print$a-$b*int$a/$b

Uso

$ perl -e "($a,$b)=@ARGV;print$a-$b*int$a/$b" 2457 766 159


Python: 25 caracteres

Se comporta con números negativos, idénticamente al operador de módulo. Toma dos números separados por comas.

x,y=input() print x-x/y*y


Ruby (32):

p(a=gets.to_i)-a/(b=gets.to_i)*b


Ruby: 36 caracteres

a,b=gets.split.map(&:to_i);p a-a/b*b


Rebmu : 10 caracteres (sin E / S) y 15 caracteres (con E / S)

Si no se requiere E / S como parte de la fuente del programa y está dispuesto a pasar los argumentos con nombre, entonces podemos obtener 10 caracteres:

>> rebmu/args [sbJmpDVjKk] [j: 20 k: 7] == 6

Si se requiere E / S entonces eso lo lleva a 15:

>> rebmu [rJrKwSBjMPdvJkK] Input Integer: 42 Input Integer: 13 3

Pero usar la multiplicación y división no es tan interesante (o ineficiente) como esta solución de 17 caracteres:

rJrKwWGEjK[JsbJk]

Que bajo el capó se convierte en el equivalente:

r j r k w wge j k [j: sb j k]

Documentado

r j ; read j from user r k ; read k from user ; write out the result of... w ( ; while j is greater than or equal to k wge j k [ ; assign to j the result of subtracting k from j j: sb j k ] ; when a while loop exits the expression of the while will have the ; value of the last calculation inside the loop body. In this case, ; that last calculation was an assignment to j, and will have the ; value of j )


Claro que no ganaré, pero aquí va nada:

<?php $a=readline("#1:"); $b=readline("#2:"); while($b<=$a)$a-=$b; echo "Result: $a";


Common Lisp, 170 caracteres (incluyendo sangría):

(defun mod-divide() (flet((g(p)(format t"Input of ~a number:"p)(read))) (let*((a(g"first"))(b(g"second"))) (format t "Result:~d~%"(- a(* b(truncate a b)))))))

Versión antigua (187 caracteres):

(defun mod-divide() (flet((g(p)(format t"Input of ~a number:"p)(read))) (let*((a(g"first"))(b(g"second"))) (multiple-value-bind(a b)(truncate a b)(format t "Result:~d~%"b)))))


En rubí con 38 caracteres.
p (a=gets.to_i)-((b=gets.to_i)*(a/b))
No es un ganador :(


Java, 110 caracteres

class C{public static void main(String[]a){Long x=new Long(a[0]),y=x.decode(a[1]);System.out.print(x-x/y*y);}}


Sé que ya hay dos respuestas de Ruby, pero ¿por qué no? obtener la entrada de esta manera es un enfoque lo suficientemente diferente como para eliminar algunos caracteres.

Ruby 1.8.7+, 29 caracteres

a,n=*$*.map(&:to_i);p a-a*n/n

$ ruby a.rb 10 3 1


Perl 25 personajes

<>=~/ /;say$`-$''*int$`/$''

uso:

echo 15 6 | perl modulo.pl 3