Votre tâche aujourd'hui sera de prendre un fichier existant et d'y ajouter des zéros jusqu'à ce qu'il atteigne une certaine taille.
Vous devez écrire un programme ou une fonction qui prend le nom d'un fichier dans le répertoire courant f
et un certain nombre d'octets b
. Tout en conservant le contenu d'origine de f
, vous devez écrire des zéros (octets nuls, pas ascii 0s) à la fin pour que sa nouvelle taille soit en b
octets.
Vous pouvez supposer que le nom f
ne contient que des caractères alphanumériques ascii, que vous disposez de toutes les autorisations sur celui-ci, qu'il n'est pas initialement plus grand que b
, mais peut être aussi grand que b
, et qu'il y a un espace disque libre infini.
Vous ne pouvez pas supposer f
qu'il n'est pas vide ou qu'il ne contient pas déjà des octets nuls.
Les autres fichiers existants ne doivent pas être modifiés et de nouveaux fichiers ne doivent plus exister après la fin de l'exécution.
Cas de test
Contenu de f | b | Contenu résultant de f 12345 | 10 | 1234500000 0 | 3 | 000 [vide] | 2 | 00 [vide] | 0 | [vide] 123 | 3 | 123
la source
b
Réponses:
Bash + coreutils, 13
Entrée depuis la ligne de commande - le premier paramètre est la taille du fichier et le second est le nom du fichier.
De
man truncate
:Essayez-le en ligne .
la source
truncate
appel système échoue.dd bs=1 of=$1 seek=$2<&-
(qui affiche un message d'erreur qui peut être ignoré). Le vôtre est beaucoup plus court. Agréable.Groovy,
54474341 octets-6 grâce à l'idée de manatwork de supprimer la boucle; c'était mon idée originale, je ne sais pas pourquoi je pensais que ça ne marcherait pas et j'ai opté pour une boucle ... Ça marche vraiment, viens de la tester.
Non golfé:
la source
{a,b->c=new File(a);c<<('\0'*(b-c.size()))}
(c=new File(a))
raison des parenthèses requises.APL (Dyalog) ,
3317 octetsEssayez-le en ligne!
la source
∇Extend
?Python 2 ,
595754 octets-5 octets grâce à chepner
la source
\x00
est un octet nul.\0
à la place de\x00
.def g(n,b):f=open(n,'a');f.write('\0'*b);f.truncate(b)
.PHP, 66 octets
Prend l'entrée des arguments de ligne de commande; courir avec
-nr
.Ces 55 octets pourraient, mais ne fonctionneront probablement pas, fonctionner:
la source
Java (Oracle JRE), 55 octets
La spécification de
setLength(int)
dit que les octets ajoutés ne sont pas définis, mais pratiquement Oracle JRE n'ajoute que l'0
octet (c'est pourquoi je l'ai spécifié).La ressource est automatiquement fermée par la JVM, nous n'avons donc pas besoin de le faire nous-mêmes.
Tester
la source
AHK, 48 octets
1
et2
sont les deux premiers paramètres d'un script AHK.FileGetSize
fonctionne en octets par défaut.Ce n'est pas excitant, mais c'est simple: obtenez la taille, soustrayez-la de la taille souhaitée et ajoutez autant de zéros.
la source
Perl 6 , 40 octets
$^a
et$^b
sont les paramètres de la fonction - le nom de fichier et la longueur, respectivement.la source
Python 2 , 68 octets
Essayez-le en ligne! (Lors de l'impression du contenu du fichier, le code remplace les octets nuls par des ASCII 0 pour la visibilité.)
la source
\0
est plus court.PowerShell, 69 octets
$f
pour le fichier,$s
pour la taille de destination, enregistrez sous .ps1 et exécutezC'est un shell, donc il devrait y avoir une très petite boucle ajoutant 1 octet avec
>>
redirection de sortie et ajout, non? Eh bien, non, car>>
ne sort que le codage multi-octets UCS2-LE, donc il n'y a aucun moyen d'ajouter un seul octet à un fichier avec lui .. sauf si vous utilisez PSv5.1 et vous pouvez changer cela, mais cela rend trop long pour être compétitif :Peut-être existe-t-il une approche .Net Framework? Il devrait y en avoir, mais je ne peux pas faire en sorte qu'il écrive des octets ou une erreur. Mais c'est quand même plus long:
la source
Mathematica 50 octets
Importer / Exporter
Usage
la source
q, 29 octets
Fonction qui prend le nom de fichier au format
:/foo/bar.baz
et en longueur sous forme d'entier.Exemple:
la source
C, 56 octets
Le programme trouve la taille du fichier et le nombre d'octets à ajouter. Le fichier ajoute ensuite
fs - b
des octets supplémentaires à la fin.la source
f
etb
, ce qui n'est pas autorisé. Vous devez inclure des E / S dans votre programme, qui peuvent provenir d'uneARGV
entrée de console ou d'arguments d'une fonction.C #, 90 octets
la source